HarmonyOS_ArkTs_API(9)
本文介绍了HarmonyOS_ArkTs用户认证系统实现。该系统基于JWT令牌认证流程,包含登录服务、会话管理和API安全通信等核心组件。采用单例模式管理用户会话状态,自动注入认证头部到API请求,并实现了注册、登出等完整功能。系统特别注重安全性,包括令牌加密存储、会话超时处理和错误管理等机制,在保证安全性的同时提供流畅的用户体验。该认证模块遵循行业最佳实践,为应用的后续功能提供了可靠的身份验证基
·
HarmonyOS_ArkTs_API(9)
概述
梦想生活规划师应用实现了一套全面的用户认证和会话管理系统,安全地处理用户凭据、维护持久会话,并在整个应用程序中提供无缝的认证体验。这个关键模块编排了登录流程、令牌管理、会话持久化和安全的API通信。
认证流程
认证过程遵循基于JWT的安全流程:
- 用户通过登录表单提交凭据
- 凭据通过安全通道发送到后端API
- 后端验证凭据并返回JWT令牌
- 前端存储令牌和用户信息到会话
- 后续API请求包含令牌进行授权
核心组件
登录服务
登录功能封装在ApiService中,处理认证请求:
export async function login(params: LoginParams): Promise<ApiResponse<AuthResponse>> {
console.info('登录请求参数:', JSON.stringify(params));
try {
// 将LoginParams转换为RequestData类型
const requestData: RequestData = {
username: params.username,
password: params.password
};
const response = await request<ApiResponse<AuthResponse>>(
RequestMethod.POST,
'/auth/login',
EmptyParams,
requestData
);
console.info('登录响应:', JSON.stringify(response));
return response;
} catch (error) {
console.error('登录失败:', error);
throw new Error(error instanceof Error ? error.message : String(error));
}
}
用户会话管理
UserSession类实现了单例模式,为用户认证状态提供集中访问点:
export class UserSession {
private static instance: UserSession;
private loggedIn: boolean = false;
private token: string | null = null;
private userId: number | null = null;
private userInfo: UserInfo | null = null;
private constructor() {
// 如果可用,从持久化存储初始化
this.loadSessionFromStorage();
}
public static getInstance(): UserSession {
if (!UserSession.instance) {
UserSession.instance = new UserSession();
}
return UserSession.instance;
}
// 会话管理方法
public isLoggedIn(): boolean { return this.loggedIn; }
public getToken(): string | null { return this.token; }
public getUserId(): number | null { return this.userId; }
// 认证方法
public setSession(authResponse: AuthResponse): void {
this.token = authResponse.token;
this.userId = authResponse.id;
this.loggedIn = true;
this.saveSessionToStorage();
}
public clearSession(): void {
this.token = null;
this.userId = null;
this.loggedIn = false;
this.removeSessionFromStorage();
}
}
认证头部集成
API服务自动将认证头部注入到传出请求中:
const headers: HttpHeader = {
'Content-Type': 'application/json',
'Accept': 'application/json'
};
// 添加用户认证令牌
const userSession = UserSession.getInstance();
if (userSession && userSession.isLoggedIn()) {
const token = userSession.getToken();
if (token) {
headers['Authorization'] = `Bearer ${token}`;
console.info('已添加用户认证令牌到请求');
}
}
安全性考虑
- 令牌存储:用户令牌安全存储并在可能时加密
- 会话超时:实现会话过期处理
- 令牌刷新:自动令牌刷新机制以延长有效会话
- 错误处理:优雅处理认证失败并提供友好的用户消息
- 安全头部:为所有认证请求设置适当的安全头部
高级功能
注册流程
系统包含全面的注册流程,带有用户名可用性检查:
export async function checkUsername(username: string): Promise<ApiResponse<boolean>> {
console.info('检查用户名:', username);
try {
const queryParams: QueryParams = {};
queryParams['username'] = username;
const response = await request<ApiResponse<boolean>>(
RequestMethod.GET,
'/auth/check-username',
queryParams
);
return response;
} catch (error) {
console.error('用户名检查失败:', error);
throw new Error(error instanceof Error ? error.message : String(error));
}
}
登出机制
登出功能确保正确的会话终止和清理:
export async function logout(): Promise<ApiResponse<void>> {
console.info('发起登出请求');
try {
const response = await request<ApiResponse<void>>(
RequestMethod.POST,
'/auth/logout',
EmptyParams
);
return response;
} catch (error) {
console.error('登出请求失败:', error);
// 创建一个模拟响应,确保用户仍可在本地登出
return { code: 200, message: '登出成功', data: undefined };
}
}
认证系统的设计优先考虑安全性同时保持流畅的用户体验,采用行业最佳实践实现移动应用中基于令牌的认证。
更多推荐
所有评论(0)