Oauth2.0是第三方接入的一个安全协议
今天查了查Oauth2.0接入原理,感觉挺有意思的
0x01.关于Oauth
Oauth是允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用的协议。
例如我们想要获取github的用户账号信息。
进入到github就能看到,你授权的账号信息了。
0x02.Oauth2.0成员
-
Resource Owner(资源拥有者:用户)
-
Client (第三方接入平台:请求者)
-
Resource Server (服务器资源:数据中心)
-
Authorization Server (认证服务器)
从成员看Oauth2.0基本流程。
原理很简单,用户访问App,App访问Authorization Server请求权限,
Authorization Server得到用户同意后,返回token,
App通过这个token向Authorization Server索要数据,
App只能从Authorization Server这个中介获取服务器数据,而无法直接访问Resource Server。
0x03.Oauth2.0类型
关于Oauth使用情况
Oauth用权限大小可以分为:
-
基础公开的API:站外网站,站外应用等
-
基础公开的API+用户资料:站内应用,移动App,站外使用账号登录
-
基础公开的API+用户所有权限:直接输入密码(Oauth1.0)
关于Oauth提权类型
- #### authorization_code(Oauth提供的token代码): Web-server、apps
- #### implicit(简单模式):Browser-based apps,Mobile apps
-
password(密码模式):Username/password access
-
client_credentials(客户端模式):Application access
其实第一种和第二中是一样的,都是用Oauth Server提供的token实现资源获取,只是获取的资源类型不一样,权限不一样。
authorization_code对应上面讲到得,获取基础公开API,
implicit对应第二种,获取用户信息。
password是种不安全的方式。
client_credentials是不需要Oauth认证的,即直接访问该网站提供的开放的API。
看看例子,从网上偷下来的facebook的Oauth2.0认证:
第一步:
App向 Oauth Server 请求的URL => https://facebook.com/dialog/oauth?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=REDIRECT_URI&scope=email
里面带着该app的id,key,请求的类型,返回一串的access_token和事件类型code。
第二步:
回调,跳转到权限确认页面等待用户确认授权 => https://facebook.com/dialog/oauth?response_type=code&client_id=28653682475872&redirect_uri=example.com&scope=email
该页面通过redirect_uri
,回调到指定的callback页面。
第三步:
利用返回的access_token,将app的id和key以及code代码发包到:POST https://graph.facebook.com/oauth/access_token
这一步是为了获取token。
第四步:
Oauth Server返回token,这个时候,就可以通过token获取用户授权的资源了。
资料参考:
https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2
本文出自 夏日小草,转载请注明出处:http://homeway.me/2014/11/05/how-oauth2-work-1/
-by小草
2014-11-05 01:37:08