前言
目录
通过本文你会掌握以下知识点:
-
如何用
认证服务
做登录认证。 -
如何生成 JWT 令牌(Token)
-
如何用 Gateway 对 Token 验证。
-
Gateway 如何从 Token 中拿到用户信息并转发给业务服务。
-
业务服务如何从请求中拿到身份信息处理业务逻辑。
-
如何刷新令牌。
在讲解之前有必要澄清下什么是认证、授权、凭证,这三个方面是一个系统中最基础的安全设计。
认证、授权、凭证
1.1 认证(Authentication)
认证表示你是谁。系统如何正确分辨出操作用户的真实身份,比如通过输入用户名和密码来辨别身份。
1.2 授权(Authorization)
授权表示你能干什么。系统如何控制一个用户能看到哪些数据和操作哪些功能,也就是具有哪些权限。
1.3 凭证(Credential)
表示你如何证明你的身份。系统如何保证它与用户之间的承诺是双方当时真实意图的体现,是准确、完整和不可抵赖的。
接下来我们看下使用 JWT 作为凭证完成认证的原理。
认证的原理
在如下的认证时序图中,有以下几种角色:
-
客户端:表示 APP 端或 PC 端的前端页面。
-
网关:表示 Spring Cloud Gateway 网关服务,这里。
-
认证服务:用来接收客户的登录请求、登出请求、刷新令牌的操作。
-
业务服务:和系统业务相关的微服务。
认证和校验身份的流程如下所示:
认证和校验身份流程
① 用户登录 :客户端在登录页面输入用户名和密码,提交表单,调用登录接口。
② 转发请求 :这里会先将登录请求发送到网关服务 passjava-gateway,网关对于登录请求会直接转发到认证服务 passjava-auth。(网关对登录请求不做 token 校验,这个可以配置不校验哪些请求 URL)
③ 认证 :认证服务会将请求参数中的用户名+密码和数据库中的用户进行比对,如果完全匹配,则认证通过。
④ 生成令牌 :生成两个令牌: access_token
和 refresh_token(刷新令牌),刷新令牌我们后面再说,这里其实也可以只用生成一个令牌 access_token。令牌里面会包含用户的身份信息, 如果要做权限管控 ,还需要在 token 里面包含用户的权限信息,权限这一块不在本篇展开,会放到下一篇中进行讲解。
⑤ 客户端缓存 token :客户端拿到两个 token 缓存到 cookie 中或者 LocalStorage 中。
⑥ 携带 token 发起请求 :客户端下次想调用业务服务时,将 access_token 放到请求的 header 中。
⑦ 网关校验 token :请求还是先到网关服务,然后由它校验 access_token 是否合法。如果 access_token 未过期,且能正确解析出来,就说明是合法的 access_token。
⑧ 携带用户身份信息转发请求 :网关将 access_token 中携带的用户的 user_id 放到请求的 header 中,转发给真正的业务服务。
⑨ 处理业务逻辑 :业务服务从 header 中拿到用户的 user_id,然后处理业务逻辑,处理完后将结果原路返回给客户端。
接下来我们看下项目的整体架构。
项目整体结构
Github 项目地址:https://github.com/Jackson0714/PassJava-Platform Gitee 项目地址:https://toscode.gitee.com/jayh2018/PassJava-Platform
-
认证服务:passjava-auth
-
网关服务:passjava-gateway
-
JWT 公共项目:passjava-jwt,认证服务和网关服务都会引用这个公共项目。
-
业务服务:passjava-member,会员服务作为本次案