内置url
| url | 作用 | 参数 | method |
|---|---|---|---|
| /oauth/authorize | 获取授权码(授权码模式可以用) | response_type,client_id | GET |
| /oauth/token | 获取令牌 | client_id,grant_type,scope,使用Basic的客户端id和秘钥 | POST |
| /oauth/check_token | 解析令牌 | token | POST |
| /oauth/token_key | 获取令牌密钥 | GET |
请求步骤
如果使用授权码模式
- 先要在内置url
/oauth/authorize?response_type=code&client_id=client里请求授权码,还需要Basic认证中输入用户名和密码
response_type=code表示返回一个code,client_id表示客户端id 这两个是get请求的参数
为什么要用basic认证呢,在security配置中指定,前后端交互时接口调用时更方便
oauth_client_details表中指定了回显的uri,也指定了自动审批

http://localhost:9000/callback 是自己实现的,功能就是传入code参数,直接返回
- 然后使用返回的code在内置的url
/oauth/token里请求令牌,要指定 client_id,grant_type,scope,code
在Basic中输入client_id和client_secret
请求令牌是通过basic auth认证,原理:
将basic的账号密码 转换成请求头里面的一个字符串,是base64加密
转换如下Base64.getEncoder().encode("client:secret".getBytes())请求头前加个Basic
请求头中key value就是Authorization : Basic Y2xpZW50OnNlY3JldA==
授权码获取令牌,这个授权码只能使用一次
- 然后再用令牌去访问资源
推荐使用jwt令牌,他不需要存储在数据库中,不需要维护
如果使用密码模式就省去第一步
oatuh2分为授权服务和资源服务 授权服务给用户认证权限,发令牌,资源服务根据令牌鉴权
要使用刷新令牌,令牌过期后使用刷新令牌可以获取到最新的令牌,仍然是访问/oauth/token,参数只需要grant_type和refresh_token,请求头中仍然需要basic认证

oauth中需要用到框架指定的数据库,如果使用jwt令牌,就只需要用到oauth_client_details表
在每个ResourceServer实例上设置resourceId,该resourceId作为该服务资源的唯一标识。(假如同一个微服务资源部署多份,resourceId相同)
如果没设置,就是对所有的Resource Server都有访问权限
jwt注销问题
jwt是无状态的,不需要存储在任何地方,所以jwt在过期之前是一直可以使用的,为了注销时使jwt失效,可以将注销的jwt存入redis黑名单中,网关接收到请求头中的token进行黑名单判断即可
不用将整个jwt存入redis,把jwt中的唯一标识jti作为key存入就行了,过期时间为value,根据剩余时间设置redis有效期

