网站的无密码登录

作者: 阮一峰

日期: 2012年10月 3日

大部分网站,都要求用户登录。

常见的做法,是让用户注册一个账户。

这种做法并不让人满意。

对于用户来说,每个网站必须记住一个密码,非常麻烦;对于开发者来说,必须承担保护密码的责任,一旦密码泄漏,对网站的业务和信誉都是巨大打击

所以,很早以前,人们就开始设想"无密码登录"(password-less login)。这对用户和网站,都将是极大的减负。

本文先回顾"无密码登录"的几种常见做法,然后探讨一种最简单的实现。

一、OpenID

OpenID是最早提出的一种无密码登录。

它的设想是这样的:互联网上每一个网址(URL),都指向一个独一无二的网页,这说明网址具有唯一性。因此,可以用网址来标识用户。

所以,使用OpenID的网站,不要求用户输入"用户名",而要求用户输入一个代表其身份的网址。然后,向该网址进行求证,如果得到证实,就允许用户登录,从而实现"无密码登录"。

OpenID有两个很大的缺点:一是需要服务器端支持,二是使用网址表示身份,违背直觉,普通用户难以理解。因此,始终无法得到推广。

二、第三方账户

OpenID的实质,是让第三方网站认证用户身份。那么很显然,这等同于用户在第三方网站登录。

因此,可以直接告诉用户,使用第三方帐号登录(前提是对方支持OpenID)。

这样做的优点是比较直观,用户容易接受;缺点是自身的业务,从此多多少少要依赖第三方网站。比如,现在很多网站使用Facebook帐号登录,一旦Facebook出现故障,这些网站都会受到影响。

三、Persona

去年,Mozilla提出了Persona方案,号称是无密码登录的终极解决方案

它与OpenID异曲同工。后者用网址标识用户,它用Email标识用户。用户键入Email地址以后,网站向Email服务器请求认证。

虽然这种方案还处在推广期,效果有待观察。但是,我目前不太看好它。一则,它的技术要求流程,比OpenID更复杂,无法用一句话讲清楚;二则,它要求服务器端支持,很难想象世界上大部分Email服务器都会部署Persona代码。

四、OAuth

OAuth协议其实与"第三方帐户"是一回事。

"第三方账户"是第三方网站提供用户身份认证,属于"认证"服务(authentication);OAuth则是更进一步,第三方网站允许你直接操作它的用户数据,属于"授权"服务(authorization)。

因为涉及到用户数据的改变,所以OAuth认证比Openid认证要求更严格。通常,只有针对某个第三方网站的外部服务,才需要用到OAuth;如果只是单纯地区分用户身份,其实没必要用它。

五、Email一次性登录

上面四种登录方法,是目前主流的"无密码登录"。下面,我想介绍一种最简单的实现,它是美国程序员Ben Brown在今年7月份提出来的。

他的做法很简单。用户登录的时候,只显示一个Email地址输入框。

用户输入Email地址以后,网站就向该地址发出一封邮件,里面包含了一个登录链接。用户点击这个链接,就证明他/她确实是这个邮箱的主人,身份有效,从而实现登录。

登录链接只在一段时间内有效,但是可以通过cookie,让用户长时间处在登录状态。如果cookie失效,则重新向用户邮箱发出另一个登录链接即可。

由于整个认证过程,都通过电子邮件完成,彻底实现"无密码登录",而且操作流程很自然,易于理解。更重要的是,它使用现有的Email协议,不需要服务器端部署新的代码,具有最好的兼容性。

主要缺点是,它需要用户额外查看一次邮箱,稍显麻烦;它也不适合那种用户无法打开Email的场合,比如在朋友家中上网。因此,使用它的网站,还必须部署备用的登录方式。

总的来说,我觉得这是一个简单易行的好方法,以后做网站的时候,打算尝试一下。

想听听大家的意见,你觉得这种方法可行吗?

(完)

码云

留言(89条)

对于用户数据不是太重要的网站,还有一种更快的登录方式,就是点“注册”后直接转到一个带随机用户id的地址(用户可以加入收藏夹),以后直接打开这个地址就代表登录了。

终于对这些登录的方式有个统一的理解,谢谢

最后一种方法,我有点感想:发送到用户邮件中必然包含一个连接,这个连接的生成可以是静态的,也可以是动态的。
1.静态
可以根据一定的算法把用户ID和一个时间段映射成一个字符串(URL后面的字符串),假设有效期是10分钟,那么同一个用户10分钟内多次请求登录,服务器发给用户email里的验证url都是一样的,每次服务端验证的时候根据用户Id和当前所在的时间段生成字符串,和用户发来的字符串匹配,验证是否有效
2.动态
用户每次登录,随机生成一个字符串(比如UUID),在数据库中与用户ID对应,这样每次生成的都不一样,服务端根据数据库里的内容保证最后一次生成的字符串才是有效的

第一种的话,需要一个优秀的算法(计算非常快捷、不容易破解),动态的方法需要数据库或者缓存一类的支持,消耗可能会比较大一些

另外,如果资金允许的话,使用短信是不是也可以呢?


我觉得最后一个比较好,不需要密码,也比较方便。
我现在用飞信,密码老是不记得,现在我就不用密码了,用飞信提供的短信密码,每次发到一个临时密码到我的手机,一会就失效了,也可以,但是有很大的局限性,只适合移动公司这样的联络工具。

我觉得简单点的话,博客这种写名字、网址和 Email 的形式挺不错的。IRC 那种仅使用名字标识用户但可选地注册以使用密码保护的方案也挺好的。

最好的方法只能是设计没有用户认证的网站

与其说邮箱,不如选择时时通信软件
比如第一次注册登录后,绑定QQ or MSN or Anything else 然后登陆时选择对应入口,服务器就给对应的发一个Link or 登录密码

引用善水秀才的发言:

与其说邮箱,不如选择时时通信软件
比如第一次注册登录后,绑定QQor MSN or Anything else 然后登陆时选择对应入口,服务器就给对应的发一个Link or 登录密码

除了更麻烦之外(涉及到其它软件的操作),这个和依赖第三方网站没什么区别。

无密码登录的确可以说是个方便互联网用户使用的亮点。但是以上解决方案看不出对现有密码登录方式的“有价值”的改进。只是改变用户的习惯,而这种改变并没有带来显著的用户价值。想法很好,但目前不可行。思考无密码登录不如想想为什么网站需要注册,需要密码?现在在大部分门户网站开通一个账号,连带着就会有用户的空间、个人信息、互联网操作行为的记录(购买、下载、分享、收藏、上传等等)。但是很多时候,用户只是为了能“看”而已。因而会觉得记住密码和注册名很烦。反过来想想这些网站,之所以需要用户注册,是为了收集用户信息,提升自己的用户价值。正因为用户数多,才能吸引广告商。所以要以无密码登录为噱头,必须要解决3个问题:1.这种模式能获得多少经济效益?2.技术上是否可行?尽量较少的改变用户习惯。3.确保网站对用户信息的控制。附带一句,email的这种方式也挺一般,因为中国每天会登录n次电子邮箱的估计只有那些科研工作者。。。尽管这是个好习惯,但是大部分互联网用户是没有养成这个习惯的。。。

引用依云的发言:

除了更麻烦之外(涉及到其它软件的操作),这个和依赖第三方网站没什么区别。

仔细想想是这个样子啊~我最喜欢手机动态密码了。

以前思考过这个问题。
觉得可以利用硬件,比如笔记本的指纹识别;
或者用摄像头扫描人脸(最好需要用户填写一下用户名);

当然不是所有的设备都装有指纹扫描仪/摄像头,可以考虑作为一部分用户的备用登陆方式吧

Windows CardSpace (Information Card)、i-name (XRI) 也是类似的技术。

如何证明你是你自己,人脸识别、指纹识别神马的最快了

最后的方法查看邮箱有点麻烦

类似微信网页版的扫描二维码登录方式,或者类似手机令牌的方式,缺点就是严重依赖于手持终端.

1.短信密码
2.动态密码(Google Authenticator,银行的数字密令/U盾,QQ令牌……)

这是我认为目前能被大众接受(理解)的无密码登录方式,其他的都稍显Geek,一般用户不方便使用也懒得去关注。

比较喜欢第三方登陆,Facebook挂了,还有Google

引用ddd的发言:

对于用户数据不是太重要的网站,还有一种更快的登录方式,就是点“注册”后直接转到一个带随机用户id的地址(用户可以加入收藏夹),以后直接打开这个地址就代表登录了。

哪个网站愿意做那个“不是太重要的网站”呢?

只要能够让LastPass记住账号和密码的网站,就是好网站!
.
另外, 讨厌分配数字ID的网站!

阮兄总结得很好,学习了。前些天刚考虑为我的网站添加登陆功能,想用Persona的服务。看了一会Persona的技术文档发现还不太容易弄。

最后一种其实Engadget 中文版一直都有用,它可以直接通过Email就登陆了,也可以创建一个密码。
Email确认了以后,你发的贴就张贴成功了。

第二次要评论时,仍然需要输入email和密码,但即使密码错误,仍然会发送一条连接到你的email来确认,点击链接后,评论就发布了。

还有一种您没有提到,微信网页版通过手机扫描二维码数据来登陆,但稍微也有些麻烦。

移动网站通过短信验证码登陆。

另外,windows还有基于域账户登陆的方式。

早先微軟想用 passport 一統天下,結果不成 OPENID 也就是在這基礎上的一種妥協,操作上已經不麻煩了,沒必要用 email 反復切換操作。

引用WJ的发言:

无密码登录的确可以说是个方便互联网用户使用的亮点。但是以上解决方案看不出对现有密码登录方式的“有价值”的改进。只是改变用户的习惯,而这种改变并没有带来显著的用户价值。想法很好,但目前不可行。思考无密码登录不如想想为什么网站需要注册,需要密码?现在在大部分门户网站开通一个账号,连带着就会有用户的空间、个人信息、互联网操作行为的记录(购买、下载、分享、收藏、上传等等)。但是很多时候,用户只是为了能“看”而已。因而会觉得记住密码和注册名很烦。反过来想想这些网站,之所以需要用户注册,是为了收集用户信息,提升自己的用户价值。正因为用户数多,才能吸引广告商。所以要以无密码登录为噱头,必须要解决3个问题:1.这种模式能获得多少经济效益?2.技术上是否可行?尽量较少的改变用户习惯。3.确保网站对用户信息的控制。附带一句,email的这种方式也挺一般,因为中国每天会登录n次电子邮箱的估计只有那些科研工作者。。。尽管这是个好习惯,但是大部分互联网用户是没有养成这个习惯的。。。

你分析的很对,大部分网站要求用户登录都基于自身商业模式的考虑 比如注册后才能浏览,回复后可见,积分浏览...本身不是为了创造价值和创造内容

第三方统一登录也连带一个棘手的问题,数据分析人员可以根据将多个网站的ID指向具体用户,对于用户隐私方法存在风险。用户有的时候也会在同一网站注册几个马甲

用户可以注册N个网站,但不能凭记忆分别记住N个不同的密码,这是自然规律。
safebox等本地、云端存储密码方案更是像把自己家的钥匙交给陌生人,受制于这些软件、服务商的可信程度。
前期多个网站的密码数据库被爆,也显示出用户在无法记住更多密码时,也倾向于自行管理,并将多个网站注册相同的帐号和密码,这实际上带来了批量修改密码的问题

浏览器自动记录登录密码的方法其实也不错啊

不是所有用户都会利用插件、本地程序之类的快速打开Email查看,
这样的方法对于某些用户又要去输入自己的Emial 帐号、密码。
我还是挺看好OAuth的,现在听说过最多的也是它。

启动客户端摄像头进行面部识别或视网膜识别,以实现无密码登录。

關於 Persona 的描述「用户键入Email地址以后,网站向Email服务器请求认证。」這個與我的認知不同,也與 Persona decentralize 的想法有所出入,或可再確認一下?

https://developer.mozilla.org/en-US/docs/Persona

我相信是,在瀏覽器支援的情況下,用戶在向 identity provider (不見得是 email provider, 所以也不致於得要 email provider 在 server 上支援) 申請一個通用帳號時,就已經把結合 email 的 credential 存在瀏覽器中,而要登入網站時也只拿這個 credential 去登入。

以此方法,email/identity providers 才不必知道你去過哪些網站。

最后一种方法,还得登入邮箱,登入邮箱时一样要输入用户名密码。你只是把问题推给邮箱网站,根本没有解决问题。

我看好最后一个,最后一个方式平时用到的很多,只不过是没有人想到用它去登陆。这个想法很好,
我认为在这种方式后面可以扩展,
一开始的方式 :比如我输入了email之后,给我的邮箱发送了一条email,然后可能我会手动点击链接,这样登陆成功
麻烦的就是像lz说的要打开邮箱,就这一步我感觉可以通过自动化的去处理这不操作,比如我做了一个客户端软件(比如浏览器),并且浏览器绑定了我的邮箱,这样当我点击登陆的时候,浏览器查看自己是否绑定了这个邮箱,如果绑定则会自动去邮箱里面去查看是否有发送的这条超链接,并且有唯一的标识id,这些都匹配成功之后,标识登录成功!

如果普及了Cloud,能在不同的设备上实现浏览器的Cookie同步,那么用邮件地址(方法5)认证一次,就可以了。
最好是不同的浏览器之间对Cookie也能实现共享,那就更加完美了。

我觉得手机令牌才是最好的解决方案,当然网站可以采取多种登录方式供用户选择了。手机令牌和最后一种登录方法相结合应该最好。

最后一个方式如何防止spam?

最后一个方案为什么不是发手机短信而是发email?

lastpass最好用,也是最好的解决方案。只需记住一个密码就行了,我一直在用。只有极个别网站不支持lastpass,但也有解决方案。

无密码?要么扫描下指纹……莫喷……

国内的环境存在诚信问题,如果第三方停止帐号接入怎么办?域名都能轻易停止解析,帐号停用应该更容易了

兄弟,首页只有一篇日志啊,怎样看到其他文章呢!

实行网络实名制吧,问题的解决与新问题的产生永远是平行的,没办法

小木虫就可以邮箱验证登录

引用善水秀才的发言:

仔细想想是这个样子啊~我最喜欢手机动态密码了。

赞同。这个安全性是非常高的。只是如果遗失手机就麻烦了。。。

手机动态密码的前提是自己的手机掌握在自己手上。
如果基于这个前提,完全可以让账号和手机号绑定。
这样手机上网就可以不用密码了。
PC上网的话目前最好的也就是手机动态密码了。

单纯的通过邮箱登陆有些死板, 可以辩证着做. 比如向邮箱中发送一个六位的随即字符串, 使得用户可以通过这个随机的字符串进行登陆. 这样做的好处就好方便通过移动终端查看邮箱内容.

"它要求服务器端支持,很难想象世界上大部分Email服务器都会部署Persona代码"
其实未必需要所有的邮件服务器都支持, 现在大部分的邮箱都可以绑定第三方的邮箱账号, 通过 IAMP 收邮件. 我们仅仅需要一个支持 Persona 的服务器有 IMAP 服务的功能即可.

我希望制作一个可以识别个人身份的U盾,以后上网直接插上去就可以识别个人信息了,或者摄像头搭载有识别用户面孔的功能

我就是这么做的,用email来验证用户,同时还只支持多个email对应同一个用户;因为有很多用户拥有多个email;并且不需要每次都登陆邮箱验证,在一次验证成功后会记录其IP地址,如果第二次输入email时发现IP地址与上一次成功验证时是一样的就直接登陆;有空可以讨论

指纹什么的太浪费精力开发,又要解决硬件的问题,email的还是要登录邮箱,一样要密码啊,我觉得真的可以向手机发短信的方式来解决

Persona不需要邮件服务商进行支持啊。

email快捷登录是好的 但必须保障安全性。

我感觉最后一种方法还可以衍生到其他方面,不应该局限在email,可以是及时聊天工具、手机之类的,直接发送一条消息验证即可。

“它使用现有的Email协议,不需要服务器端部署新的代码”是什么意思呢?

windows 程序员,现在全部用qq登录。只不过要求qq一直开着。

手机收验证码!

个人觉得,Email登录需要验证邮箱,比输入密码还要麻烦。对于第三方登录和Oauth,感觉现在市面上特别乱,因为绑定有明文绑定和暗文绑定。对于暗文绑定,用户比较省力,但是网站开发者会依附于登录的网站,对于明文绑定,个人十分不喜欢,因为用户还需要重新输入一些注册内容。所以,我觉得现在这些登录方式都不好。

Email被盗就哭去吧。。所有资料全灭了。安全性和方便性必然是冲突的。

要提供一种既不泄露隐私,又方便的登录方式,确实不简单。
手机验证是最方便的,但实现成本不低。
个人还是认为手动输入密码比较好。

最后一种方式,我觉得与engadget的留言板很像。没有注册的用户填写用户名与邮箱,发表的评论要到邮箱中点击收到的一个链接之后才会发布。

作为一个普通用户,我都是用一套自己的加密算法来及密码的,当然这些密码跟所要登陆的网站有关,很简单的。

最终极的方法就是用户第一次登陆的时候调用摄像头获取头像信息,网站进行保存。第二次登陆的时候,同样扫描就好了。如果用最后一种办法还不是要登陆一次,莫非邮箱就不用密码呢?

全部开放就好了 方法为了利益存在 我们用户都是牺牲品

终极方案:Email配合收到的验证码登录。

Email一次登录法的方便性的前提是用户已经通过邮件客户端(如OE/outlook/Foxmail等)或webmail登录邮箱, 能随时点击新到邮件.

bump用手机捧触空格键不算一种登陆方式么?
我觉得这是目前最好的认证方式,可以发展下。

还有摇一摇等等,就是网站显示网页和用户一起摇就可以了。触碰和摇一摇,加上用户的位置信息,确认用户身份应该不难


引用任卫的发言:

bump用手机碰触空格键不算一种登陆方式么?
我觉得这是目前最好的认证方式,可以发展下。

这个想法困扰WEB开发者很长的时间了,可以参考下以下两篇云风的旧文
http://blog.codingnow.com/2006/10/password.html 06年的
http://blog.codingnow.com/2010/02/no_password.html 10年的
当时第一次看到这种思路的时候觉得很触动。如今回头来看,现在比较被接受的还是OAuth,可见这方面的发展,路还很漫长哈。

用户体验的提升最终是要靠硬件来实现的
终级的无密码登录当然是认证“人”本身。相关的技术比如人脸识别,指纹识别,虹膜识别等都比较成熟了,缺少的不过是硬件的支持

最近交的term paper就是关于Single Sign-On,主谈OpenID,突然就看到您发了一篇这个,着实吓了我一跳

email不错,只要开着电脑就开着邮箱的飘过~

手机短信同样受制于运营商;邮件也是;
目前来说我觉得OAuth是比较好的方案;
二维码登陆,可以尝试下,但是同样有掣肘之处:没有智能机怎么办.
多种方式配合,或许是不错的解决方案.

引用long132的发言:

最后一个方案为什么不是发手机短信而是发email?

要是这时候,网站就要考虑短信的发送成本了,毕竟发email的成本几乎是可以不计的,而短信就没这么便宜了

OAuth 才是王道

如果邮箱登陆才要采用无密码登陆的话该如何是好?无密码登陆-->发验证链接-->准备登陆邮箱-->无密码登陆-->发验证链接--准备登录邮箱-->……渐渐,我们都老了。

最后一种方案:
登录A邮箱的时候填写了B邮箱,于是登录B邮箱看登录连接;
由于需要登录B邮箱,那就填写了A邮箱,所以要去A邮箱看密码。

在http://current.openphoto.me/试用了一下Persona,我使用gmail登录,感觉并不需要邮件提供商进行什么支持。看跳转认证的部分是Persona做的,看跳转记录,client并没有和gmail服务器进行互交。

一直关注博主博客,苦于自己没有博客不好意思留言,如今终于如愿写下第一条留言。个人观点:有无密码登陆在于整个网站价值取向,注册无非为了留住游客或者记录用户邮箱从而通过邮件方式固化关系,当然用户注册也起到了用户分类,资源合理分配等,最根本问题还是资源的紧张。

这些无密码登录都只能用在某些特定网站,还是密码,用户名最安全,可靠,经济。

OpenID,没什麽网站采用,我也没用过。
第三方账户, 还是需要用户名,密码。
Persona,第一次听说。
OAuth,难用,协议写的不清楚。
Email一次性登录,对无安全要求的应用可以使用。
生物密码, 最没用的就是什麽指纹,面孔识别技术了,科幻电影看多了才会采用这种技术。

為Persona喊冤一下

目前在大部分的瀏覽器內會以我描繪的這張圖來做驗證(Persona之前的代號叫做Browserid)
http://lab.orinx.com/clipboard/slide/img/browserid.jpg

因此並不需要郵件伺服器支援,您只要能收信就好了。

而且後端大概只需要不到十行代碼,前端也是引入js即可

不過照我畫的圖片只是開發中的階段

未來是以發認證金鑰給瀏覽器為主(前提是瀏覽器支援協定)。這代表發認證的人無法追蹤你登入過哪些網站,進而達到保護使用者隱私的效果。

由於Persona的使用方式並不複雜,因此個人十分推薦玩玩看 :)

如果腾讯搞个服务,所有网站分配一个QQ号码,注册默认加此QQ号,想登录这个网站的时候向这个QQ发送自己的账号,然后QQ根据账号发送对应的登录链接,点击链接直接登录了。

这样也不用什么收藏夹了,在QQ里搞个类似企业QQ的分组解决了。

手机验证码
中移动早就实现了

本来不就是可以用cookie实现自动登录吗?

邮件的方式感觉不错,而且移动端查看邮件也很方便

通过ip认证?

这个得具体看网站了,如果对用户注册登陆不是很注重,那么也没有必要弄个注册登陆。现在最主流的趋势就是第三方登陆和自己注册账号密码

Persona其实直接用SMTP协议验证邮箱账号的密码来着,我觉得挺不错。简单,方便,直接指向第三方SMTP服务器,或者自己的SMTP服务器就行了

除了传统的登录方式,上面列的各种思路都是需要依赖第三方服务器的,既然如此那可靠性行就是最关键的指标了,目前来说,权威网站的ID是最好的选择。
严重不看好最后一张Email的方案,缺点太多了,安全性方面完全没有保障。

“Email一次性登录”, 这个想法有创意。

@xueshi:

如果按照你描述的这种静态方法,我认为风险比较大,黑客很容易根据这个规定伪造请求。

OAuth + 最后一种方法 是不错的方法,重新打开邮箱的步骤也可以省略,需要服务器支持.

现在很多手机APP都支持通过手机验证码的方式登陆,是个很不错的点子。只是,电脑上有什么能够像手机短信那样方便的查看验证码或登陆链接呢。Mac OS X倒是做的不错,可以在电脑上接收手机短信。

以后鼠标上左键右键会有指纹识别模块,登录什么的一摸就行。。。。

各种浏览器的个人登录信息,如大多数都会用的email地址,在第一次注册的时候绑定所有需要用到的email地址,在浏览器处在用户登录状态时候,进行email是否相同判断

我要发表看法

«-必填

«-必填,不公开

«-我信任你,不会填写广告链接