最近在看第三方登录,一些概念也有些了解。 是否是因为缺少Github客户端导致的? 因为需要一个第三方客户端做授权,如果用web应该是做不了的吧。
可以做,GitHub是基于Auth2.0的,客户端跟web调用方式一样。API需要增加一个接口。
其实没啥更深层次的原因,没做的主要原因就是开发者们比较懒而已
创建一个webview去请求github的auth,监听callback url的重定向,解析出github的accesstoken CNode需要开一个接口,让客户端用github的accesstoken换cnode的accesstoken
@TakWolf 还是需要服务端配合呀!
@TakWolf 用webview去请求是个好思路。查过CNode 数据库并没有存储github的accesstoken,只存储了github_id _。假设这些都修改好,还有一种情况,通过Oauth拿到的token是有时效的(通过GithubAPI没看到时效设置,看起来不过期,但是有些第三方会设置超期机制),这时通过CNode的换token API就会有问题了。服务器的github token和新token不一样。 可能会有这种问题吧?
@awong1900 Github的authtoken确实是有时效的,但是CNode只是在登录的那一刻验证一下githubId,(如果是注册用户,还会获取一下邮箱地址),之后就再也用不到github的authtoken了。API请求全程使用CNode自己的token,所以没这个问题。
@liygheart 有一个hack的思路,github登录之后,让webview默认重定向到CNode,这时候可以获取到CNode的sessionCookie,然后用sessionCookie去抓取设置页面,解析出accessToken
@TakWolf 好像是的,如果CNode没有对github资源请求,并不需要保存github 的token。不需要token换token的API,只需要githubID换token API(同时加clientID和ClientSecert确保合法客户端请求)。 看起来流程比较清楚了。 @liygheart 我发现直接用手机浏览器如chrome就可以做第三方登录。小技巧是CNode客户端做一个Intent Filter监控第三方回调的地址,这个地址会打开客户端,而不是浏览器。 最好的例子是IFTTT的channel绑定。我之前做过一个IFTTT channel server,想起来我的server还是一个第三方呢。 它都是通过web做第三方登录。
研究了一下,思路如下:
初始化一个WebView,载入CNode登录地址:https://cnodejs.org/auth/github
这是简单模式的Auth2.0,clientId是公开的且没有客户端认证
GitHub登录成功后,携带token回调: https://cnodejs.org/auth/github/callback?code=xxxxxxx
CNode验证成功后,会重定向到首页:https://cnodejs.org/
这时截断这个重定向,取出CNode的session_cookie,用这个session_cookie去抓取设置页面:https://cnodejs.org/setting
解析Dom文档,取出accessToken:
<div class='inner'>
<div><span>字符串:</span>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx</div>
<div>
<span>二维码:</span>
<span id="access-token-qrcode"></span>
</div>
CNode的API授权都使用这个accessToken认证