概述
Auth Api 提供了一套完整的认证相关功能,支持多种登录方式、用户管理和会话管理。Auth Api 按照功能用途分为 7 个类别。每个类别包含相关的 API 方法,方便开发者根据具体需求快速找到合适的接口。
提示
v3 版本在调用身份认证相关 API 时,使用的是 身份认证 HTTP API 的开放能力。
- 认证登录:用户注册和登录相关的 API 方法,支持多种登录方式。
- 会话管理:管理用户会话状态和令牌的 API 方法。
- 用户管理:获取、更新和管理用户信息的 API 方法。
- 身份源管理:管理第三方身份源绑定和解绑的 API 方法。
- 密码管理:密码重置和修改相关的 API 方法。
- 验证管理:验证码发送、验证和重发相关的 API 方法。
- 其他工具:其他辅助功能的 API 方法。
基础使用示例
- 初始化配置
- 登录状态检查
- 用户注册流程
- 用户登出
- 密码登录
- 认证状态监听
- 手机验证码登录
Publishable Key 可前往 云开发平台/API Key 配置 中生成
auth.detectSessionInUrl 为初始化可选参数,设置后可以自动检测 URL 中的 OAuth 参数(code、state),适用于signInWithOAuth、linkIdentity等使用场景
import cloudbase from "@cloudbase/js-sdk";
// 初始化
const app = cloudbase.init({
env: "your-env-id", // 替换为您的环境ID
region: "ap-shanghai", // 地域,默认为上海
accessKey: "", // 填入生成的 Publishable Key,
auth: {
detectSessionInUrl: true, // 可选:自动检测 URL 中的 OAuth 参数,适用于signInWithOAuth、linkIdentity
},
});
const auth = app.auth;
// 检查登录状态
async function checkAuthStatus() {
const { data, error } = await auth.getSession();
if (error) {
console.error("检查登录状态失败:", error.message);
return false;
}
if (data.session) {
console.log("用户已登录:", data.session.user);
return true;
} else {
console.log("用户未登录");
return false;
}
}
// 用户注册示例(四步验证流程)
async function registerUser(email, password, verificationCode) {
// 第一步:发送验证码
const { data, error } = await auth.signUp({
email: email,
password: password,
});
if (error) {
console.error("发送验证码失败:", error.message);
return false;
} else {
console.log("验证码已发送,等待验证...");
// 第二步:验证验证码并完成注册
const { data: loginData, error: loginError } = await data.verifyOtp({
token: verificationCode,
});
if (loginError) {
console.error("验证失败:", loginError.message);
return false;
} else {
console.log("注册成功:", loginData.user?.email);
return true;
}
}
}
// 用户登出示例
async function logoutUser() {
const { data, error } = await auth.signOut();
if (error) {
console.error("登出失败:", error.message);
return false;
} else {
console.log("登出成功,会话已清除");
return true;
}
}
// 密码登录示例
async function loginWithPassword(email, password) {
const { data, error } = await auth.signInWithPassword({
email: email,
password: password,
});
if (error) {
console.error("登录失败:", error.message);
return false;
} else {
console.log("登录成功:", data.user?.email);
return true;
}
}
// 监听认证状态变化
auth.onAuthStateChange((event, session, info) => {
console.log("认证状态变化:", event);
switch (event) {
case "INITIAL_SESSION":
console.log("初始会话已建立");
if (session) {
console.log("用户已登录:", session.user);
} else {
console.log("用户未登录");
}
break;
case "SIGNED_IN":
console.log("用户登录成功:", session.user);
break;
case "SIGNED_OUT":
console.log("用户已登出");
break;
case "PASSWORD_RECOVERY":
console.log("密码已重置");
break;
case "TOKEN_REFRESHED":
console.log("令牌已刷新");
break;
case "USER_UPDATED":
console.log("用户信息已更新");
break;
case "BIND_IDENTITY":
console.log("身份源绑定结果");
break;
}
});
// 完整的手机验证码登录页面实现
class PhoneLoginPage {
constructor() {
this.setupEventListeners();
}
// 设置事件监听
setupEventListeners() {
document.getElementById("sendCodeBtn").addEventListener("click", (e) => {
e.preventDefault();
this.sendVerificationCode();
});
document.getElementById("verifyCodeBtn").addEventListener("click", (e) => {
e.preventDefault();
this.verifyCodeAndLogin();
});
}
// 发送验证码
async sendVerificationCode() {
const phone = document.getElementById("phone").value;
if (!phone) {
alert("请输入手机号码");
return;
}
// 验证手机号格式
if (!this.validatePhone(phone)) {
alert("请输入正确的手机号码格式");
return;
}
// 显示加载状态
this.showLoading(true);
this.hideError();
try {
const { data, error } = await auth.signInWithOtp({
phone: phone,
});
if (error) {
this.handleSendCodeError(error);
} else {
this.handleSendCodeSuccess(data);
}
} catch (error) {
this.handleNetworkError(error);
} finally {
this.showLoading(false);
}
}
// 验证验证码并登录
async verifyCodeAndLogin() {
const code = document.getElementById("code").value;
if (!code) {
alert("请输入验证码");
return;
}
if (!this.verifyFunction) {
alert("请先发送验证码");
return;
}
this.showLoading(true);
this.hideError();
try {
const { data, error } = await this.verifyFunction({ token: code });
if (error) {
this.handleVerifyError(error);
} else {
this.handleLoginSuccess(data);
}
} catch (error) {
this.handleNetworkError(error);
} finally {
this.showLoading(false);
}
}
// 手机号格式验证
validatePhone(phone) {
const phoneRegex = /^1[3-9]\d{9}$/;
return phoneRegex.test(phone);
}
// 处理发送验证码成功
handleSendCodeSuccess(data) {
this.verifyFunction = data.verifyOtp;
// 显示验证码输入区域
document.getElementById("verificationSection").style.display = "block";
document.getElementById("phoneSection").style.display = "none";
// 开始倒计时
this.startCountdown(60);
document.getElementById("success").innerText =
"验证码已发送到您的手机,请注意查收";
document.getElementById("success").style.display = "block";
}
// 处理发送验证码错误
handleSendCodeError(error) {
switch (error.code) {
case "invalid_phone":
document.getElementById("error").innerText =
"手机号格式错误,请检查后重试";
break;
case "user_not_found":
document.getElementById("error").innerText =
"该手机号未注册,请先注册或使用其他手机号";
break;
case "resource_exhausted":
document.getElementById("error").innerText = "发送频率过高,请稍后再试";
break;
case "unreachable":
document.getElementById("error").innerText =
"网络连接失败,请检查网络设置";
break;
default:
document.getElementById("error").innerText =
"发送验证码失败: " + error.message;
}
document.getElementById("error").style.display = "block";
}
// 处理验证错误
handleVerifyError(error) {
switch (error.code) {
case "invalid_code":
document.getElementById("error").innerText = "验证码错误,请重新输入";
break;
case "code_expired":
document.getElementById("error").innerText = "验证码已过期,请重新获取";
// 显示重新发送按钮
document.getElementById("resendBtn").style.display = "block";
break;
case "max_attempts_exceeded":
document.getElementById("error").innerText = "验证次数过多,请稍后重试";
break;
default:
document.getElementById("error").innerText =
"验证失败: " + error.message;
}
document.getElementById("error").style.display = "block";
}
// 处理登录成功
handleLoginSuccess(data) {
document.getElementById("success").innerText = "登录成功!欢迎回来";
document.getElementById("success").style.display = "block";
console.log("用户信息:", data.user);
console.log("会话信息:", data.session);
// 延迟跳转到首页
setTimeout(() => {
window.location.href = "/dashboard";
}, 2000);
}
// 处理网络错误
handleNetworkError(error) {
document.getElementById("error").innerText =
"网络错误,请检查网络连接后重试";
document.getElementById("error").style.display = "block";
console.error("网络错误:", error);
}
// 显示/隐藏加载状态
showLoading(show) {
document.getElementById("loading").style.display = show ? "block" : "none";
document.getElementById("sendCodeBtn").disabled = show;
document.getElementById("verifyCodeBtn").disabled = show;
}
// 隐藏错误信息
hideError() {
document.getElementById("error").style.display = "none";
}
// 开始倒计时
startCountdown(seconds) {
let countdown = seconds;
const btn = document.getElementById("resendBtn");
const originalText = btn.innerText;
btn.disabled = true;
const timer = setInterval(() => {
countdown--;
btn.innerText = `${countdown}秒后可重发`;
if (countdown <= 0) {
clearInterval(timer);
btn.disabled = false;
btn.innerText = originalText;
}
}, 1000);
}
}
// 页面加载完成后初始化
window.addEventListener("DOMContentLoaded", () => {
new PhoneLoginPage();
});
认证登录
signUp
async signUp(params: SignUpReq): Promise<SignUpRes>
注册新用户账户,采用智能注册并登录流程。
提示
手机号验证码注册 仅支持 上海 地域
- 创建一个新的用户账户
- 采用智能注册并登录流程:发送验证码 → 等待用户输入 → 智能判断用户存在性 → 自动登录或注册并登录
- 如果用户已存在则直接登录,如果用户不存在则注册新用户并自动登录
参数
params
SignUpReq
返回
Promise
SignUpRes
示例
- 邮箱注册
- 手机号注册
- 注册表单页面实现
- 错误处理
- 验证码验证错误处理
// 第一步:发送邮箱验证码并存储 verificationInfo
const { data, error } = await auth.signUp({
email: "newuser@example.com",
password: "securePassword123",
username: "newuser",
});
if (error) {
console.error("发送验证码失败:", error.message);
} else {
console.log("验证码已发送到邮箱,等待用户输入...");
// 第二步:等待用户输入验证码(通过 Promise 包装用户输入事件)
const verificationCode = "123456"; // 用户输入的验证码
// 第三步:智能验证流程(自动判断用户存在性)
const { data: loginData, error: loginError } = await data.verifyOtp({
token: verificationCode,
});
if (loginError) {
console.error("验证失败:", loginError.message);
} else {
// 第四步:自动完成注册或登录
console.log("操作成功,用户信息:", loginData.user);
console.log("会话信息:", loginData.session);
console.log(
"系统已自动判断:",
loginData.user?.email ? "新用户注册并登录" : "现有用户直接登录"
);
}
}
// 第一步:发送手机验证码
const { data, error } = await auth.signUp({
phone: "13800138000",
password: "mypassword",
});
if (error) {
console.error("发送验证码失败:", error.message);
} else {
console.log("验证码已发送到手机,等待用户输入...");
// 第二步:等待用户输入验证码
const verificationCode = "123456"; // 用户输入的验证码
// 第三步:智能验证流程(自动判断用户存在性)
const { data: loginData, error: loginError } = await data.verifyOtp({
token: verificationCode,
});
if (loginError) {
console.error("操作失败:", loginError.message);
} else {
// 系统自动判断:如果用户已存在则直接登录,如果不存在则注册新用户
if (loginData.user?.phone) {
console.log("现有用户直接登录成功,用户信息:", loginData.user);
} else {
console.log("新用户注册并登录成功,用户ID:", loginData.user?.id);
}
console.log("会话状态:", loginData.session ? "已登录" : "未登录");
}
}
let signUpVerify = null;
async function startRegistration(email, password) {
const { data, error } = await auth.signUp({
email: email,
password: password,
});
if (error) {
console.error("发送验证码失败:", error.message);
document.getElementById("error").innerText =
"发送验证码失败: " + error.message;
return false;
} else {
console.log("验证码已发送");
signUpVerify = data.verifyOtp;
// 显示验证码输入框
document.getElementById("verificationSection").style.display = "block";
document.getElementById("registrationSection").style.display = "none";
// 更新提示信息,说明智能判断逻辑
document.getElementById("verificationHint").innerText =
"请输入验证码,系统将自动判断您是注册新用户还是登录现有账户";
return true;
}
}
async function completeRegistration(verificationCode) {
if (!signUpVerify) {
console.error("注册流程未开始");
return false;
}
const { data, error } = await signUpVerify({ token: verificationCode });
if (error) {
console.error("验证失败:", error.message);
document.getElementById("error").innerText = "验证失败: " + error.message;
return false;
} else {
// 智能判断结果反馈
if (data.user?.email) {
console.log("智能注册并登录成功");
document.getElementById("success").innerText = data.user?.created_at
? "新用户注册成功,欢迎加入!"
: "登录成功,欢迎回来!";
}
// 自动跳转到首页
setTimeout(() => {
window.location.href = "/dashboard";
}, 2000);
return true;
}
}
// 注册表单提交
document
.getElementById("registerForm")
.addEventListener("submit", async (e) => {
e.preventDefault();
const email = document.getElementById("email").value;
const password = document.getElementById("password").value;
const nickname = document.getElementById("nickname").value;
await startRegistration(email, password, nickname);
});
// 验证码表单提交
document
.getElementById("verificationForm")
.addEventListener("submit", async (e) => {
e.preventDefault();
const code = document.getElementById("verificationCode").value;
await completeRegistration(code);
});
try {
const { data, error } = await auth.signUp({
email: "existing@example.com",
password: "password123",
});
if (error) {
switch (error.code) {
case "email_already_exists":
console.error("邮箱已被注册,请使用其他邮箱或直接登录");
document.getElementById("error").innerText = "该邮箱已被注册";
break;
case "phone_already_exists":
console.error("手机号已被注册,请使用其他手机号");
document.getElementById("error").innerText = "该手机号已被注册";
break;
case "password_too_weak":
console.error("密码强度不足,请使用更复杂的密码");
document.getElementById("error").innerText = "密码强度不足";
break;
case "invalid_email":
console.error("邮箱格式错误,请检查邮箱格式");
document.getElementById("error").innerText = "邮箱格式错误";
break;
case "invalid_phone":
console.error("手机号格式错误,请检查手机号格式");
document.getElementById("error").innerText = "手机号格式错误";
break;
case "username_already_exists":
console.error("用户名已被使用,请选择其他用户名");
document.getElementById("error").innerText = "用户名已被使用";
break;
case "resource_exhausted":
console.error("注册频率过高,请稍后重试");
document.getElementById("error").innerText = "注册频率过高,请稍后重试";
break;
case "unreachable":
console.error("网络连接失败,请检查网络设置后重试");
document.getElementById("error").innerText = "网络连接失败";
break;
default:
console.error("注册失败:", error.message);
document.getElementById("error").innerText =
"注册失败: " + error.message;
}
} else {
console.log("验证码发送成功");
}
} catch (error) {
console.error("网络错误:", error);
document.getElementById("error").innerText = "网络错误,请重试";
}
async function verifyRegistrationCode(code) {
try {
const { data, error } = await signUpCallback(code);
if (error) {
switch (error.code) {
case "invalid_code":
console.error("验证码不正确,请重新输入");
document.getElementById("error").innerText = "验证码不正确";
break;
case "code_expired":
console.error("验证码已过期,请重新获取");
document.getElementById("error").innerText = "验证码已过期";
// 显示重新发送按钮
document.getElementById("resendBtn").style.display = "block";
break;
case "max_attempts_exceeded":
console.error("验证次数过多,请稍后重试");
document.getElementById("error").innerText = "验证次数过多";
break;
case "verification_not_found":
console.error("验证信息不存在,请重新开始注册流程");
document.getElementById("error").innerText = "验证信息不存在";
break;
case "unreachable":
console.error("网络连接失败,请检查网络设置后重试");
document.getElementById("error").innerText = "网络连接失败";
break;
default:
console.error("验证失败:", error.message);
document.getElementById("error").innerText =
"验证失败: " + error.message;
}
return false;
} else {
console.log("注册成功");
return true;
}
} catch (error) {
console.error("网络错误:", error);
document.getElementById("error").innerText = "网络错误,请重试";
return false;
}
}
signInAnonymously
async signInAnonymously(params?: SignInAnonymouslyReq): Promise<SignInRes>
匿名登录,创建一个临时匿名用户账户。
- 创建一个临时匿名用户账户
- 无需提供任何身份验证信息
- 适合需要临时访问权限的场景
- 使用前,请确认已在云开发平台/身份认证/注册配置中开启允许匿名登录(默认开启)
参数
params
SignInAnonymouslyReq
返回
Promise
SignInRes
示例
- 匿名登录
- 错误处理
- 匿名用户转正流程
// 创建匿名用户
const { data, error } = await auth.signInAnonymously();
if (error) {
console.error("匿名登录失败:", error.message);
console.error("错误代码:", error.code);
} else {
console.log("匿名登录成功");
console.log("匿名用户ID:", data.user?.id);
console.log("会话信息:", data.session);
console.log("是否为匿名用户:", data.user?.is_anonymous);
}
async function safeAnonymousLogin() {
try {
const { data, error } = await auth.signInAnonymously();
if (error) {
switch (error.code) {
case "rate_limit_exceeded":
console.error("请求频率过高,请稍后重试");
break;
case "invalid_provider_token":
console.error("第三方平台令牌无效,请检查令牌格式");
break;
case "provider_not_supported":
console.error("不支持的第三方平台,请检查平台标识");
break;
case "unreachable":
console.error("网络连接失败,请检查网络设置后重试");
break;
case "permission_denied":
console.error("权限不足,请检查安全域名配置");
break;
default:
console.error("匿名登录失败:", error.message);
}
return null;
} else {
console.log("匿名登录成功");
return data;
}
} catch (error) {
console.error("网络错误:", error);
return null;
}
}
// 使用安全登录函数
const result = await safeAnonymousLogin();
if (result) {
console.log("登录成功,用户信息:", result.user);
}
// 第一步:匿名登录
const { data: anonymousData, error: anonymousError } =
await auth.signInAnonymously();
if (anonymousError) {
console.error("匿名登录失败:", anonymousError.message);
} else {
console.log("匿名登录成功,准备升级为正式用户");
// 第二步:绑定邮箱或手机号(示例:绑定邮箱)
const { data: upgradeData, error: upgradeError } = await auth.signUp({
email: "user@example.com",
password: "securePassword123",
anonymous_token: anonymousData.session?.access_token,
});
if (upgradeError) {
console.error("升级失败:", upgradeError.message);
} else {
console.log("升级成功,请输入验证码完成身份验证");
// 第三步:验证验证码
const verificationCode = "123456";
const { data: finalData, error: finalError } = await upgradeData.verifyOtp({
token: verificationCode,
});
if (finalError) {
console.error("验证失败:", finalError.message);
} else {
console.log("匿名用户成功升级为正式用户");
console.log("新用户信息:", finalData.user);
console.log("是否为匿名用户:", finalData.user?.is_anonymous);
}
}
}
signInWithPassword
async signInWithPassword(params: SignInWithPasswordReq): Promise<SignInRes>
使用用户名、邮箱或手机号和密码登录。
- 支持用户名、邮箱、手机号配合密码三种登录方式(三选一)
- 使用前,请确认已在云开发平台/身份认证/常规登录中开启用户名密码登录(默认开启)
参数
params
SignInWithPasswordReq