基于Token的身份认证方法

1.基于 Token 的身份验证方法

 使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

  1. 客户端使用用户名跟密码请求登录
  2. 服务端收到请求,去验证用户名与密码
  3. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
  4. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
  5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
  6. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

2.使用 uuid 作为 token 的安全性问题

客户端登录后,生成一个 uuid 作为 token 并通过 token:user_id 的方式添加到 redis 缓存中。
在请求接口的时候,获取客户端传递过来的 token查找缓存获取 user_id 进而获取用户信息,处理请求。

那么问题来了,在这一过程中,如何验证 token 是否合法呢?例如:我也随机生成 uuid,然后将其作为 token 去请求接口,如果恰好命中了缓存中存在的 token,在有效期内就能用这个 token 去请求接口了!

uuid的最大特性就是:不可能重复。
拿到uuid(token)就可以认为是已授权。
为了安全起见,你也可以加一些别的验证。比如:登录校验成功后,往redis了记录的时候,同时保存一下客户IP、UserAgent。下次有请求的时候,同时校验这两个。

3.代码示例

3.1、用户登录成功后,生成token并返回当前用户登录信息和token信息。

TokenModel token = manager.createToken(user);
meta.setMeta(Constants.RESPONSE_SUCCESS, messageSource.getMessage("core.user.login.success", null, Locale.CHINA));
Map<String, Object> rm = new HashMap<String, Object>();
rm.put("userinfo", user);
rm.put("token", token.getAuthorization());
meta.setData(rm);

3.2、基于uuid添加用户、访问时间等生产TokenModel。

public TokenModel createToken(User user) {
         //使用uuid作为源token
        String token = UUID.randomUUID().toString().replace("-", "");
        TokenModel model = new TokenModel(user.getUserno(), token);
        model.setUser(user);
        //添加客户端标识
        String clienttype = request.getParameter("clienttype");
        model.setClienttype(clienttype==null?Constants.WEB:clienttype);
        //设置客户语言
        //。。。。。。。。。。
        //设置访问时间
        model.setLastAccessedTime(System.currentTimeMillis());
        TOKENMANAGER.put(user.getUserno(), model);

        return model;
    }

3.3、获取token信息。

public String getAuthorization() throws Exception {
        return UserUtil.encryptPassowrd(userNo + "_" + token, TOKEN_KEY);
}

4.小结

  • 如果API设计成规范的无状态RESTful,考虑使用token
  • 如果API被不同终端消费,Cookie受限,考量token
  • 如果采用SPA,而且没有服务端渲染(或者很少),考量token
  • 如果没有考量这些玩意儿,选择Cookie Session机制吧
  • cookie存在浏览器,不安全;
  • session存在服务器,可能影响性能;
  • token身份认证安全性好,是唯一的。

猜你喜欢

转载自blog.csdn.net/liberty12345678/article/details/82418814