spring security Oauth开发APP认证2

1、OAuth协议标准流程:

    绿色表示spring oauth已经帮我们实现了,只需要2个注解就可以实现认证服务器和资源服务器,橘黄色的需要我们自己实现。

Oauth2AuthenticationProcessingFilter:

    被添加到springSecurity过滤器链上,从请求中拿出token,然后根据配置的存储策略,拿出用户信息,判断用户信息是否存在,是否有权限等等判断来决定能否访问资源。

1)、对于前后端分离的项目来说,我们后台系统相当于服务端,充当认证服务器和资源服务器。

   Oauth协议中的授权码模式,对于认证服务器需要提供2个地址给第三方:让用户跳过来点授权的地址、点完授权后回到客户端,客户端拿着授权码换AccessToken的地址。

  默认分别是:/oauth/authorize 和  /oauth/token 

2)、默认情况下,认证服务器需要 ROLE_USER 角色才能访问。

3)、同一个用户,在有效期内多次获取token是一样的。

4)、通过以上获取的token就可以访问后端资源,在请求头加上:Authorization:bearer access_token

5)、以上是spring oauth默认的流程,但是存在问题:

  a)只有标准的4种授权模式,怎么将我们用户名密码登录、短信验证码登录、社交登录这3种方式嫁接到标准的体系去,让这3种模式登录成功后也返回token。

  b)access_token默认是存在内存中的,重启就失效。

 

2、跟踪spring security oauth源码:

  绿色表示实体类,蓝色表示接口,括号为实现类。

 ClientDetailsService:用来读取第三方应用的信息。
 clientDetails:封装了第三方应用的信息。
 TokenRequest:封装了请求的其它信息
 tokenGranter:封装了4种授权模式和刷新令牌模式,根据授权类型确定令牌生成器。
 OAuth2Authentication:封装了哪个三方应用在请求哪个用户授权,授权模式是什么,请求的参数是什么。
 TokenStore:令牌的存取。
 TokenEnhancer:令牌的增强器。

 

3、核心代码:

 1)不同的授权模式会有不同的tokenGranter来处理,例如密码模式,产生OAuth2Authentication代码中,会根据之前用户名密码的认证逻辑去生成一个经过认证了的Authentication

 2)token的存储,会将已经经过认证了的Authentication和产生的accessToken进行关联,存储到内存或者redis中,供后面资源服务器使用。

 

 

4、获取token流程:

1)、第三方根据oauth/authorize去获取授权码,URL为:
http://localhost:8080/oauth/authorize?response_type=code&client_id=guangxun&redirect_uri=http://www.gxtest.com&scope=all
弹出提示框提示输入用户名密码。
PS:后台扮演的是服务提供商,类似QQ微信的角色,上面的地址是提供给第三方也就是我们的app去引导用户来授权,作为服务商来说,需要知道三件事:
1、哪一个应用在请求授权(通过client_id),
2、在请求我的哪个用户给第三方授权(输入的用户名密码),
3、给第三方什么授权(scope参数,他是服务提供商自己定义的,可以定义任意字符串,第三方请求时带上这个参数告诉服务提供商请求什么授权)。
同意授权后返回:上面的redirect_url?code=GANRNc,授权码只能用一次。redirect_uri仍然是跳转到第三方。
2)、根据授权码获取token,这里涉及到4种授权模式:
URL:http://localhost:8080/oauth/token?grant_type=authorization_code&code=bi4KMi&redirect_uri=http://www.gxtest.com&client_id=guangxun&scope=all
client:secret 使用base64工具编码:Y2xpZW50OnNlY3JldA== 最后在请求头添加:"Authorization" : "Basic Y2xpZW50OnNlY3JldA=="
restlet client工具测试post,get请求。
 
5、四种授权模式:
1)授权码模式:
Authorization: Basic Z3Vhbmd4dW46Z3Vhbmd4dW5TZWNyZXQ=
Content-Type: application/x-www-form-urlencoded

 2)密码模式:

3)刷新令牌:

返回token格式:同一用户反复获取access_oken时,会判断当前用户是否发过access_oken,如果发过就会把之前没过期的access_oken发给用户。

 

 

posted on 2020-03-28 23:31  好好学习,天天睡觉  阅读(633)  评论(0)    收藏  举报