HarmonyOS_ArkTs_API(9)

概述

梦想生活规划师应用实现了一套全面的用户认证和会话管理系统,安全地处理用户凭据、维护持久会话,并在整个应用程序中提供无缝的认证体验。这个关键模块编排了登录流程、令牌管理、会话持久化和安全的API通信。

认证流程

认证过程遵循基于JWT的安全流程:

  1. 用户通过登录表单提交凭据
  2. 凭据通过安全通道发送到后端API
  3. 后端验证凭据并返回JWT令牌
  4. 前端存储令牌和用户信息到会话
  5. 后续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('已添加用户认证令牌到请求');
  }
}

安全性考虑

  1. 令牌存储:用户令牌安全存储并在可能时加密
  2. 会话超时:实现会话过期处理
  3. 令牌刷新:自动令牌刷新机制以延长有效会话
  4. 错误处理:优雅处理认证失败并提供友好的用户消息
  5. 安全头部:为所有认证请求设置适当的安全头部

高级功能

注册流程

系统包含全面的注册流程,带有用户名可用性检查:

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 };
  }
}

认证系统的设计优先考虑安全性同时保持流畅的用户体验,采用行业最佳实践实现移动应用中基于令牌的认证。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐