
使用 Authing 可以轻松接入许多社会化登录,同时无需翻看社会化登录提供方的繁琐接入文档,让开发者更加专注业务从而提升开发效率。
这看起来很方便,But,通过 Authing 登录的社会化登录用户,无法获取更高级的权限!以 Github 举例:授权域功能上线之前,通过 Authing 登录的 Github 用户无法授权读写仓库、读写 Issues 等权限;此功能上线后,通过 Authing 登录的 Github 用户将拥有这些高阶权限的授权能力。如 Github 授权域(图中的 Scope 参数):
QQ 授权域(图中的 Scope 参数):
微博授权域(图中的 Scope 参数):
开发者只需要勾选以上 checkbox 就可以很方便的拥有这些能力!授权流程用户通过 Authing 登录;
用户在 Authing 登录界面中点击「使用 Github 登录」;
用户通过 Github 登录后 Authing 将 Github 的信息集成到 Authing 用户信息中;
Authing 返回 Code 给开发者配置好的 redirct_uri;
开发者使用 Code 换取 access_token;
开发者使用 access_token 换取用户信息;
开发者在用户信息中获取用户在 Github 平台的 access_token,然后获取操作 Github 的更高级权限;
开发者完成用户认证并开始引导用户执行业务流程;
开启社会化登录授权域创建 Github 应用在 Github 申请 OAuth 应用,同时授权回调地址填写 Authing 提供的地址:https://oauth.authing.cn/oauth/github/redirect,如下图所示:
创建完成后记录 Client ID 和 Client Secret:
配置社会化登录在Authing 控制台中依次点击第三方登录 -> 社会化登录 -> Github,打开 Github 登录,填写 Github OAuth 应用信息,并在 Scopes 多选框中勾选 repo,最后点击确定:
repo 授权域的作用是授权第三方应用读写 Github 仓库的权限。如果你想了解其他 Scope 的含义,请查看这篇文档:https://docs.authing.cn/authing/advanced/social-login/social-login-scopes。体验拥有更高权限的 Github 登录访问登录页面在 Authing 控制台 > 第三方登录 > OIDC 应用,找到你的 OIDC 应用,点击体验按钮。
如果没有 OIDC 应用,请先创建 OIDC 应用。转到登录界面后,点击「使用 Github 登录」,如下图所示:
在弹出的窗口中,与 Github 完成登录认证,之后会显示确权页面,可见此处提示需要授权 repo,如下图所示:
点击授权按钮,之后是 Authing 单点登录中的确权环节:
点击「授权登录」,之后会跳转到在 OIDC 应用中设置的业务回调地址:
获取到 code 之后,你可以参考以下链接完成登录:1. https://docs.authing.cn/authing/advanced/oidc/oidc-authorization#04-shi-yong-code-huan-qu-token获取社会化登录 token那么接下来如何从 Authing 获取并使用 Github 的 access_token,使用更高级的权限呢?只要获取用户资料即可,Github 的 access_token 存在用户资料中。以下以 Authing Node.js SDK 来举例:安装 authing-js-sdk:$ npm install authing-js-sdk初始化 SDK 并获取用户资料:const Authing = require('authing-js-sdk');const userPoolId = "你的用户池 ID";const secret = "你的用户池 Secret";let authing = new Authing({ userPoolId, secret});async function go() { let user = await authing.user({id: 'Authing 用户 ID'}); console.log(user);}go();返回结果:{ ... "thirdPartyIdentity": { "provider": "github", "refreshToken": null, "expiresIn": null, "updatedAt": "2020-02-11T21:56:50+08:00", "accessToken": "1a20a073f967264a7e7d05528236525b1376a4a9" } ...}使用社会化登录 token从上一步的返回结果中取出 Github Token 后,调用读取用户仓库信息的 API:$ curl -H "Authorization: token 1a20a073f967264a7e7d05528236525b1376a4a9" https://api.github.com/user/repos\?visibility\=private可以看到返回了用户的私有仓库信息:
刷新社会化登录 token如果社会化登录方的 token 在一定时间后失效,会导致旧的 token 无法访问社会化登录方的服务,因此需要刷新社会化登录方的 token,并使用新的 token 调用相关服务。你可以调用 SDK 中的 refreshThirdPartyToken 方法来刷新社会化登录 token:const Authing = require('authing-js-sdk');const userPoolId = "你的用户池 ID"const secret = "你的用户池 Secret"let authing = new Authing({ userPoolId, secret})async function go() { let res = await authing.refreshThirdPartyToken('Authing 用户 ID'); console.log(res);}go();
返回结果:{ refreshSuccess: true, message: 'github token 无需刷新,官网文档已说明长期有效', provider: 'github', refreshToken: null, accessToken: '1a20a073f967264a7e7d05528236525b1376a4a9', updatedAt: '2020-02-11T21:57:04+08:00'}由于 Github 不提供 refresh_token 并且 access_token 长期有效,所以此处其实并未真正刷新 token。其他社会化登录方如微信、QQ 提供刷新 token 功能,通过 SDK 刷新 token 时,Authing 会发出刷新 token 请求,并返回新的 accessToken 和 refreshToken。总结以上就是 Authing + Github 社会化登录的使用方式。总结起来,Authing 帮你省去了服务器处理 OAuth 2.0 协议中 code 换 token,token 换用户信息的过程,能够直接将用户信息返回给你。同时 Authing 易用的 SDK 能够帮你快速接入获取、刷新用户社会化登录 token 的功能。如果你还需要其他社会化登录,比如微博、微信,那么此时的身份整合与管理作用的优势就体现出来,同时你也无需阅读国内质量参差不齐的授权登录开发文档。你只需要填写配置信息,Authing 会帮你拼接授权 URL 链接,Authing 会帮你处理 OAuth 2.0 协议中换取用户信息的繁琐过程,并将用户信息直接返回给你的业务地址,Authing 会帮你绑定不同的第三方社会化登录提供商,Authing 为你提供简单易用的 SDK,轻松获取、刷新用户的社会化登录 token。