内置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

请求步骤

如果使用授权码模式

  1. 先要在内置url/oauth/authorize?response_type=code&client_id=client里请求授权码,还需要Basic认证中输入用户名和密码
    response_type=code表示返回一个code,client_id表示客户端id 这两个是get请求的参数

为什么要用basic认证呢,在security配置中指定,前后端交互时接口调用时更方便
image.png
oauth_client_details表中指定了回显的uri,也指定了自动审批
image-20210201151358429.pngimage-20210201151527304.png
http://localhost:9000/callback 是自己实现的,功能就是传入code参数,直接返回
image-20210201151557372.png

  1. 然后使用返回的code在内置的url/oauth/token里请求令牌,要指定 client_id,grant_type,scope,code
    image-20210201151640622.png
    在Basic中输入client_id和client_secret
    image-20210201151658476.png
    请求令牌是通过basic auth认证,原理:
    将basic的账号密码 转换成请求头里面的一个字符串,是base64加密
    转换如下Base64.getEncoder().encode("client:secret".getBytes()) 请求头前加个Basic
    请求头中key value就是Authorization : Basic Y2xpZW50OnNlY3JldA==

授权码获取令牌,这个授权码只能使用一次

  1. 然后再用令牌去访问资源
    推荐使用jwt令牌,他不需要存储在数据库中,不需要维护

如果使用密码模式就省去第一步

oatuh2分为授权服务和资源服务 授权服务给用户认证权限,发令牌,资源服务根据令牌鉴权

要使用刷新令牌,令牌过期后使用刷新令牌可以获取到最新的令牌,仍然是访问/oauth/token,参数只需要grant_type和refresh_token,请求头中仍然需要basic认证

image-20210209131429274.png

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有效期

image-20210222163726146.png