OAuth

OAuth的英文全称是Open Authorization,它是一种开放授权协议。OAuth目前共有2个版本,2007年12月的1.0版(之后有一个修正版1.0a)和2010年4月的2.0版,1.0版本存在严重安全漏洞,而2.0版解决了该问题。

OAuth是令牌代替用户密码访问应用的又一标准;其他还是有SSO;

授权模式:

  1、授权码模式(Authorization Code)(正统方式)(支持refresh token)

  2、授权码简化模式(Implicit)(为web浏览器设计)(不支持refresh token)

  3、Pwd模式(Resource Owner Password Credentials) (基本不用)(支持refresh token)

  4、Client模式(Client Credentials) (为后台api调用设计)(不支持refresh token)

  5、扩展模式(Extension)(自定义模式,这个就不介绍了)

1、OAuth2.0最典型的授权码认证方式:

  资源服务器和鉴权服务器都是属于资源所有方,也就是最终的服务提供方,第三接入方需要先与鉴权服务器申请合作获取客户编码。

  对于资源服务器来说,需要做的是

    1、 accessToken和clientId的校验

    2、 token校验通过后要对token访问权限做好限制

  对于鉴权服务器来说,需要做的是

    1、 接受第三方应用的申请,维护clientId

    2 、提供登入页面,做用户、密码鉴权

    3、 授权码生成和验证

    4 、token的生成

    5 、clientId、token的维护,一般clientId入库,token入内存

  OAuth2.0解决的是通过令牌获取某个系统的操作权限,因为有clientId的标识,一次登陆只能对该系统生效,第三方应用的操作用户不是鉴权系统的官方用户,授权权限鉴权中心可以做限制。

2、授权码简化模式,省略了1中客户端获取code然后交换token的过程,授权访问后页面将被重定向到redirect_uri并带有令牌

  授权访问:http://localhost:8080/oauth2/authorize?response_type=token&client_id=testid&redirect_uri=http://localhost/OAuth&scope=read

  授权之后页面将被重定向到redirect_uri并带有令牌:http://localhost/OAuth/#access_token=111111111&token_type=bearer&expires_in=3600

3、Pwd模式请求格式:POST -D "http://localhost/oauth/token?grant_type=password&username=aaa&password=123456&scope=read,write" 

  服务器返回来的访问令牌:

{
  "access_token""9cd23bef-ae56-46b0-82f5-b9a8f78da569",
  "token_type""bearer" ,
  "expires_in"43199 ,
  "scope""read"
}

吃鸡练习

在使用微信授权之前,吃鸡游戏需要先在微信开放平台上注册应用,填写自己的名称、logo、用途等信息,微信开放平台颁发给吃鸡游戏一个应用 ID 和叫 APP Secret 的密钥,在实际对接中,会使用到这两个参数。

创建应用成功后就将获得应用 ClientId 和叫APP Secret 密钥

以下是授权流程

1、用户点击登录按钮

2、页面自动跳转到初始参数中redirect_uri 定义的那个URL,并自动在 URL 末尾添加一个 code 参数

3、吃鸡游戏通过上一步获取的 code 参数换取 Token,Token 就是前文中说到的信用凭证

  要包含以下参数:

  1、client_id:在微信开放平台申请的应用 ID

  2、client_secret:在微信开放平台申请时提供的APP Secret

  3、grant_type:需要填写authorization_code

  4、code:上一步获得的 code

  5、redirect_uri:回调地址,需要与注册应用里的回调地址以及第一步的 redirect_uri 参数一致

4、通过第3步的请求,接口返回 Token 和相关数据:

  

{
 "access_token": "ACCESS_TOKEN",//Token 的值
 "expires_in": 1234,//过期时间
 "uid":"122222"//当前授权用户的UID。
}

5、在第4步中获取了access_token ,使用它,就可以去获取用户的资源了

6、最后一步,微信返回用户信息,吃鸡游戏进行处理,整个流程结束。

通过以上的方式,在微信和吃鸡游戏中间建立了一个独立的权限层,这个权限由用户赋予,可以被用户随时取消,不同第三方应用之间相互独立,互不干扰,这样就彻底解决了明文存放账号密码的问题。

 参考图

注意:

  1、code时效较短,多为10s-10min,每次获得的code仅可使用一次,且code与client_id和redirect_uri有 一一对应关系。

  2、access token 有过期时间,多为10-15天。(过期处理有2种,请求用户重新授权/refreshToken,一般多用重新授权。)

  3、在请求时,参数中包含重定向地址的,需要和第三方在授权方平台报备时留的地址前部一致

参考:

  OAuth 2.0 的四种方式

  GitHub OAuth 第三方登录示例教程

  

原文地址:https://www.cnblogs.com/hofmann/p/10846310.html