利用微信服务号oauth实现扫码登录

谁说管理后台就要用繁琐的帐号密码登录的?

写代码写了五年,写管理后台更是家常便饭。然后写多了之后,一是觉得常规的太没有味道了。第一步,输入帐号密码,第二步校验帐号密码是否正确。最多就加上验证码,防止恶意登录。

但是,最近发现越来越多网站都支持APP扫码登录了,那么我写的管理后台也可以采用高大上(简单粗暴)的扫码登录嘛。但是,我没理由去开发一个APP吧(其实我不会app开发)。这个时候,捡一个现成的app就好了嘛。但是现成app要开发帐号信息才行呀,符合这个要求的一个app就是微信。微信服务号提供oauth支持,可以根据openid唯一识别用户。

先放三张帅气的图片体现一下这种方法的优雅:

管理后台登录界面

别扫这个二维码,因为地址是本地的,线上地址怎么可以放出来呢?

管理员微信扫码结果

看起来还是挺顺眼和方便的对吧,【容我自傲一下,毕竟我是后台和运维出身】

非管理员扫码结果

如果没有权限的微信扫码是不让他登录的,多么完美!

扫码登录原理

上面写了这么多门面话,我们现在进入正题,我们用一个图来看一下扫码登录的背后架构。

扫码登录架构

首先,这图好像有点乱,我们细细分析一下(看的时候我们可以分开两部分看,管理后台和手机端两个部分)。

首先,我们每一次打开管理后台都拿到一个token(随机字符串)。这个随机字符串的作用是用于识别用户的,因为我们用手机在走登录流程,服务器要判断手机和在登录管理后台的电脑就需要一个标识物来关联。

管理后台的二维码其实是一个地址,这个地址有一个get参数,就是记录着token。当我们用微信扫码跳转到一个页面,我们就可以拿到token的内容。然后,微信向系统提交登录的相关信息和这个token值,系统就知道这个token的用户是一个管理员。

但是,扫码允许登录之后,pc那边这么知道呢?这就需要pc端不停的拿token去询问服务器了,直到服务器告知这个token是管理员之后再做后续操作(不停询问的方法有很多,常见的有ajax不停轮询和websocket)。

微信oauth登录原理

微信oauth原理

微信oauth登录过程:

  1. 引导用户跳转到微信服务器,并且带上一个编码后的地址A

  2. 用户在微信服务器,点击同意授权(或者无感知的登录),就会跳转到地址A,并且带上参数code

  3. 我们需要在地址A拿到code参数,然后加上微信服务号的appid和appkey等参数,请求微信服务器,然后就得到了用户openid和一个token

  4. 用户openid已经是唯一标识符了,如果我们还需要用户其它信息,就需要用token和openid再一次请求微信服务器,从而获取所需信息。

一些要注意的事情

扫码登录是很方便,但是我们要注意,既然是放在互联网上的服务,就必须小心防范各种攻击。

  • token需要一个短的有效期,看看微信网页版就会一段时间自动刷新二维码。毕竟这个token关系到登录安全,需谨慎。

  • 扫码登录必须要用户确认,不然如果欺骗用户扫描了一个二维码就登录到管理后台了。

  • 扫码登录的防止恶意登录的大部分工作都放在了移动端,所以用于扫码的设备和应用的安全性需要有所保障。我们往往可以用微信等提供oauth服务的app来扫码处理。

交流技术请点击这里