描述一下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 | status 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 | { |
服务器取到access_token,返回给客户端
可以参照github第一步的返回,同样给客户端返回一个重定向请求,其中包含了access_token等信息。webview则不再跳转,捕获其中的信息。
1
2
3
4
5
6
7
8
9
10
11
12
webView.setWebViewClient(new WebViewClient() {
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);
}
});
1 | webView.setWebViewClient(new WebViewClient() { |