0%

做个笔记吧,OAuth2

描述一下github的第三方登录

Github OAuth文档
this is a description of the OAuth2 flow from 3rd party web sites.


Redirect users to request GitHub access

GET https://github.com/login/oauth/authorize
Parameters:

字段名称 作用
client_id Required,在github注册你的应用的时候从github获取的id
redirect_uri optional,在github注册应用时你必须有你的重定向uri,这个参数必须和那个要一致
scope optional,使用github功能的权限范围
state optional,一个随机字符串,用途:加强登录安全性
allow_signup optional,是否允许未经验证的用户登录,默认是允许true

Response:

1
2
3
4
status code:  
302
response headers:
Location: http://example.com/login/third?code=***

实际操作(编程实现):
android中用一个webview打开该URL,webview.loadUrl()
Example URL: https://github.com/login/oauth/authorize?client_id=xxx&redirect_uri=xxx&scope=xxx

结果:
这时候打开的是一个github官方登录移动网页版,客户端也不会接触到用户的用户名和密码,更不可能保存了。安全。
输入用户名,密码成功登录后,github会返回一个重定向要求,重定向链接格式是参数:redirect_uri?code=***,例子 http://example.com/login/third?code=***。code参数是github帮你加上的。


Github redirects back to your site.

客户端的webview会自动请求链接 http://example.com/login/third?code=***,这样你的服务器便收到了该请求,取到下一步需要的code。下一步的登录请求在服务端完成(我做的例子因为没有服务器所以在客户端做了)。

Exchange this for an access token:
POST https://github.com/login/oauth/access_token
Parameters:

字段名称 作用
client_id Required,在github注册你的应用的时候从github获取的id
client_secret Required,在github注册你的应用的时候从github获取的secret,不要泄露,不要存放到客户端
code Required,上一步获取的code字符串
redirect_uri optional,同上
state optional,第一步提供的随机字符串,如果第一步提供,那么github会随同code一起返回的

Response:
多种格式,可以在请求头明确返回格式,如Accept: application/json,则返回json格式

1
2
3
4
5
{
"access_token":"e72e16c7e42f292c6912e7710c838347ae178b4a",
"scope":"repo,gist",
"token_type":"bearer"
}

服务器取到access_token,返回给客户端

可以参照github第一步的返回,同样给客户端返回一个重定向请求,其中包含了access_token等信息。webview则不再跳转,捕获其中的信息。

1
2
3
4
5
6
7
8
9
10
11
12
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d("webView url", url);
if (url.startsWith(DEFINE_YOUR_UNIQUE_URI)) {
Uri uri = Uri.parse(url);
String token = uri.getQueryParameter("access_token");
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
});

更好的学习在这里