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、在请求时,参数中包含重定向地址的,需要和第三方在授权方平台报备时留的地址前部一致
参考: