免费注册,打造高效身份管理
博客/开发者/使用 Authing 五分钟接入微信网页授权登录
使用 Authing 五分钟接入微信网页授权登录
Authing 官方2019.11.07阅读 540

Authing 发布新功能啦!从现在开始,Authing 支持了新的社会化登录手段:微信内网页授权登录。

微信网页授权,即当你在微信客户端内访问网页时,可以调用微信的授权接口获取用户信息,如下图所示:

这对于很多应用来说,这是不可或缺的功能,却又属于繁琐的重复性劳动,借助 Authing,可以让你非常快速地接入微信授权登录。

为了理解 Authing 微信网页授权的原理,需要区分参与的四方:

  • 微信服务器:保存用户的身份信息,包括昵称、头像等。
  • Authing 服务器:和微信服务器进行交互,获取用户信息(这个过程使用的是 OAuth 协议,是完全安全的)。
  • Authing 平台开发者:不需要直接和微信服务器进行交互,因为这部分繁琐的过程 Authing 已经解决了。
  • 终端用户:真正访问页面的用户,整个过程对 Authing 无感知,用户体验不会受到任何影响。

完整的流程如下:

  1. 开发者引导用户跳转到微信授权页面:https://oauth.authing.cn/oauth/wechatmp/url/:userPoolId
  2. 终端用户同意授权。
  3. Authing 和微信根据 OAuth 协议完成用户信息交互。
  4. Authing 将用户信息(包含 token)发送到开发者自定义的业务回调链接。
  5. 终端用户后续的请求将 token 携带上。
  6. 开发者在后端调用Authing 提供的方法检验 token 的合法性以及登录状态。
  7. 根据 Authing 返回的登录状态和开发者自己的业务逻辑,对请求进行相应处理。
开始之前需要进行一些必要的配置,具体可以参考:https://github.com/Authing/authing-wxmp-sdk#%E5%BC%80%E5%8F%91%E5%87%86%E5%A4%87

我们提供了 SDK,帮助开发者更方便地完成上述任务,如何安装 SDK 请看https://github.com/Authing/authing-wxmp-sdk#%E5%AE%89%E8%A3%85

第一步首先初始化,"YOUR_USERPOOLID" 填入你的用户池 ID(用户池是 Authing 的一个重要概念,如果你还不了解,可以点击这里查看)。

const authingWx = new AuthingWxmp({
  userPoolId: "YOUR_USERPOOLID"
})

引导用户跳转,可以有很多方式,比如:

  • 当用户通过微信客户端网页打开时,让浏览器自动跳转。
  • 当用户通过微信客户端网页打开时,点击登录按钮之后跳转,可以参考掘金的做法:点击微信图标之后,浏览器就会跳转到微信的授权页面。

用下面这一行代码即可完成跳转:

window.location = authingWx.getAuthorizationUrl()

如果用户同意了授权,Authing 将会返回用户信息,开发者可以通过下面的代码获取用户信息:

// 跳回业务回调链接之后获取用户信息
// 若在回调页面 authingWx 未初始化,需要先初始化,具体初始化方式参考上文
const { ok, userinfo, message } = authingWx.getUserInfo()
if (ok) {
    // do with userinfo
    console.log(userinfo)
} else if (message) {
    // message 中包含了错误提示
    alert(message)
}

用户信息示例如下,其中包含了头像、昵称、openid、unionid、token 等信息:

{
    "_id": "5dc10bcb6f94c178c6ffffb9",
    "email": null,
    "emailVerified": false,
    "unionid": "oiPbDuG4S7msrKHPKDc8MECSe8jM",
    "openid": "oiPbDuG4S7msrKHPKDc8MECSe8jM",
    "oauth": "{\\"openid\\":\\"oiPbDuG4S7msrKHPKDc8MECSe8jM\\",\\"nickname\\":\\"廖长江\\",\\"sex\\":1,\\"language\\":\\"zh_CN\\",\\"city\\":\\"海淀\\",\\"province\\":\\"北京\\",\\"country\\":\\"中国\\",\\"headimgurl\\":\\"<http://thirdwx.qlogo.cn/mmopen/vi_32/GkxYERPDdTMk7bOk3BgBmEEYul8oMcOoLgNHLoibZn5ibe4EulWBp1xo6uN4az59eoSBYBW0QmXB9TrsJEM0EoPw/132\\",\\"privilege\\":[]}">,
    "registerMethod": "oauth:wxmp",
    "username": "廖长江",
    "nickname": "廖长江",
    "company": "",
    "photo": "<https://usercontents.authing.cn/avatar-5dc10bcb6f94c178c6ffffb9-1572932555337>",
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7InVuaW9uaWQiOiJvaVBiRHVHNFM3bXNyS0hQS0RjOE1FQ1NlOGpNIiwiaWQiOiI1ZGMxMGJjYjZmOTRjMTc4YzZmZmZmYjkiLCJjbGllbnRJZCI6IjVkYTdlZGFiNTAzOTZjMWFkOTYyMzc4YSJ9LCJpYXQiOjE1NzI5NTY0MjUsImV4cCI6MTU3NDI1MjQyNX0.OTgl72WZS8So3R5DbWCJ7I_Bd0LaZa4S0TAVMg9qaYQ",
    "tokenExpiredAt": "11/20/2019, 8:20:25 PM",
    "loginsCount": 43,
    "lastLogin": "11/5/2019, 8:20:25 PM",
    "lastIP": "127.0.0.1",
    "signedUp": "11/5/2019, 1:42:35 PM",
    "blocked": false,
    "isDeleted": false
}

其中的token是登录凭证,开发者应当妥善保存,并且后续的请求需要携带上此 token,即设置 Authorization 请求头为 "Bearer " + token,如:

Authorization: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7InVuaW9uaWQiOiJvaVBiRHVHNFM3bXNyS0hQS0RjOE1FQ1NlOGpNIiwiaWQiOiI1ZGMxMGJjYjZmOTRjMTc4YzZmZmZmYjkiLCJjbGllbnRJZCI6IjVkYTdlZGFiNTAzOTZjMWFkOTYyMzc4YSJ9LCJpYXQiOjE1NzI5NTY0MjUsImV4cCI6MTU3NDI1MjQyNX0.OTgl72WZS8So3R5DbWCJ7I_Bd0LaZa4S0TAVMg9qaYQ"

如果你使用 NodeJS 的 axios,可以这样写:

axios.get(SOME_SERVICE_URL, {
  headers: {
    Authorization: `Bearer ${userinfo.token}`
  }
})

其中SOME_SERVICE_URL是开发者自己的业务接口,开发者在后端获取了token之后,Authing 提供了几种方法帮助检验token的合法性和对应用户的登录状态(具体的方法请看:https://docs.authing.cn/advanced/authentication/jwt-token.html),开发者可以把这个方法封装成一个函数,比如说check_authing_token_status(为了方便我使用了 Python ):

def check_authing_token_status(token: str) -> bool:
    """
    :param token: Authing 返回用户信息中携带的 token
    :return: 布尔值,表示是否处于登录状态
    """
                # 调用 Authing 提供的方法,具体过程省略,请参见上文提到的文档
                pass

然后就可以通过登录状态和自己的业务逻辑对请求进行响应了,比如:

logged_in = check_authing_token_status(token)
if not logged_in:
    # 返回错误提示
# 正常继续下面的逻辑

到此,整个认证流程就算是完成了,开发者需要完成的代码量很少很少,同时终端用户的使用体验也不会受到任何影响。这也是 Authing 的使命:将开发者从繁琐的重复性劳动中解放出来,让开发者有更多的时候去做和业务相关的事情,从而提升社会生产力!

如果你想快速体验,可以访问以下链接:https://sample.authing.cn/

如果你想了解更多技术细节以及 SDK ,可以访问这个 GitHub repo:https://github.com/Authing/authing-wxmp-sdk

如果你想了解 Authing 与微信服务器进行 OAuth 协议交互的细节,可以访问微信的官方文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

如果你还想体验一下如何使用 Authing 快速实现 SSO 单点登录,可以访问:https://sample.authing.cn

如果你想了解 Authing 更多功能,可以访问 Authing 官网:https://authing.cn

文章作者

avatar

Authing 官方

0

文章总数

authing blog rqcode
关注 Authing 公众号
随时随地发现更多内容
authing blog rqcode
添加 Authing 小助手
加入 Authing 开发者大家庭
身份顾问在线解答
当前在线
如何打造完整的身份体系?
立即沟通
authing
添加企业微信,领取行业资料
authing
authing
下载 Authing 令牌,体验快速登录认证!
免费使用
在线咨询
电话咨询