【技术解读】如何使用微信设计二次认证
【编者按】二次认证对于很多人来说,也许只是锦上添花的小东西,但在用户体验越来越重要的今天,是产品俘获用户口碑的关键。使用微信推送二次认证码,既没有抵达率的隐患,也不需要用户额外安装一个可能许久也用不到的宝令App,且微信如此庞大的用户数也帮助我们率先解决了覆盖率问题。如何基于微信设计二次认证?且看本文技术解析。
而在11月15日CSDN和《程序员》杂志联合举办的微信开发者大会(深圳)上,不仅有南航微信服务号、 招商银行信用卡服务号,还有长安汽车微信企业号等众多知名微信开发领域技术专家/厂商围绕就微信开发中的难点、热点及行业解决方案、未来发展机遇展开深入讨论与分享。欢迎前来聆听(点击报名)。
互联网时代黑客凶猛,直到今天,仅仅在乌云平台上公开的漏洞已达到了18791个。在企业软件领域,安全问题更是备受重视,因为用户每天都在提交大量事关企业发展的敏感数据,这些数据一旦泄露,对用户、对企业软件提供商,都是一场灾难。正是因为数据安全如此重要,所以大量与安全相关的技术手段被应用于企业软件领域,如SSL加密、异地实时备份、数字安全证书、与第三方安全平台合作等。可以说,在如何使企业软件更加安全的道路上,我们根本看不到尽头。
但安全有时候会和用户体验产生矛盾,比如曾经令人抓狂的支付宝安全证书,还有目前大多数只能在IE浏览器环境下使用的网银系统。所以对于互联网形式的企业软件而言,安全问题就不仅仅是安全问题了。如何在安全和体验上取得平衡,是每一个互联网产品探索的方向,在这里,跟大家分享一下关于登录二次认证的另一种设计思路。
什么是二次认证
我们在互联网上的账号,一般总会有那么一两个已落入“敌手”,黑客们会搜集各处汇集来的账号形成他们自己的账号库。除非我们每个账号都使用不同的密码,否则黑客使用这些账号密码,肯定能登陆某一个你常用的系统。为了防止这种情况发生,很多对安全性要求较高、用户数据非常敏感的互联网产品都会引入二次认证方式,比如Evernote、QQ企业邮箱、GitHub、支付宝等,这些有广泛用户群的产品都支持二次认证。
图1 支持二次认证的产品
简单来说,二次认证就是在使用用户名、密码登陆的基础上,额外对用户账号提供一层保护,这样黑客就算掌握了某个互联网产品的用户名和密码,也无法进入系统窃取用户资料。
目前常用的二次认证方法
目前最为常用的二次认证方式就是手机短信,比如GitHub的二次认证。在GitHub网站上,你可以在个人设置页面通过输入手机号激活账号的二次认证,这样在使用用户名、密码登录GitHub网站以后,GitHub会发送一条短信到你绑定的手机号上,条短信会携带4位随机数字,你需要在GitHub系统上输入收到的这4位随机数字才能真正登录系统。
另外,随着移动互联网时代的到来,产生了另外一种二次认证方式,那就是移动宝令,比如支付宝的支付宝令。首先我们需要在智能移动设备上下载一个支付宝宝令App,然后在这个App中开启你的支付宝账号的宝令进行二次认证。这样在每次支付之前,支付宝都会在这个宝令App中产生一个4位随机数,你必须打开智能设备上的支付宝令,获取这4位数字,才能真正进行支付。
在短信抵达率一直是个问题的今天,移动宝令在智能设备上的使用显得尤为方便。也正是这个原因,Google还发布了一套公开的解决方案Google Authenticator,我们熟悉的Evernote就是使用这一套解决方案来实现它的二次认证机制(如图2所示)。
除了这两种二次认证外,腾讯企业邮箱的二次认证不得不算是一个“另类”。背靠拥有6亿用户的微信,腾讯企业邮箱的二次认证完全使用这个“全民App”的渠道。在开启二次认证时,直接绑定的是你的微信账号,需要二次认证时,会通过微信的方式发送随机验证码,这样你无须下载额外的专用宝令,就能达到二次认证的目的(如图3所示)。
如何基于微信设计二次认证
我们在综合体验了目前互联网行业常用的二次认证方式后,一致认为使用微信优于短信和宝令App。使用微信推送二次认证码,既没有抵达率的隐患,也不需要用户额外安装一个可能许久也用不到的宝令App,且微信如此庞大的用户数也帮助我们率先解决了覆盖率问题,可谓完美。不过理想丰满,现实骨感,实际的设计过程还会遇到很多问题,我们现在就来看看。
首先我们需要解决的是在Web应用中对微信账号进行绑定。很自然,我们想到的是微信公众账号。我们可以使用微信公众账号作为绑定的载体,用它来连接用户的微信账号和Web账号。绑定的方法异常简单,以Tower为例,在网站的个人设置页面,点击“双保险”旁边的“开启”链接,输入你的登录密码,会出现一个二维码(如图4所示)。
使用你的微信扫码功能,扫描这个二维码后,会自动将你的微信账号和Web应用的账号进行关联,你会在微信里对应的公众账号中收到一条绑定成功的消息,也能在个人设置页面看到绑定成功的提示(如图5所示)。
接下来,在用户登录时,如果开启了双保险,应该向用户的微信公众号里推送一条验证码。不过这里遇到了第一个坑,就是目前微信公众号限制每天只能向用户主动推送一条消息,这样显然不能满足我们的需求。
抠了一阵脑袋后,我们想到的一种解决方案,是在用户登录之后,显示一张二维码,用户使用微信扫码工具扫描这个二维码时(如图6所示),微信会向我们的服务器发送一条验证信息,告诉我们说:“微信用户某某正在试图登录系统”。
然后我们的服务器会判断这个微信用户是否已经和当前正在登录的用户绑定,如果是,则二次认证成功,用户的浏览器会自动跳转并登录系统。用手机扫码后,浏览器自动登录,一切好像都很完美,直到我们想到,移动客户端怎么办?
移动互联网在给大家的生活带来方便的同时,也给程序员和产品经理带来了很多麻烦。我们再也不能像以前一样,看看电脑浏览器里的效果后,就能悠闲地泡一杯咖啡一边玩儿去了,现在我们在开发每个功能时,不得不面对移动客户端的适配问题。
扫码在电脑浏览器上很方便,但手机上不可能这么干,你不能指望用户再去找一台移动设备,登录他的微信账号,然后用一台手机去扫描另一台手机上的二维码(如图7所示)。
于是我们继续抠了一阵脑袋,又想到了一招。微信虽然限制公众账号向用户主动推送消息,但如果用户自己先向微信公众号发送一条消息,那么公众号就能挣脱企鹅的枷锁,向用户发送消息了。因此如果用户在移动设备上登录以后,我们可以显示一个输入框,并提示用户打开微信对应的公众账号,在公众账号里点击“双保险”按钮,这就相当于用户向公众号主动发送了一条消息,公众号会再向服器索取一个验证码,用户回到应用的移动客户端,输入验证码即可验证成功。为了让这个过程更加有趣,我们还在微信公众账号里埋了个小彩蛋,用户可以直接在微信公众号里发送“芝麻开门”四个字来获取移动客户端双保险验证码,完成App登录(如图8所示)。
结语
二次认证对于很多人来说,也许只是锦上添花的小东西,但在用户体验越来越重要的今天,如何给互联网产品用户提供跨平台、最优质的产品细节体验,是产品能否打上自己团队烙印、俘获用户口碑的关键。所以对于每个产品团队来说,安全无关小事、体验无关小事,任何一个功能的设计和开发都值得仔细打磨和推敲。
当然,随着微信服务号接口不断升级,将来也许会有和微信结合更好的设计方案,这篇文章就算是抛砖引玉,希望大家能在产品设计时,多多考虑类似于微信这样可以利用的工具和平台。