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,通常多用从新受权。)
三、在请求时,参数中包含重定向地址的,须要和第三方在受权方平台报备时留的地址前部一致
参考: