首页 > 纯OpenID登录的网站如何解决帐号一系列相关问题?

纯OpenID登录的网站如何解决帐号一系列相关问题?

想做个纯OpenID登录的网站,类似的登录,但是思考几个问题没找到解决方案

  1. 如何避免不同OpenID创建了不同帐号?(UI提示引导?技术实现?)
  2. 我猜测实际还是创建了一个本地帐号(OpenID登录后要求输入的邮箱),但是用邮箱做本地帐号唯一标识是否是最佳实践?是否有其他更好的方案?
  3. 这类纯OpenID登录的网站设计上还有什么坑在里面?

目前我准备实现的方案:

  1. 用户正常注册,用户名/密码/邮箱
  2. 登录后才允许进行OpenID关联到本地帐号
  3. 一旦有OpenID关联后,用户可以选择关闭本帐号的用户名密码登录功能(但是保留密码hash在本地,以免第三方OpenID服务失效)

说说我的思路吧。

首先,对于一个【人】,系统里面肯定要有一条唯一的记录对应他,我们暂且称之为【用户】。【用户】必定要有一个唯一ID。

其次,无论是普通的用户名密码登录,还是微博、QQ、谷歌、GitHub 之类的第三方登录,这些登录方式都是同等地位的【凭证】。一个【用户】可以有多个【凭证】,但至少必须要有一个,典型的一对多关系。

登录,认证成功后:

注册,同样也是认证成功后:

对于用户名密码【凭证】,需要储存的信息是用户名和密码。

对于第三方登录【凭证】,需要储存的是他在第三方平台上的 UID。注意,只有 UID(或者其他这个平台说明不会改变的识别码)能作为凭证!Email 什么的只能是方便用户而自动填写到本地而已,Access Token 也只是你需要用才存的!


先普通注册登陆再绑定就失去OpenID/Oauth的意义了,OpenID/Oauth本来就是为了简化注册登陆设计的。

先说注册/登陆

一般来说依赖第三方的注册登陆都需要以下的步骤:

1. 用户点击第三方登陆
2. 跳转到第三方认证
3. 网站检验认证信息,同时让用户选择: 新注册帐号 或 绑定已有帐号
4. 如果用户选择新注册帐号,一般需要填写Username/Email,不需要填写密码
5. 如果用户选择绑定,则需要验证密码或者用邮件验证

要点在于,使用了第三方登陆的用户,都不需要密码验证

之所以有Step3,是因为大部分第三方网站都不会提供用户的Email,如果你的网站不需要Email,那么上述过程可以简化为

1. 用户点击第三方登陆
2. 跳转到第三方认证
3. 系统检测认证信息,同时自动创建用户,用户名可以根据验证信息生成,比如Weibo-AlloVince等,只要保证不重复就可以。

上面的简化步骤才是真正理想的第三方登陆。

----

注册以后系统还应该提供

- 解除绑定
- 重新绑定

的功能。

技术要点有:

- 由于已经是注册好的用户,绑定只是跳到第三方的验证过程,无需用户再输入任何信息。
- 没有填写Email/Password的用户不能解除最后一个第三方帐号的绑定,否则这个帐号会变成死帐号,没有任何方法可以登陆。
- 可以将一个第三方认证从一个帐号重新绑定到另一个帐号。

----

事实上坑还有很多。

假如是Oauth2.0, Token会有过期时间,Token过期后需要发送邮件提醒用户重新绑定。

每个第三方提供的用户信息都不一样,所以需要一个统一的转换接口,将第三方回传的信息转化为自己系统的格式,这样用户信息才能得到利用。

第三方的用户信息存在更新问题,需要后台定期携带Token访问更新。

所以想要完美的集成第三方登录,其实工作量是非常恐怖的。


1. OpenId不是这个概念,楼主说的应该是OAtuh;
2. 考虑合并帐号,包括手动和自动,根据唯一条件,比如邮件或电话号码;
3. 数据库可以采取1:n结构,比如user 表有用户id,昵称,email,但是可以绑定很多OAuth授权。这样不管是用户用一个网络服务login后再绑定其它服务,还是没login状态绑定其它服务,都会根据这个唯一的值来合并用户。


如果你的网站只支持第三方登录方式登录,那么不要注册邮箱当然没问题。不过流程上就要有所区别了,那就是绑定多个第三方账号的过程,只能在用户处于登录状态的情况下才能完成。因为你无法通过一个可靠的账号名,来统一所有的账户。

对使用第三方账号登录的用户,账号名是不需要输入的。有得必有失,这就是方便带来的坏处了。

这就看你的网站定位了,如果仅仅是个工具类网站,本着方便为本的思想,可以将能省掉的输入都给省掉。但是对于一个大型网站来说,单纯依靠其它网站来提供登录服务是不可靠的,如果第三方挂掉怎么办,如果那个网站关站了怎么办。所以还是有必要用邮箱建立一套自己独立的用户系统,而第三方登录作为辅助登录方式绑定到这个邮箱上即可。

【热门文章】
【热门文章】