OAuth

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

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

受权模式:github

  一、受权码模式(Authorization Code)(正统方式)(支持refresh token)web

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

  三、Pwd模式(Resource Owner Password Credentials) (基本不用)(支持refresh token)浏览器

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

  五、扩展模式(Extension)(自定义模式,这个就不介绍了)服务器

一、OAuth2.0最典型的受权码认证方式:微信

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

  对于资源服务器来讲,须要作的是

    一、 accessToken和clientId的校验

    二、 token校验经过后要对token访问权限作好限制

  对于鉴权服务器来讲,须要作的是

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

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

    三、 受权码生成和验证

    4 、token的生成

    5 、clientId、token的维护,通常clientId入库,token入内存

  OAuth2.0解决的是经过令牌获取某个系统的操做权限,由于有clientId的标识,一次登录只能对该系统生效,第三方应用的操做用户不是鉴权系统的官方用户,受权权限鉴权中心能够作限制。

二、受权码简化模式,省略了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

三、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 密钥

如下是受权流程

一、用户点击登陆按钮

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

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

  要包含如下参数:

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

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

  三、grant_type:须要填写authorization_code

  四、code:上一步得到的 code

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

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

  

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

五、在第4步中获取了access_token ,使用它,就能够去获取用户的资源了

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

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

 参考图

注意:

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

  二、access token 有过时时间,多为10-15天。(过时处理有2种,请求用户从新受权/refreshToken,通常多用从新受权。)

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

参考:

  OAuth 2.0 的四种方式

  GitHub OAuth 第三方登陆示例教程

相关文章
相关标签/搜索