); } export default ChatInput; ``` *** ## Notes & tips [Section titled “Notes & tips”](#notes--tips) * **Debounce API calls**: prevent sending multiple concurrent requests if the user clicks fast. * **Limit message count**: sending too many messages in one summarization will slow down responses and increase cost. * **Cache summaries**: reuse them unless new messages arrive. * **Respect privacy**: don’t send private or sensitive content to external APIs.
# Authentication and Users
> Simplify user authentication in your Web app with our definitive API guide. Fortify your app's defenses and protect user data effectively.
Every user has to authenticate with ConnectyCube before using any ConnectyCube functionality. When someone connects with an application using ConnectyCube, the application will need to obtain a session token which provides temporary, secure access to ConnectyCube APIs. A session token is an opaque string that identifies a user and an application. ## Create session token [Section titled “Create session token”](#create-session-token) As a starting point, the user’s session token needs to be created allowing user any further actions within the app. Pass login/email and password to identify a user: ```javascript const userCredentials = { login: "cubeuser", password: "awesomepwd" }; ConnectyCube.createSession(userCredentials) .then((session) => {}) .catch((error) => {}); ``` **Note:** With the request above, **the user is created automatically on the fly upon session creation** using the login (or email) and password from the request parameters. **Important:** For better security it is recommended to deny the session creation without an existing user.\ For this, set ‘Session creation without an existing user entity’ to **Deny** under the **Application -> Overview -> Permissions** in the [admin panel](https://admin.connectycube.com/apps). ### Authentication via phone number [Section titled “Authentication via phone number”](#authentication-via-phone-number) Sign In with phone number is supported with ([Firebase integration](https://firebase.google.com/docs/auth/web/phone-auth)). You need to create Firebase `project_id` and obtain Firebase `access_token` after SMS code verification, then pass these parameters to `login` method: ```javascript const userCredentials = { provider: "firebase_phone", "firebase_phone[project_id]": "...", "firebase_phone[access_token]": "...", }; ConnectyCube.createSession(userCredentials) .then((user) => {}) .catch((error) => {}); ``` > **Note** > > In order to login via phone number you need to create a session token first. ### Authentication via Firebase email [Section titled “Authentication via Firebase email”](#authentication-via-firebase-email) Sign In with email is supported with ([Firebase integration](https://firebase.google.com/docs/auth/web/password-auth)). You need to create Firebase `project_id` and obtain Firebase `access_token` after email/password verification, then pass these parameters to `login` method: ```javascript const userCredentials = { provider: "firebase_email", firebase_email: { project_id: "XXXXXXXXXXX", access_token: "XXXXXXXXXXXYYYYYY", }, }; ConnectyCube.createSession(userCredentials) .then((user) => {}) .catch((error) => {}); ``` > **Note** > > In order to login via email you need to create a session token first. ### Authentication via external identity provider [Section titled “Authentication via external identity provider”](#authentication-via-external-identity-provider) **Custom Identity Provider (CIdP)** feature is necessary if you have your own user database and want to authenticate users in ConnectyCube against it. It works the same way as Facebook/Twitter SSO. With Custom Identity Provider feature you can continue use your user database instead of storing/copying user data to ConnectyCube database. #### CIdP high level integration flow [Section titled “CIdP high level integration flow”](#cidp-high-level-integration-flow) To get started with **CIdP** integration, check the [Custom Identity Provider guide](/guides/custom-identity-provider) which describes high level integration flow. #### How to login via CIdP [Section titled “How to login via CIdP”](#how-to-login-via-cidp) Once you done with the setup mapping in ConnectyCube Dashboard, it’s time to verify the integration. To perform CIdP login, the same ConnectyCube [User Login API](/js/authentication-and-users/#upgrade-session-token-user-login) is used. You just use existing login request params to pass your external user token: ```javascript const userCredentials = { login: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTIzNDU2Nzg5LCJuYW1lIjoiSm9zZXBoIn0.OpOSSw7e485LOP5PrzScxHb7SR6sAOMRckfFwi4rp7o" }; ConnectyCube.createSession(userCredentials) .then((user) => {}) .catch((error) => {}); ``` Once the login is successful, ConnectyCube will create an underalying User entity, so then you can use ConnectyCube APIs in a same way as you do with a normal login. With CIdP we do not have/store any user password in ConnectyCube User entity. Following further integration, you may need to connect to Chat. In a case of CIdP login, you do not have a user password. In such cases you should use ConnectyCube session token as a password for chat connection. [Follow the Connect to Chat with CIdP guide](/js/messaging/#connect-to-chat-using-custom-authentication-providers). ### Create guest session [Section titled “Create guest session”](#create-guest-session) To create a session with guest user use the following code: ```javascript const guestUserCredentials = { guest: "1", full_name: "Awesome Smith" }; ConnectyCube.createSession(guestUserCredentials) .then((session) => {}) .catch((error) => {}); ``` ## Session expiration [Section titled “Session expiration”](#session-expiration) Expiration time for session token is 2 hours after last request to API. If you perform query with expired token, you will receive the error **Required session does not exist**. In this case you need to recreate a session token. There is a special callback function to handle this case: ```javascript const CONFIG = { on: { sessionExpired: (handleResponse, retry) => { // call handleResponse() if you do not want to process a session expiration, // so an error will be returned to origin request // handleResponse(); ConnectyCube.createSession() .then(retry) .catch((error) => {}); }, }, }; ConnectyCube.init(CREDENTIALS, CONFIG); ``` ## Destroy session token [Section titled “Destroy session token”](#destroy-session-token) To destroy a session use the following code: ```javascript ConnectyCube.destroySession().catch((error) => {}); ``` ## User signup [Section titled “User signup”](#user-signup) Only login (or email) + password are required for user to be created. All other parameters are optional: ```javascript const userProfile = { login: "marvin18", password: "supersecurepwd", email: "awesomeman@gmail.com", full_name: "Marvin Simon", phone: "47802323143", website: "https://dozensofdreams.com", tag_list: ["iphone", "apple"], custom_data: JSON.stringify({ middle_name: "Bartoleo" }), }; ConnectyCube.users .signup(userProfile) .then((user) => {}) .catch((error) => {}); ``` ## User profile update [Section titled “User profile update”](#user-profile-update) ```javascript const updatedUserProfile = { login: "marvin18sim", full_name: "Mar Sim", }; ConnectyCube.users .update(updatedUserProfile) .then((user) => {}) .catch((error) => {}); ``` If you want to change your password, you need to provide 2 parameters: `password` and `old_password`. Updated `user` entity will be returned. ## User avatar [Section titled “User avatar”](#user-avatar) You can set a user’s avatar. You just need to upload it to the ConnectyCube cloud storage and then connect to user. ```javascript // for example, a file from HTML form input field const inputFile = $("input[type=file]")[0].files[0]; const fileParams = { name: inputFile.name, file: inputFile, type: inputFile.type, size: inputFile.size, public: false, }; const updateUser = (uploadedFile) => { const updatedUserProfile = { avatar: uploadedFile.uid }; return ConnectyCube.users.update(updatedUserProfile); }; ConnectyCube.storage .createAndUpload(fileParams) .then(updateUser) .then((updatedUser) => {}) .catch((error) => {}); ``` Now, other users can get you avatar: ```javascript const avatarUID = updatedUser.avatar; const avatarURL = ConnectyCube.storage.privateUrl(avatarUID); const avatarHTML = "