今天因为关于找回密码的功能,差一点跟产品吵起来。
事情的缘由是这样的。产品上要做一个单点登录的系统,要有找回密码,修改密码的功能。单点登录我选择了开源的cas。
注册账号,修改密码,修改资料(密码也是个人资料)等,我自己做的cas客户端 用户中心(UCenter)。也就是说,要通过sso 中心登录,回调回来,才能登录UCenter。
修改密码必须登录,和输入原密码,两次新密码。做修改密码功能的理由大概是 “用户想修改密码了吧”或者“用户想统一所有账号的密码,所以才改吧”。后面说,这个功能其实可以不做。
输入原密码,是防止用户离开电脑,被别人修改。输入两次原密码,为的是用户输入的密码可能与期望不一样导致下次登录输入密码不正确。前端验证两次密码两次新密码一致,后端不必验证。
产品的需求是,用户修改完密码,必须重新登录。也就是说,我必须显示的退出UCenter,清空UCenter 的session。重定向sso系统,清空sso系统票据,删除sso系统cookie。然后调到登录页面。
产品经理的需求,在我看来,就是退出了,重新登录一下。完全没有任何意义,只是因为别人这搞的,我也要这么搞,领导要这么做的。有人说,是为了加强一遍用户对密码的印象。注意,修改密码的时候,是输入两次密码,前端校验是否一致了。也就是说,用户已经明确自己的密码是什么了。也有人说,修改密码了,就该重新登录。把当前用户的所有session都清掉。。。这个系统没有要求一个用户只能在一个地方同时在线。没有这个需求。又不是qq、微信在线聊天。。产品上需求不成立。也有人说这样安全。。大家都这么做的。。可是windows 改密码需要重启吗?mac 改密码呢?iphone该密码呢?修改指纹呢?android 修改 手势,让你们重新登录了么?
为什么说 修改密码完全可以不做? 因为有个找回密码功能,完全可以用这个改密码。在产品上,能少加功能,开发就少一点任务,用户就少一点麻烦。
注意,用户名,密码的左右,是为了登录。登录,是需要确认唯一的用户身份。也就是说用户名密码,是为了确认唯一的用户身份,除此没有任何意义。
如果把用户名不需要告诉其他人。用户名不是公开的,完全不需要密码?什么?不用密码就登录?对。
现在最流行的app,很多都在用户安装的时候。用户未登录。实际上,已经创建账户,在服务器的数据库里已经有了账户,且没有密码。当用户卸载,账户不会 消失。用户再次安装,打开app时,自动登录。典型应用 百度新闻。一般创建账户的规则 是获取手机的唯一标示。如mac地址等。
在产品设计上,省去了注册,登录。但是一样可以用百度账户,登录百度新闻。此时,后端要做的就是何必两个账户。
不用密码登录的还有很多,如qq、微信、微博等支持openId api的账户登录。你用微信登录xx阅读器,你修改微信密码,xx阅读器,让你重新登录了么?再一次说一下 修改密码重新登录没有意义。
当然openid还是依赖第三方认证。而 手机app生成的唯一标示不需要(如百度新闻)。只需要一串 字母而已。虽然大多数用户根本不知道这个过程,但是确实已经存在了。这样的例子,显而易见啊。比如网站第三方cookie。你以为你看我的博客,没输入任何东西我就不知道你是谁?我的网站部署百度统计代码了。百度通过百度的cookie,早就知道你是谁,喜欢什么。
再次强调一次,登录的目的是 确认用户的唯一身份。
不是为了别人有,我们也要有。而忘记了,为什么要有,为什么要这样。
对于登录不需要用户名密码的还有很多。而且能唯一确认用户身份,比用户名密码安全很多。
比如git ,Linux 远程登录ssh 的 RSA私钥。回家,开门的钥匙。或者没带钥匙,敲门,你妈问“谁啊?”,你回答的“我。” 上班打卡开门的指纹。亲吻女朋友时,她看到的“脸”。
什么时候必须要用户名呢?就是你的用户名,需要被别人知道,而又不能只通过这个就可以 唯一确认你的身份。。因为用户名公开了。 什么场景用户名必须公开?你的qq,微信,需要告诉别人,让人加你。邮箱需要告诉别人,让人给发邮件。
当然,你也可以把用户名密码写在一个输入框里。如果不了解技术,可以简单的,把RSA私钥当成用户名和密码的加密 放到一个表单里吧。
还是想说,产品功能的设计,是为了给用户使用。不是因为别人有,我也要有,别人都这样。领导说要有。这东西道理有意义,为啥要有从来不想。用户愿意不愿意用,也不考虑。
还有,产品无关的题外话。
用户名密码这种单因子认证,非常不安全。也不方便。当然,大多数人都会让浏览器记住密码。
当然还有更好的办法。如,插入ukey,直接认证通过。
或者通过证书。
一下为本人登录沃通的截图。
当然第一次登录还是用的 用户名密码,或者直接把 证书发到我邮箱。
然后导入证书即可。
最后,我还是按产品说的 按退出做了。因为,我向我的直接汇报人反应了,他(都是技术)同意我的观点。而产品说,这是领导定的。(很不耐烦,也不听我的任何解释。心里想的就是 你个程序员让你怎么做就怎么做就好了,那么多的事。)后来我跟直属说了,他也无奈的说,“那你就,退出吧。”
恩,那我就“退出”吧。ps,我不跨级汇报情况。
说实话,我就打工的。完全可以让我干什么就干什么,拿点工资就好了。也许,在人看来,这样的是好员工。
如果是我的产品,产品经理这样设计了。估计,我会让产品离开的。