权限验证——OAuth2

谁说我不能喝 提交于 2019-12-15 12:47:14

什么是OAuth2

OAuth2是开放授权的一个标准,旨在让用户允许第三方应用去访问改用户在某服务器中的特定私有资源,而可以不提供其在某服务器的账号密码给到第三方应用。

通俗的话可以这样去理解,假如你们公司正在开发一个 第三方应用XXX,该应用会需要在微信中分享出来一个活动页,该活动需要让微信用户去参与,你们的应用需要收集到用户的姓名,头像,地域等信息,那么问题来了?你的应用如何才能拿到所有参与活动的微信用户的基本信息呢?

OAuth2分为四个角色:

  • Resource Owner:资源所有者
  • Resource Server:资源服务器
  • Client:第三方应用客户端
  • Authorication Server:授权服务器

OAuth2 授权流程

在这里插入图片描述

角色 功能 备注
认证服务器 提供授权实现 提供类似获取授权许可(code),访问令牌(access_token)等接口
资源服务器 提供第三方应用程序注册接口以及开放相应受保护资源的API 第三方应用注册,是为了保证第三方应用的来源安全性
第三方应用 申请注册成为资源服务器的第三方应用以及消费资源服务器提供的受限资源API 类似微信公众号申请操作,由授权服务器提供标识第三方应用的 app_id & app_secret
用户 不需要做什么额外的改动,只需要点击确认授权即可

OAuth2中的授权许可

  • 授权码 Authorization Code
  • 隐式许可 Implicit
  • 资源所有者密码凭证 Resource Owner Password Credentials
  • 客户端凭证 Client Credentials

Authorization Code

在这里插入图片描述 步骤:

  • 授权码请求
    第三方应用使用用户代理(浏览器,或自己的服务器)访问授权服务器提供的一个url,该url就是提供获取授权码的url,第三方应用需要传递一下参数
    response_type:(必传)此时为"code"     
    app_id:(必传)微信服务器下发的标识第三方应用的
    redirect_uri:(必传)授权成功后的重定向地址
    scope:(可选)标识授权范围
    state:(推荐)第三方应用提供的一个字符串,微信授权服务器会原样返回
  • 授权码返回
    授权服务器验证第三方应用再上一步中传递的参数,确认无误后会提供一个页面给微信用户a登录或者手动确认授权操作,操作超过后微信授权服务器会根据redirect_uri重定向到该地址,并携带下发的授权许可code
  • 访问令牌请求
    第三方应用根据上一步拿到的授权码code以及app_id,重定向地址等参数,再次请求信授权服务器,请求获取访问令牌access_token
    grant_type:(必传)值为"authorization_code"    code:(必传)值为上一步获取到的授权码code    redirect_uri:(必传)必须和第一步获取授权码中的一致    app_id:(必传)标识第三方应用id
  • 访问令牌返回
    授权服务器返回访问令牌和一些刷新令牌,令牌过期时间等信息给到第三方应用
	//返回示例	 HTTP/1.1 200 OK    Content-Type: application/json;charset=UTF-8    {       "access_token":"2YotnFZFEjr1zCsicMWpAA",       "token_type":"example",       "expires_in":3600,        "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",        "example_parameter":"example_value"    }
  • 受限资源获取

Resource Owner Password Credentials Grant

该授权模式是第三方应用直接使用微信用户a的账号+密码来直接请求微信授权服务器access_token,该模式适用于微信资源服务器高度信任第三方client的情况

  • 访问令牌请求
 	grant_type:(必填)值固定为 "password"    user_name:(必填)微信用户登录名    password:(必填)用户登录密码    scope:可选 标识授权范围
  • 访问令牌返回
	HTTP/1.1 200 OK    Content-Type: application/json;charset=UTF-8    {       "access_token":"2YotnFZFEjr1zCsicMWpAA",       "token_type":"example",       "expires_in":3600,        "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",        "example_parameter":"example_value"    }

  • 授权返回

OAuth2 刷新令牌

在上述第三方应用获取到访问令牌后,一般会同时得到一个过期时间以及刷新令牌,以在访问令牌失效时可以由第三方应用自动获取新的访问令牌,而不是由微信用户a再次授权一遍。

    grant_type:必填 值为 "refresh_token"    refresh_token:必填 值为第三方应用得到访问令牌同时拿到的刷新令牌


认证服务器主要包含了四种授权模式的实现和Token的生成与存储,我们也可以在认证服务器中自定义获取Token的方式。
资源服务器主要是在Spring Security的过滤器链上加了OAuth2AuthenticationProcessingFilter过滤器,即使用OAuth2协议发放令牌认证的方式来保护我们的资源。

在同时定义了认证服务器和资源服务器后,再去使用授权码模式获取令牌可能会遇到 Full authentication is required to access this resource 的问题,这时候只要确保认证服务器先于资源服务器配置即可,比如在认证服务器的配置类上使用@Order(1)标注,在资源服务器的配置类上使用@Order(2)标注。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!