--- name: auth-web-cloudbase description: CloudBase Web Authentication Quick Guide - Provides concise and practical Web frontend authentication solutions with multiple login methods and complete user management. alwaysApply: false --- ## Overview **Prerequisites**: CloudBase environment ID (`env`) **Prerequisites**: CloudBase environment Region (`region`) --- ## Core Capabilities **Use Case**: Web frontend projects using `@cloudbase/js-sdk@2.24.0+` for user authentication **Key Benefits**: Compatible with `supabase-js` API, supports phone, email, anonymous, username/password, and third-party login methods **`@cloudbase/js-sdk` cdn source**: `https://static.cloudbase.net/cloudbase-js-sdk/latest/cloudbase.full.js` ## Prerequisites - Automatically use `auth-tool-cloudbase` to get `publishable key` and configure login methods. - If `auth-tool-cloudbase` failed, let user go to `https://tcb.cloud.tencent.com/dev?envId={env}#/env/apikey` to get `publishable key` and `https://tcb.cloud.tencent.com/dev?envId={env}#/identity/login-manage` to set up login methods ## Quick Start ```js import cloudbase from '@cloudbase/js-sdk' const app = cloudbase.init({ env: `env`, // CloudBase environment ID region: `region`, // CloudBase environment Region, default 'ap-shanghai' accessKey: 'publishable key', // required, get from auth-tool-cloudbase auth: { detectSessionInUrl: true }, // required }) const auth = app.auth `` --- ## Login Methods **1. Phone OTP (Recommended)** - Automatically use `auth-tool-cloudbase` turn on `SMS Login` ```js const { data, error } = await auth.signInWithOtp({ phone: '13800138000' }) const { data: loginData, error: loginError } = await data.verifyOtp({ token:'123456' }) ``` **2. Email OTP** - Automatically use `auth-tool-cloudbase` turn on `Email Login` ```js const { data, error } = await auth.signInWithOtp({ email: 'user@example.com' }) const { data: loginData, error: loginError } = await data.verifyOtp({ token: '654321' }) ``` **3. Password** ```js const { data, error } = await auth.signInWithPassword({ username: 'test_user', password: 'pass123' }) const { data, error } = await auth.signInWithPassword({ email: 'user@example.com', password: 'pass123' }) const { data, error } = await auth.signInWithPassword({ phone: '13800138000', password: 'pass123' }) ``` **4. Registration (Smart: auto-login if exists)** - Only support email and phone otp registration - Automatically use `auth-tool-cloudbase` turn on `Email Login` or `SMS Login` ```js // Email Otp const { data, error } = await auth.signUp({ email: 'new@example.com', nickname: 'User' }) const { data: loginData, error: loginError } = await data.verifyOtp({ token: '123456' }) // Phone Otp const { data, error } = await auth.signUp({ phone: '13800138000', nickname: 'User' }) const { data: loginData, error: loginError } = await data.verifyOtp({ token: '123456' }) ``` **5. Anonymous** - Automatically use `auth-tool-cloudbase` turn on `Anonymous Login` ```js const { data, error } = await auth.signInAnonymously() ``` **6. OAuth (Google/WeChat)** - Automatically use `auth-tool-cloudbase` turn on `Google Login` or `WeChat Login` ```js const { data, error } = await auth.signInWithOAuth({ provider: 'google' }) window.location.href = data.url // Auto-complete after callback ``` **7. Custom Ticket** ```js await auth.signInWithCustomTicket(async () => { const res = await fetch('/api/ticket') return (await res.json()).ticket }) ``` **8. Upgrade Anonymous** ```js const { data, error } = await auth.getSession() const { data: signUpData, error: signUpError} = await auth.signUp({ phone: '13800000000', anonymous_token: data.session.access_token, }) await signUpData.verifyOtp({ token: '123456' }) ``` --- ## User Management ```js // Sign out const { data, error } = await auth.signOut() // Get user const { data, error } = await auth.getUser() console.log(data.user.email, data.user.phone, data.user.user_metadata?.nickName) // Update user (except email, phone) const { data, error } = await auth.updateUser({ nickname: 'New Name', gender: 'MALE', avatar_url: 'url' }) // Update user (email or phone) const { data, error } = await auth.updateUser({ email: 'new@example.com' }) const { data, error } = await data.verifyOtp({ email: "new@example.com", token: "123456" }); // Change password (logged in) const { data, error } = await auth.resetPasswordForOld({ old_password: 'old', new_password: 'new' }) // Reset password (forgot) const { data, error } = await auth.reauthenticate() const { data, error } = await data.updateUser({ nonce: '123456', password: 'new' }) // Link third-party const { data, error } = await auth.linkIdentity({ provider: 'google' }) // View/Unlink identities const { data, error } = await auth.getUserIdentities() const { data, error } = await auth.unlinkIdentity({ provider: data.identities[0].id }) // Delete account const { data, error } = await auth.deleteMe({ password: 'current' }) // Listen to state changes const { data, error } = auth.onAuthStateChange((event, session, info) => { // INITIAL_SESSION, SIGNED_IN, SIGNED_OUT, TOKEN_REFRESHED, USER_UPDATED, PASSWORD_RECOVERY, BIND_IDENTITY }) // Get access token const { data, error } = const { data, error } = await auth.getSession() fetch('/api/protected', { headers: { Authorization: `Bearer ${data.session?.access_token}` } }) // Refresh user const { data, error } = await auth.refreshUser() ``` --- ## User Type ```ts declare type User = { id: any aud: string role: string[] email: any email_confirmed_at: string phone: any phone_confirmed_at: string confirmed_at: string last_sign_in_at: string app_metadata: { provider: any providers: any[] } user_metadata: { name: any picture: any username: any gender: any locale: any uid: any nickName: any avatarUrl: any location: any hasPassword: any } identities: any created_at: string updated_at: string is_anonymous: boolean } ``` --- ## Complete Example ```js class PhoneLoginPage { async sendCode() { const phone = document.getElementById('phone').value if (!/^1[3-9]\d{9}$/.test(phone)) return alert('Invalid phone') const { data, error } = await auth.signInWithOtp({ phone }) if (error) return alert('Send failed: ' + error.message) this.verifyFunction = data.verify document.getElementById('codeSection').style.display = 'block' this.startCountdown(60) } async verifyCode() { const code = document.getElementById('code').value if (!code) return alert('Enter code') const { data, error } = await this.verifyFunction(code) if (error) return alert('Verification failed: ' + error.message) console.log('Login successful:', data.user) window.location.href = '/dashboard' } startCountdown(seconds) { let countdown = seconds const btn = document.getElementById('resendBtn') btn.disabled = true const timer = setInterval(() => { countdown-- btn.innerText = `Resend in ${countdown}s` if (countdown <= 0) { clearInterval(timer) btn.disabled = false btn.innerText = 'Resend' } }, 1000) } } ``` --- ## WeChat Mini Program ```js // Silent login with OpenID const { data, error } = await auth.signInWithOpenId() // WeChat Cloud mode (default) const { data, error } = await auth.signInWithOpenId({ useWxCloud: false }) // HTTP mode // Phone authorization login const { data, error } = await auth.signInWithPhoneAuth({ phoneCode: 'xxx' }) ``` ---