匿名登录
本章介绍如何创建匿名用户,以及在前后端交互中如何利用匿名登录接口完成用户身份的验证和授权。文档中包含了登录流程、接口说明、代码实现及其背后的关键技术细节和设计思路。
1. 登录流程
匿名登录流程主要包括以下两个步骤:
前端请求
前端向后端发起请求,通过调用匿名登录接口,获取匿名用户的相关信息。该接口会在服务端自动创建一个匿名用户,并返回该用户的唯一标识(user_id)以及用于后续认证的 token 和 refresh token。后续请求认证
前端在后续需要进行身份验证的请求中,需要携带第一次请求返回的 token,以便后端对用户进行身份验证。这样就无需用户手动注册或登录,便能实现快速访问。
2. 接口说明
接口地址
GET /api/v1/anonymous/create
响应示例
当调用接口成功时,服务器会返回如下 JSON 格式的数据:
{
"data": {
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOi0xLCJ1c2VySWQiOiI0ODgzMzAxMTc1NDQ5NjQwOTYifQ==.xxXrgOk7hdYGM-XlMuJv2VKB7jr95_XnbYh5tZ3m_9k",
"user_id": "488330117544964096",
"expires_in": 1742107772,
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDIxMDc3NzIsInVzZXJJZCI6IjQ4ODMzMDExNzU0NDk2NDA5NiJ9.ppUn-GrM2cB4yAALPWmYZFhPvQQpZ93ARpJpocmsB1o"
},
"error": null,
"code": 1,
"msg": null,
"ok": true
}
字段说明:
- user_id:匿名用户的唯一标识,由雪花算法生成。
- token:用户身份认证的 token,后续请求需要携带此 token 进行验证。
- refresh_token:刷新 token,用于 token 过期后的重新获取。
- expires_in:token 的有效时间戳,表明 token 的过期时间(秒)。
3. 代码实现
路由配置
通过路由配置,将 /api/v1/anonymous/create
请求映射到 AppUserAnonymousHandler::create
方法:
r.add("/api/v1/anonymous/create", appUserAnonymousHandler::create);
处理逻辑:创建匿名用户
在 AppUserAnonymousHandler
类中,定义了匿名用户创建的处理逻辑。下面是详细代码及解释:
package com.litongjava.tio.boot.admin.handler;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.model.body.RespBodyVo;
import com.litongjava.tio.boot.admin.services.AppUserService;
import com.litongjava.tio.boot.http.TioRequestContext;
import com.litongjava.tio.http.common.HttpRequest;
import com.litongjava.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
类中,具体代码如下:
package com.litongjava.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 com.litongjava.db.activerecord.Db;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.model.body.RespBodyVo;
import com.litongjava.model.validate.ValidateResult;
import com.litongjava.tio.boot.admin.costants.AppConstant;
import com.litongjava.tio.boot.admin.costants.TioBootAdminTableNames;
import com.litongjava.tio.boot.admin.vo.AppUser;
import com.litongjava.tio.boot.admin.vo.UserResetPasswordRequest;
import com.litongjava.tio.utils.environment.EnvUtils;
import com.litongjava.tio.utils.jwt.JwtUtils;
import com.litongjava.tio.utils.snowflake.SnowflakeIdUtils;
import com.litongjava.tio.utils.validator.EmailValidator;
import com.litongjava.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) VALUES (?,?)";
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);
Kv kv = Kv.by("user_id", userId).set("token", token).set("expires_in", tokenTimeout.intValue())
//
.set("refresh_token", refreshToken);
return RespBodyVo.ok(kv);
}
}
代码解读:
用户标识生成
通过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)
作为响应返回给前端。
5. 总结
本章详细介绍了如何通过一个简单的后端接口实现匿名登录,包括前端请求、后端处理以及 token 生成等关键步骤。通过这种方式,用户无需传统的注册和登录过程,即可快速获得系统访问权限,为后续业务流程的无缝衔接打下基础。