本文梳理oauth2登录,刷新,注销对内存中token和refresh token的操作,同时提供客户端使用token的方案。

 

一、Spring Security OAuth2提供操作token的接口:

 

接口
grant_type参数 说明
类DefaultTokenServices
/oauth/token password 登录获取token
方法createAccessToken
/oauth/token refresh_token 刷新token
方法refreshAccessToken
/auth/revokeToken自定义   自定义注销
方法revokeToken

 

继续参考下一个表对DefaultTokenServices详细说明

 

二、类DefaultTokenServices

 

本质上是DefaultTokenServices类对token和refresh token的操作,所以梳理这个类就可以。

 

针对一个client and username

 

方法

规则

等录createAccessToken方法

    1. 如果存在token,则更新用户信息,复用原来token/refresh token,时间继续计算,直接返回token(这里客户端无法判断refresh token过期时间)

    2. 如果存在token,刚好过期,则重新生成token, 复用原来refresh token, 所有时间重新计算;

    3. 如果不存在token,则新生成token/refresh token , 时间也是新的;

    刷新refreshAccessToken方法

      1. 如果不存在或者过期refresh token,抛出异常/客户端返回403;

      2. 如果存在refresh token, 删除所有旧的相关token, 生成新的token(新时间)

      3. 判断是否复用refresh token, 复用则不重新生成refresh token; 不复用, 则新生成refresh_token, 时间也刷新

       

      注销revokeToken方法

        1. 查询token存在时候, 删除token/refresh token;

        2. 查询token不存在时候, 不进行操作;

         

        注意:在公众号回复关键字:token 

        可以获取更多资料

        Spring Security OAuth2 之token 和 refresh token

         

        三、客户端使用token步骤

         

        业务方服务端使用token方案:(token设置有效期30天,refresh token有效期大于30天/如果永久有效有风险)

         

        以下是处理token步骤:

         

        1. 登录获取token和refresh token

        {    

        "access_token": "5427cac5-9e00-4e01-8cec-b4d36ca7d5fa",


        "token_type": "bearer",


        "refresh_token": "c169fcc7-4f75-497d-8f6b-4862f5a36d18",


        "expires_in": 5,


        "scope": "write api"

        }

         

        2. 在token有效期内, 用refresh token刷新token获取新token

        {    

        "access_token": "66cd5f7c-9b38-4261-9871-595f9748f6b6",

        "token_type": "bearer",


        "refresh_token": "c169fcc7-4f75-497d-8f6b-4862f5a36d18",


        "expires_in": 9,


        "scope": "write api"

        }

        3. 如果refresh token 刷新token时候403, 则进行第1步登录获取token和refresh token

         

         http status 403 Forbidden

        {

        "code": 400,


        "message": "Invalid refresh token: c169fcc7-4f75-497d-8f6b-4862f5a36d19",


        "data": null

        }

         

        相关文章: