鸿蒙5登录无忧:AGC认证服务集成指南(手机/邮箱/匿名)
随着HarmonyOS 5的发布,AppGallery Connect(AGC)的认证服务提供了更加完善的用户身份验证解决方案。本文将详细介绍如何在HarmonyOS 5应用中集成AGC认证服务,支持手机号码、电子邮件和匿名登录三种方式,并提供完整的代码实现。
一、AGC认证服务概述
AGC认证服务提供以下主要功能:
手机号码认证:通过短信验证码实现快速登录
电子邮件认证:通过邮件链接或验证码登录
匿名登录:无需用户提供个人信息即可生成临时账户
安全合规:符合全球主要地区的隐私法规要求
二、环境准备
- 启用AGC认证服务
登录AppGallery Connect
选择您的项目,进入"构建" > "认证服务"
启用所需的认证方式(手机/邮箱/匿名) - 配置HarmonyOS应用
在项目级build.gradle中添加AGC依赖:
dependencies {
implementation 'com.huawei.agconnect:agconnect-auth-harmony:1.6.0.300'
}
三、手机号码登录集成
- 发送验证码
import agconnect from '@hw-agconnect/api';
import '@hw-agconnect/auth-harmony';
async function sendPhoneVerifyCode(phoneNumber: string) {
try {
const authService = agconnect.auth();
const settings = {
// 验证码有效期,单位秒
validityPeriod: 300,
// 验证码长度(4-10位)
codeLength: 6,
// 语言(zh_CN, en_US等)
locale: 'zh_CN'
};
await authService.requestVerifyCode(phoneNumber, agconnect.auth.PhoneAuthProvider.PARAM_FLAG, settings);
console.log('验证码发送成功');
} catch (error) {
console.error('发送验证码失败:', error);
}
}
2. 验证并登录
async function signInWithPhone(phoneNumber: string, verifyCode: string) {
try {
const authService = agconnect.auth();
const credential = agconnect.auth.PhoneAuthProvider.credentialWithVerifyCode(
phoneNumber,
'',
verifyCode
);
const user = await authService.signIn(credential);
console.log('手机登录成功:', user.getUid());
return user;
} catch (error) {
console.error('手机登录失败:', error);
throw error;
}
}
四、电子邮件登录集成
-
发送验证邮件
async function sendEmailVerifyLink(email: string) {
try {
const authService = agconnect.auth();
const settings = {
// 邮件主题
emailSubject: '您的登录验证链接',
// 验证链接有效期,单位秒
validityPeriod: 3600,
// 语言
locale: 'zh_CN',
// 自定义动作URL模板(可选)
actionUrlTemplate: 'https://yourdomain.com/verify?token=${token}'
};await authService.requestVerifyCode(email, agconnect.auth.EmailAuthProvider.PARAM_FLAG, settings);
console.log('验证邮件发送成功');
} catch (error) {
console.error('发送验证邮件失败:', error);
}
} -
创建邮箱密码账户
async function createEmailAccount(email: string, password: string) {
try {
const authService = agconnect.auth();
const user = await authService.createEmailUser(email, password);
console.log('邮箱账户创建成功:', user.getUid());
return user;
} catch (error) {
console.error('邮箱账户创建失败:', error);
throw error;
}
}
// 邮箱密码登录
async function signInWithEmail(email: string, password: string) {
try {
const authService = agconnect.auth();
const credential = agconnect.auth.EmailAuthProvider.credentialWithPassword(email, password);
const user = await authService.signIn(credential);
console.log('邮箱登录成功:', user.getUid());
return user;
} catch (error) {
console.error('邮箱登录失败:', error);
throw error;
}
}
五、匿名登录集成
async function anonymousSignIn() {
try {
const authService = agconnect.auth();
const user = await authService.signInAnonymously();
console.log('匿名登录成功:', user.getUid());
return user;
} catch (error) {
console.error('匿名登录失败:', error);
throw error;
}
}
// 将匿名账户升级为永久账户
async function linkAnonymousToEmail(email: string, password: string) {
try {
const authService = agconnect.auth();
const currentUser = authService.getCurrentUser();
if (!currentUser || !currentUser.isAnonymous()) {
throw new Error('当前用户不是匿名用户');
}
const credential = agconnect.auth.EmailAuthProvider.credentialWithPassword(email, password);
await currentUser.link(credential);
console.log('匿名账户升级成功');
return authService.getCurrentUser();
} catch (error) {
console.error('匿名账户升级失败:', error);
throw error;
}
}
六、用户状态管理
- 获取当前用户
function getCurrentUser() {
const authService = agconnect.auth();
return authService.getCurrentUser();
}
// 监听用户状态变化
function setupAuthListener() {
const authService = agconnect.auth();
authService.onAuthStateChanged((user) => {
if (user) {
console.log('用户已登录:', user.getUid());
// 更新UI或应用状态
} else {
console.log('用户已登出');
// 更新UI或应用状态
}
});
}
2. 退出登录
async function signOut() {
try {
const authService = agconnect.auth();
await authService.signOut();
console.log('退出登录成功');
} catch (error) {
console.error('退出登录失败:', error);
}
}
七、完整示例:登录页面实现
// LoginPage.ets
import { signInWithPhone, signInWithEmail, anonymousSignIn } from '../model/AuthService';
@Entry
@Component
struct LoginPage {
@State phoneNumber: string = '';
@State verifyCode: string = '';
@State email: string = '';
@State password: string = '';
@State activeTab: number = 0; // 0-手机, 1-邮箱, 2-匿名
build() {
Column() {
Tabs({ barPosition: BarPosition.Start }) {
TabContent() {
// 手机登录表单
Column() {
TextInput({ placeholder: '请输入手机号码' })
.width('80%')
.onChange((value: string) => { this.phoneNumber = value })
TextInput({ placeholder: '请输入验证码' })
.width('80%')
.onChange((value: string) => { this.verifyCode = value })
Button('获取验证码')
.onClick(() => sendPhoneVerifyCode(this.phoneNumber))
Button('登录')
.onClick(() => signInWithPhone(this.phoneNumber, this.verifyCode))
}
}.tabBar('手机登录')
TabContent() {
// 邮箱登录表单
Column() {
TextInput({ placeholder: '请输入邮箱地址' })
.width('80%')
.onChange((value: string) => { this.email = value })
TextInput({ placeholder: '请输入密码', type: InputType.Password })
.width('80%')
.onChange((value: string) => { this.password = value })
Button('注册/登录')
.onClick(() => signInWithEmail(this.email, this.password))
Button('发送验证链接')
.onClick(() => sendEmailVerifyLink(this.email))
}
}.tabBar('邮箱登录')
TabContent() {
// 匿名登录
Column() {
Button('快速体验')
.onClick(() => anonymousSignIn())
Text('无需注册,立即体验应用核心功能')
.fontSize(14)
}
}.tabBar('匿名登录')
}
}
}
}
八、安全最佳实践
验证用户输入:始终验证手机号码和电子邮件格式
限制尝试次数:防止暴力破解,AGC会自动限制频繁请求
保护用户数据:匿名用户数据应在升级后合并
遵守隐私法规:在隐私政策中说明数据收集和使用方式
使用HTTPS:确保所有通信都经过加密
九、常见问题解决
- 验证码发送失败
检查:
手机号码/邮箱格式是否正确
在AGC控制台是否已启用相应服务
是否达到发送频率限制
2. 匿名账户数据迁移
async function migrateAnonymousData(targetUid: string) {
try {
// 这里实现将匿名用户数据迁移到新账户的逻辑
// 例如将本地存储的数据与新的用户UID关联
console.log('数据迁移完成:', targetUid);
} catch (error) {
console.error('数据迁移失败:', error);
}
}
// 在账户升级成功后调用
const newUser = await linkAnonymousToEmail('user@example.com', 'password');
await migrateAnonymousData(newUser.getUid());
结语
通过集成AGC认证服务,HarmonyOS 5应用可以快速实现多种登录方式,大幅提升用户体验。本文提供的代码示例涵盖了手机号码、电子邮件和匿名登录的主要场景,开发者可以根据实际需求进行调整和扩展。

浙公网安备 33010602011771号