Skip to content

匿名登录 ​

本章介绍如何创建匿名用户,以及在前后端交互中如何利用匿名登录接口完成用户身份的验证和授权。文档中包含了登录流程、接口说明、代码实现及其背后的关键技术细节和设计思路。

1. 匿名登录流程 ​

匿名登录流程主要包括以下两个步骤:

  1. 前端请求
    前端向后端发起请求,通过调用匿名登录接口,获取匿名用户的相关信息。该接口会在服务端自动创建一个匿名用户,并返回该用户的唯一标识(user_id)以及用于后续认证的 token 和 refresh token。并将后端返回的信息存到到local_storage中 名称是app_user

  2. 后续请求认证
    前端在后续需要进行身份验证的请求中,需要携带第一次请求返回的 token,以便后端对用户进行身份验证。这样就无需用户手动注册或登录,便能实现快速访问。

2. 接口说明 ​

匿名登录 ​

接口地址 ​

GET /api/v1/anonymous/create

响应示例 ​

当调用接口成功时,服务器会返回如下 JSON 格式的数据:

json
{
  "data": {
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOi0xLCJ1c2VySWQiOiI0ODgzMzAxMTc1NDQ5NjQwOTYifQ==.xxXrgOk7hdYGM-XlMuJv2VKB7jr95_XnbYh5tZ3m_9k",
    "user_id": "488330117544964096",
    "expires_in": 1742107772,
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDIxMDc3NzIsInVzZXJJZCI6IjQ4ODMzMDExNzU0NDk2NDA5NiJ9.ppUn-GrM2cB4yAALPWmYZFhPvQQpZ93ARpJpocmsB1o"
    "type":0
  },
  "error": null,
  "code": 1,
  "msg": null,
  "ok": true
}

字段说明:

  • user_id:匿名用户的唯一标识,由雪花算法生成。
  • token:用户身份认证的 token,后续请求需要携带此 token 进行验证。格式Authorization Bearer Token
  • refresh_token:刷新 token,用于 token 过期后的重新获取。
  • expires_in:token 的有效时间戳,表明 token 的过期时间(秒)。
  • type: 0 匿名 1 普通用户 2 高级用户.

3. 后端代码实现 ​

已经整合到了tio-boot-admin中

路由配置 ​

通过路由配置,将 /api/v1/anonymous/create 请求映射到 AppUserAnonymousHandler::create 方法:

java
r.add("/api/v1/anonymous/create", appUserAnonymousHandler::create);

实体类 ​

UserToken

java
package nexus.io.tio.boot.admin.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class UserToken {
  private String userId;
  private String token;
  private int timeout;
  private String refresh_token;
  private int type;
}

接口层实现 ​

在 AppUserAnonymousHandler 类中,定义了匿名用户创建的处理逻辑。下面是详细代码及解释:

java
package nexus.io.tio.boot.admin.handler;

import nexus.io.jfinal.aop.Aop;
import nexus.io.model.body.RespBodyVo;
import nexus.io.tio.boot.admin.services.AppUserService;
import nexus.io.tio.boot.http.TioRequestContext;
import nexus.io.tio.http.common.HttpRequest;
import nexus.io.tio.http.common.HttpResponse;

public class AppUserAnonymousHandler {
  public HttpResponse create(HttpRequest request) {
    String origin = request.getOrigin();
    HttpResponse response = TioRequestContext.getResponse();

    AppUserService appUserService = Aop.get(AppUserService.class);
    // 注册用户(内部会处理密码加盐和哈希等逻辑)
    RespBodyVo vo = appUserService.createAnonymousUser(origin);
    return response.setJson(vo);

  }
}

说明:

  • 请求来源:通过 request.getOrigin() 获取请求来源信息,该信息可能用于记录或追踪用户来源。
  • 服务注入:通过 AOP 获取 AppUserService 实例,调用匿名用户创建服务。
  • 返回结果:调用服务返回的结果(包含 user_id、token、refresh_token 等)通过 setJson() 方法包装为 JSON 格式返回给前端。

服务层实现 ​

匿名用户的创建业务逻辑封装在 AppUserService 类中,具体代码如下:

java
package nexus.io.tio.boot.admin.services;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.codec.digest.DigestUtils;

import com.jfinal.kit.Kv;
import nexus.io.db.activerecord.Db;
import nexus.io.jfinal.aop.Aop;
import nexus.io.model.body.RespBodyVo;
import nexus.io.model.validate.ValidateResult;
import nexus.io.tio.boot.admin.costants.AppConstant;
import nexus.io.tio.boot.admin.costants.TioBootAdminTableNames;
import nexus.io.tio.boot.admin.vo.AppUser;
import nexus.io.tio.boot.admin.vo.UserResetPasswordRequest;
import nexus.io.tio.utils.environment.EnvUtils;
import nexus.io.tio.utils.jwt.JwtUtils;
import nexus.io.tio.utils.snowflake.SnowflakeIdUtils;
import nexus.io.tio.utils.validator.EmailValidator;
import nexus.io.tio.utils.validator.PasswordValidator;

public class AppUserService {

  public RespBodyVo createAnonymousUser(String origin) {
    long longId = SnowflakeIdUtils.id();
    String userId = longId + "";
    String insertSql = "INSERT INTO app_users (id,of,user_type) VALUES (?,?,0)";

    Db.updateBySql(insertSql, userId, origin);

    // 生成 token,有效期 7 天(604800秒)
    Long timeout = EnvUtils.getLong("app.token.timeout", 604800L);
    Long tokenTimeout = System.currentTimeMillis() / 1000 + timeout;
    String token = createToken(userId, tokenTimeout);
    String refreshToken = createRefreshToken(userId);

    UserToken userToken = new UserToken(userId,token,tokenTimeout.intValue(),refreshToken,0);
    return RespBodyVo.ok(userToken);
  }
}

代码解读:

  • 用户标识生成
    通过 SnowflakeIdUtils.id() 生成一个全局唯一的用户 ID。雪花算法保证了分布式系统中 ID 的唯一性。

  • 数据存储
    使用 Db.updateBySql() 方法,将新生成的用户 ID 和请求的来源信息(origin)插入到数据库中的 app_users 表内。

  • Token 生成

    • 通过读取配置(或使用默认值 604800 秒)确定 token 的有效期。
    • 使用 createToken 方法生成 token,有效期设置为当前时间加上超时时间。
    • 同时生成一个 refresh token,用于在 token 过期后重新获取新的 token。
  • 返回封装
    将生成的 user_id、token、expires_in 和 refresh_token 封装在一个 Kv 对象中,并最终通过 RespBodyVo.ok(kv) 作为响应返回给前端。

4. 总结 ​

本章详细介绍了如何通过一个简单的后端接口实现匿名登录,包括前端请求、后端处理以及 token 生成等关键步骤。通过这种方式,用户无需传统的注册和登录过程,即可快速获得系统访问权限,为后续业务流程的无缝衔接打下基础。

MIT Licensed