身份认证
signUp
Future<SignUpRes> auth.signUp(SignUpReq params)
注册新用户账户,采用智能注册并登录流程。
- 创建一个新的用户账户
- 采用智能注册并登录流程:发送验证码 → 等待用户输入 → 智能判断用户存在性 → 自动登录或注册并登录
- 如果用户已存在则直接登录,如果用户不存在则注册新用户并自动登录
参数
返回
示例
- 邮箱注册
- 手机号注册
- 错误处理
final result = await auth.signUp(SignUpReq(
email: 'user@example.com',
password: 'securePassword123',
nickname: '新用户',
));
if (result.error != null) {
print('注册失败: ${result.error!.message}');
return;
}
// 验证码验证
final verifyResult = await result.data!.verifyOtp!(
VerifyOtpParams(token: '123456'),
);
if (verifyResult.isSuccess) {
print('注册成功: ${verifyResult.data?.user?.id}');
}
final result = await auth.signUp(SignUpReq(
phone: '13800138000',
password: 'securePassword123',
));
if (result.error != null) {
print('发送验证码失败: ${result.error!.message}');
return;
}
final verifyResult = await result.data!.verifyOtp!(
VerifyOtpParams(token: '123456'),
);
if (verifyResult.isSuccess) {
print('注册成功: ${verifyResult.data?.user?.phone}');
}
final result = await auth.signUp(SignUpReq(
email: 'user@example.com',
password: 'password123',
));
if (result.error != null) {
final code = result.error!.code;
switch (code) {
case 'already_exists':
print('邮箱已被注册');
break;
case 'password_too_weak':
print('密码强度不足');
break;
case 'invalid_email':
print('邮箱格式错误');
break;
default:
print('注册失败: ${result.error!.message}');
}
}
signInAnonymously
Future<SignInRes> auth.signInAnonymously({String? providerToken})
匿名登录,创建一个临时匿名用户账户。
- 创建一个临时匿名用户账户
- 无需提供任何身份验证信息
- 适合需要临时访问权限的场景
参数
第三方平台令牌,用于关联第三方平台身份
返回
示例
- 匿名登录
- 匿名用户转正流程
final result = await auth.signInAnonymously();
if (result.isSuccess) {
print('匿名登录成功');
print('用户ID: ${result.data?.user?.id}');
print('是否匿名: ${result.data?.user?.isAnonymous}');
} else {
print('匿名登录失败: ${result.error!.message}');
}
// 第一步:匿名登录
final anonymousResult = await auth.signInAnonymously();
if (anonymousResult.error != null) {
print('匿名登录失败: ${anonymousResult.error!.message}');
return;
}
print('匿名登录成功,准备升级为正式用户');
// 第二步:绑定邮箱(注册时传入 anonymousToken)
final upgradeResult = await auth.signUp(SignUpReq(
email: 'user@example.com',
password: 'securePassword123',
anonymousToken: anonymousResult.data?.session?.accessToken,
));
if (upgradeResult.error != null) {
print('升级失败: ${upgradeResult.error!.message}');
return;
}
// 第三步:验证验证码
final verifyResult = await upgradeResult.data!.verifyOtp!(
VerifyOtpParams(token: '123456'),
);
if (verifyResult.isSuccess) {
print('匿名用户转正成功');
}
signInWithPassword
Future<SignInRes> auth.signInWithPassword(SignInWithPasswordReq params)
使用密码登录。支持通过用户名、邮箱或手机号进行登录。
参数
返回
示例
- 邮箱密码登录
- 错误处理
- 用户名密码登录
- 手机号密码登录
final result = await auth.signInWithPassword(
SignInWithPasswordReq(
email: 'user@example.com',
password: 'securePassword123',
),
);
if (result.isSuccess) {
print('登录成功: ${result.data?.user?.id}');
} else {
print('登录失败: ${result.error!.message}');
}
final result = await auth.signInWithPassword(
SignInWithPasswordReq(
email: 'user@example.com',
password: 'wrongPassword',
),
);
if (result.error != null) {
switch (result.error!.code) {
case 'invalid_credentials':
print('用户名或密码错误');
break;
case 'user_not_found':
print('用户不存在');
break;
default:
print('登录失败: ${result.error!.message}');
}
}
final result = await auth.signInWithPassword(
SignInWithPasswordReq(
username: 'myusername',
password: 'securePassword123',
),
);
if (result.isSuccess) {
print('登录成功: ${result.data?.user?.id}');
}
final result = await auth.signInWithPassword(
SignInWithPasswordReq(
phone: '13800138000',
password: 'securePassword123',
),
);
if (result.isSuccess) {
print('登录成功: ${result.data?.user?.id}');
}
signInWithUsername
Future<SignInRes> auth.signInWithUsername({
required VerificationInfo verificationInfo,
required String verificationCode,
required String username,
String? loginType,
dynamic bindInfo,
})
使用用户名/邮箱/手机号和验证码登录。通常先调用 getVerification 发送验证码,再将返回的验证信息与用户输入的验证码传入本方法完成登录。
- 若
verificationInfo.isUser为true,则走登录流程 - 若用户不存在,则自动注册并登录
- 可通过
bindInfo在登录或注册时绑定第三方身份源
参数
验证信息,通常来自 getVerification 的返回值
用户输入的验证码
用户名、邮箱或手机号
登录类型:email 或 phone。为 email 时按邮箱处理,否则按手机号处理(自动补全 +86 前缀)
绑定第三方身份源信息,如 {'providerToken': '...'} 或 {'providerId': '...'}
返回
示例
- 邮箱验证码登录
- 手机号验证码登录并绑定身份源
final verification = await auth.getVerification(email: 'user@example.com');
if (verification.error != null) {
print('发送验证码失败: ${verification.error!.message}');
return;
}
final result = await auth.signInWithUsername(
verificationInfo: VerificationInfo(
verificationId: verification.data!.verificationId,
isUser: verification.data!.isUser,
),
verificationCode: '123456',
username: 'user@example.com',
loginType: 'email',
);
if (result.isSuccess) {
print('登录成功: ${result.data?.user?.id}');
} else {
print('登录失败: ${result.error!.message}');
}
final verification = await auth.getVerification(phoneNumber: '13800138000');
final result = await auth.signInWithUsername(
verificationInfo: VerificationInfo(
verificationId: verification.data!.verificationId,
isUser: verification.data!.isUser,
),
verificationCode: '123456',
username: '13800138000',
loginType: 'phone',
bindInfo: {'providerToken': 'pt-wechat'},
);
if (result.isSuccess) {
print('登录成功: ${result.data?.user?.id}');
}
signInWithOtp
Future<SignInWithOtpRes> auth.signInWithOtp(SignInWithOtpReq params)
使用 OTP(一次性验证码)登录。调用后发送验证码,需通过返回的 verifyOtp 回调完成验证。
- 如果用户不存在,会默认注册用户,可以通过
shouldCreateUser参数控制是否自动创建用户,默认为 true
参数
返回
示例
- 示例
final result = await auth.signInWithOtp(
SignInWithOtpReq(email: 'user@example.com'),
);
if (result.error != null) {
print('发送验证码失败: ${result.error!.message}');
return;
}
// 用户输入验证码后调用
final loginResult = await result.data!.verifyOtp!(
VerifyOtpParams(token: '123456'),
);
if (loginResult.isSuccess) {
print('OTP 登录成功: ${loginResult.data?.user?.id}');
}
signInWithOAuth
Future<SignInOAuthRes> auth.signInWithOAuth(SignInWithOAuthReq params)
使用 OAuth 第三方平台登录。返回授权 URL,需引导用户跳转至该 URL 完成授权。
参数
返回
示例
- 示例
final result = await auth.signInWithOAuth(
SignInWithOAuthReq(provider: 'wechat'),
);
if (result.isSuccess) {
final authUrl = result.data!.url!;
print('请跳转到授权页面: $authUrl');
// 引导用户打开 authUrl 进行授权
}
signInWithIdToken
Future<SignInRes> auth.signInWithIdToken(SignInWithIdTokenReq params)
使用第三方平台的身份令牌(IdToken)登录,适用于已获取微信、Google 等平台令牌的场景。SDK 会将 provider 作为 provider_id、将 token 作为 provider_id_token 发送给登录接口。
- 第三方平台需在云开发平台/身份认证/登录方式中先完成配置
token为必填参数;不指定provider时使用通用令牌验证
参数
返回
示例
- 示例
final result = await auth.signInWithIdToken(
SignInWithIdTokenReq(
token: 'provider-id-token',
provider: 'wechat',
),
);
if (result.isSuccess) {
print('IdToken 登录成功: ${result.data?.user?.id}');
} else {
print('登录失败: ${result.error!.message}');
}
signInWithCustomTicket
Future<SignInRes> auth.signInWithCustomTicket(Future<String> Function() getTicketFn)
使用自定义票据登录。通过传入获取票据的异步函数,由服务端生成票据并完成登录。
参数
获取自定义登录票据的异步函数
返回
示例
- 基本用法
final result = await auth.signInWithCustomTicket(() async {
// 从您的服务端获取自定义票据
final ticket = await fetchTicketFromServer();
return ticket;
});
if (result.isSuccess) {
print('自定义票据登录成功: ${result.data?.user?.id}');
} else {
print('登录失败: ${result.error!.message}');
}
会话管理
getSession
Future<SignInRes> auth.getSession();
获取当前会话。如果 Token 已过期会自动刷新。
参数
无参数
返回
示例
- 示例
final result = await auth.getSession();
if (result.isSuccess) {
final session = result.data?.session;
print('Access Token: ${session?.accessToken}');
print('用户: ${result.data?.user?.id}');
} else {
print('获取会话失败: ${result.error!.message}');
}
refreshSession
Future<SignInRes> auth.refreshSession([String? refreshToken])
刷新会话。使用 Refresh Token 获取新的 Access Token。
参数
刷新令牌(可选,默认使用当前会话的 refreshToken)
返回
示例
- 示例
final result = await auth.refreshSession();
if (result.isSuccess) {
print('会话已刷新');
print('新 Access Token: ${result.data?.session?.accessToken}');
} else {
print('刷新失败: ${result.error!.message}');
}
setSession
Future<SignInRes> auth.setSession(SetSessionReq params)
设置会话。通过 Refresh Token 恢复会话状态。
参数
返回
示例
- 示例
final result = await auth.setSession(
SetSessionReq(refreshToken: 'your-refresh-token'),
);
if (result.isSuccess) {
print('会话设置成功: ${result.data?.user?.id}');
}
signOut
Future<SignOutRes> auth.signOut([SignOutReq? params])
退出登录。用当前 access token 调用吊销接口,并清除本地会话。params 不会发给服务端。
参数
登出配置选项(可选)
返回
示例
- 示例
await auth.signOut();
print("已退出登录");
onAuthStateChange
OnAuthStateChangeResult auth.onAuthStateChange(OnAuthStateChangeCallback callback)
监听认证状态变化。支持监听登录、登出、Token 刷新和用户更新等事件。
参数
状态变化回调函数
返回
示例
- 示例
final result = auth.onAuthStateChange((event, session, info) {
print('认证状态变化: ${event.value}');
if (session != null) {
print('用户: ${session.user?.id}');
}
});
// 取消监听
result.data?.subscription.unsubscribe();
getClaims
Future<GetClaimsRes> auth.getClaims();
获取当前 Access Token 的 JWT Claims(令牌声明)。
参数
无参数
返回
示例
- 示例
final result = await auth.getClaims();
if (result.isSuccess) {
final claims = result.data?.claims;
print('用户ID: ${claims?.sub}');
print('邮箱: ${claims?.email}');
print('用户组: ${claims?.groups}');
print('过期时间: ${claims?.exp}');
}
用户管理
getUser
Future<GetUserRes> auth.getUser();
获取当前登录用户信息。
参数
无参数
返回
示例
- 示例
final result = await auth.getUser();
if (result.isSuccess) {
final user = result.data?.user;
print('用户ID: ${user?.id}');
print('邮箱: ${user?.id}');
print('昵称: ${user?.userMetadata?.nickName}');
} else {
print('获取用户信息失败: ${result.error!.message}');
}
refreshUser
Future<SignInRes> auth.refreshUser();
刷新用户信息。重新从服务端获取最新的用户数据并更新本地会话。
参数
无参数
返回
示例
- 示例
final result = await auth.refreshUser();
if (result.isSuccess) {
print('用户信息已刷新: ${result.data?.user?.id}');
}
updateUser
Future<UpdateUserRes> auth.updateUser(UpdateUserReq params)
更新用户信息。如果更新邮箱或手机号,需要通过验证码验证。
参数
返回
示例
- 更新基本信息
- 更新邮箱(需验证)
final result = await auth.updateUser(
UpdateUserReq(nickname: '新昵称', avatarUrl: 'https://example.com/avatar.png'),
);
if (result.isSuccess) {
print('用户信息已更新: ${result.data?.user?.userMetadata?.nickName}');
}
final result = await auth.updateUser(
UpdateUserReq(email: 'new@example.com'),
);
if (result.isSuccess && result.data?.verifyOtp != null) {
final verifyResult = await result.data!.verifyOtp!(
UpdateUserVerifyParams(token: '123456'),
);
if (verifyResult.isSuccess) {
print('邮箱更新成功: ${verifyResult.data?.user?.id}');
}
}
deleteUser
Future<CloudBaseResponse<void>> auth.deleteUser(DeleteUserReq params)
删除当前用户。需要提供密码进行安全验证。
参数
返回
示例
- 示例
final result = await auth.deleteUser(
DeleteUserReq(password: 'currentPassword'),
);
if (result.isSuccess) {
print('用户已删除');
} else {
print('删除失败: ${result.error!.message}');
}
身份源管理
getUserIdentities
Future<GetUserIdentitiesRes> auth.getUserIdentities();
获取当前用户已绑定的身份源列表。
参数
无参数
返回
示例
- 示例
final result = await auth.getUserIdentities();
if (result.isSuccess) {
for (final identity in result.data?.identities ?? []) {
print('身份源: ${identity.name} (${identity.provider})');
}
}
linkIdentity
Future<LinkIdentityRes> auth.linkIdentity(LinkIdentityReq params)
绑定第三方身份源。会跳转到第三方授权页面完成绑定。
参数
返回
示例
- 示例
final result = await auth.linkIdentity(
LinkIdentityReq(provider: 'wechat'),
);
if (result.isSuccess) {
print('授权地址: ${result.data?.url}');
}
unlinkIdentity
Future<CloudBaseResponse<void>> auth.unlinkIdentity(UnlinkIdentityReq params)
解绑第三方身份源。
参数
返回
示例
- 示例
final result = await auth.unlinkIdentity(
UnlinkIdentityReq(provider: 'wechat'),
);
if (result.isSuccess) {
print('身份源已解绑');
}
密码管理
resetPasswordForEmail
Future<ResetPasswordForEmailRes> auth.resetPasswordForEmail(String emailOrPhone, {String? redirectTo})
通过邮箱或手机号重置密码。调用后发送验证码,需通过返回的 updateUser 回调完成密码重置。
参数
邮箱或手机号
重定向地址
返回
示例
- 示例
final result = await auth.resetPasswordForEmail('user@example.com');
if (result.error != null) {
print('发送验证码失败: ${result.error!.message}');
return;
}
// 用户收到验证码后
final resetResult = await result.data!.updateUser!(
UpdateUserAttributes(nonce: '123456', password: 'newPassword123'),
);
if (resetResult.isSuccess) {
print('密码重置成功,已自动登录');
}
resetPasswordForOld
Future<SignInRes> auth.resetPasswordForOld(ResetPasswordForOldReq params)
通过旧密码重置密码。
参数
返回
示例
- 示例
final result = await auth.resetPasswordForOld(
ResetPasswordForOldReq(
oldPassword: 'oldPassword123',
newPassword: 'newPassword456',
),
);
if (result.isSuccess) {
print('密码修改成功');
} else {
print('密码修改失败: ${result.error!.message}');
}
reauthenticate
Future<ReauthenticateRes> auth.reauthenticate();
重新认证。发送验证码到用户邮箱或手机号,验证后可进行敏感操作(如设置新密码)。
参数
无参数
返回
示例
- 示例
final result = await auth.reauthenticate();
if (result.error != null) {
print('发送验证码失败: ${result.error!.message}');
return;
}
final authResult = await result.data!.updateUser!(
UpdateUserAttributes(nonce: '123456', password: 'newSecurePassword'),
);
if (authResult.isSuccess) {
print('重新认证成功');
}
验证管理
getVerification
Future<CloudBaseResponse<GetVerificationResData>> auth.getVerification({String? email, String? phoneNumber})
发送验证码到邮箱或手机号。
参数
邮箱(与 phoneNumber 二选一)
手机号(与 email 二选一)
返回
示例
- 示例
final result = await auth.getVerification(email: 'user@example.com');
if (result.isSuccess) {
print('验证码已发送,验证ID: ${result.data?.verificationId}');
print('是否已注册用户: ${result.data?.isUser}');
}
verify
Future<CloudBaseResponse<VerifyCodeResData>> auth.verify({required String verificationId, required String verificationCode})
验证验证码。
参数
验证 ID
验证码
返回
示例
- 示例
final result = await auth.verify(
verificationId: 'verification-id',
verificationCode: '123456',
);
if (result.isSuccess) {
print('验证成功,令牌: ${result.data?.verificationToken}');
}
verifyOAuth
Future<VerifyOAuthRes> auth.verifyOAuth([VerifyOAuthReq? params])
验证 OAuth 回调,完成第三方登录或绑定身份。如果未传入参数,会自动从当前页面 URL 中提取 code 和 state。
参数
OAuth 回调参数(可选,不传时自动从 URL 中获取)
返回
示例
- 示例
// 自动从 URL 获取 code 和 state
final result = await auth.verifyOAuth();
if (result.isSuccess) {
print('OAuth 验证成功: ${result.data?.user?.id}');
}
// 手动传入参数
final result2 = await auth.verifyOAuth(VerifyOAuthReq(
code: 'authorization-code',
state: 'state-value',
provider: 'google',
redirectUri: 'https://example.com/callback',
));
verifyOtp
Future<SignInRes> auth.verifyOtp(VerifyOtpReq params)
验证 OTP 并登录。
参数
返回
示例
- 示例
final result = await auth.verifyOtp(VerifyOtpReq(
email: 'user@example.com',
token: '123456',
messageId: 'message-id',
));
if (result.isSuccess) {
print('验证并登录成功: ${result.data?.user?.id}');
}
resend
Future<ResendRes> auth.resend(ResendReq params)
重发验证码。
参数
返回
示例
- 示例
final result = await auth.resend(
ResendReq(email: 'user@example.com', type: ResendType.signup),
);
if (result.isSuccess) {
print('验证码已重发,消息ID: ${result.data?.messageId}');
}
getCaptchaToken
Future<String?> app.captcha.getCaptchaToken({bool forceNew = false, required String state})
获取有效的验证码 Token,在多次出现密码输入错误或频繁发送验证码时会要求提供验证码 Token。优先从缓存获取,若无缓存则自动创建验证码并弹出验证界面。支持自定义验证码处理器或使用内置弹窗。
参数
是否强制创建新验证码(默认 false)
状态标识
返回
验证码 Token,失败时为 null
示例
- 使用内置弹窗
- 自定义验证码处理器
// 初始化时配置 navigatorKey
final navigatorKey = GlobalKey<NavigatorState>();
final app = await CloudBase.init(
env: 'your-env-id',
captchaConfig: CaptchaConfig(navigatorKey: navigatorKey),
);
// 获取验证码 Token(自动弹出验证码弹窗)
final token = await app.captcha.getCaptchaToken(state: 'login');
print('Captcha Token: $token');
// 设置自定义处理器
app.captcha.onCaptchaRequired = (String captchaImageData) async {
// 自定义展示验证码图片并获取用户输入
final userInput = await showMyCustomCaptchaDialog(captchaImageData);
return userInput;
};
final token = await app.captcha.getCaptchaToken(state: 'register');
appendCaptchaTokenToUrl
Future<String> app.captcha.appendCaptchaTokenToUrl(
String url, {
required String state,
bool forceNew = false,
})
取得验证码 Token,并把它接到 URL 上。没有拿到 Token 时返回原 URL。
参数
原始 URL
状态标识
是否强制创建新验证码,默认 false
返回
带 captcha_token 的 URL;未取得 Token 时为原 URL
示例
- 示例
final url = await app.captcha.appendCaptchaTokenToUrl(
'https://example.com/callback',
state: 'login',
);
createCaptchaData
Future<CreateCaptchaDataRes> app.captcha.createCaptchaData({required String state})
创建验证码数据。返回验证码图片数据和 Token。
参数
状态标识
返回
示例
- 示例
final captchaData = await app.captcha.createCaptchaData(state: 'login');
print('验证码图片: ${captchaData.data}');
print('Token: ${captchaData.token}');
verifyCaptchaData
Future<VerifyCaptchaRes> app.captcha.verifyCaptchaData({required String token, required String key})
验证用户输入的验证码。
参数
验证码 Token
用户输入的验证码
返回
示例
- 示例
final result = await app.captcha.verifyCaptchaData(
token: captchaData.token,
key: '用户输入的验证码',
);
print('验证码 Token: ${result.captchaToken}');
clearCaptchaToken
Future<void> app.captcha.clearCaptchaToken()
清除本地缓存的验证码 Token。
参数
无参数
返回
无返回值
示例
- 示例
await app.captcha.clearCaptchaToken();
print("验证码 Token 已清除");