为什么cnode客户端不用github第三方登录,而是用扫码方式
发布于 1 个月前 作者 awong1900 738 次浏览 来自 问答

最近在看第三方登录,一些概念也有些了解。 是否是因为缺少Github客户端导致的? 因为需要一个第三方客户端做授权,如果用web应该是做不了的吧。

9 回复

可以做,GitHub是基于Auth2.0的,客户端跟web调用方式一样。API需要增加一个接口。

其实没啥更深层次的原因,没做的主要原因就是开发者们比较懒而已

@TakWolf 手机上授权要打开一个网页登录github然后app里怎么获取登录成功后授权的数据呢?

来自酷炫的 CNodeMD

@liygheart

创建一个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做第三方登录。

@awong1900

研究了一下,思路如下:

初始化一个WebView,载入CNode登录地址:https://cnodejs.org/auth/github

这句会重定向到:https://github.com/login/oauth/authorize?response_type=code&redirect_uri=http://cnodejs.org/auth/github/callback&client_id=0625d398dd9166a196e9

这是简单模式的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认证

https://github.com/TakWolf/CNode-Material-Design/issues/37

回到顶部