小编按:为什么现在多数网站/App 鼓励第三方社交账户登陆?看完这篇来自知乎的技术帖,相信多数童鞋会和小编一样豁然开朗!
谢邀!8月下旬刚好搞过OAuth。
首先反对目前赞同数超过1的除了我以外的所有回答。
回答下题主本身的问题:很多网站提供用微博和QQ账号登录,好处是什么呢?
好处是当你登陆了QQ客户端或者微博时,用户可以不输入账号密码直接点击(无需输入任何数据)使用绑定的QQ号或微博账号登陆。这个需求是很大的,我网站设立初期就有很多人要求我添加这个功能。
这个我做过调查,确实很多用户需要,因为登录了QQ客户端,在那些网站就不需要输入密码登陆了。没调查就没有发言权。
————————————以下为战斗部分——————————————
1、@Benjamin 提到的 “诱使用户误以为不用注册账号就能登录他们的网站了,有利于吸引用户。” 这个其实QQ互联官方的要求就是:“点击登陆后,要直接就是登陆,不能要求设置账号密码什么的”,不然无法通过审核,我前期就是这样无法通过审核,后期在代码里动了点手脚才过的,审核通过后又改了回去。
设置昵称这个前期小小麻烦,以后的还是会很方便的,毕竟以后就不用再输入了。
2、@DecKen 的说法,“所谓的使用微博和QQ账号登陆,无非是网站想获取你更多的信息(QQ号,微博)”,也是错误的。OAuth协议返回给接通微博登陆或者QQ登陆的网站的登陆数据,只有一串可以叫做openid的字符串,并没有QQ账号,当然你可以拿着openid等数据继续通过腾讯的OpenAPI继续获取更多资料(JSON格式),例如昵称什么的,但是还是没有QQ号。例如get_user_info的API,只能取得如下数据。
{
“ret”:0,
“msg”:””,
“nickname”:”Peter”,
“figureurl”:”http://qzapp.qlogo.cn/qzapp/111111/
942FEA70050EEAFBD4DCE2C1FC775E56/30″,
“figureurl_1″:”http://qzapp.qlogo.cn/qzapp/111111/
942FEA70050EEAFBD4DCE2C1FC775E56/50”,
“figureurl_2″:”http://qzapp.qlogo.cn/qzapp/111111/
942FEA70050EEAFBD4DCE2C1FC775E56/100”,
“figureurl_qq_1″:”http://q.qlogo.cn/qqapp/100312990/
DE1931D5330620DBD07FB4A5422917B6/40”,
“figureurl_qq_2″:”http://q.qlogo.cn/qqapp/100312990/
DE1931D5330620DBD07FB4A5422917B6/100”,
“gender”:”男”,
“is_yellow_vip”:”1″,
“vip”:”1″,
“yellow_vip_level”:”7″,
“level”:”7″,
“is_yellow_year_vip”:”1″
}
基本只有昵称、各种尺寸的头像的URL,性别,黄钻相关的信息。
另外其实我很奇怪知乎很多完全没有网站开发经验的人也来回答这种问题。
以下为我QQ登陆数据表所储存数据,可以看到我只保存了openid,并没有QQ号,不是不想保存,是没有API可以获取到这种资料。
openid每个用户各不相同,有一一对应的关系。但是同一用户,不同的appid获取到的OpenID是不同。因此是无法通过openid逆向工程得出QQ号的。
当然,新浪微博的API权限就高很多了,甚至可以用那些API,做出Fuubo这样的东西,所以获取微博的地址是可以办到的。当然,这也是合理的,因为微博的定位就是微型博客,博客不同于QQ、手机号码这样的私人联系方式,博客在不作隐私设置的前提下对网络上的任何人都是公开的,因此获得新浪微博的地址并无任何不妥。
像我的新浪微博地址:http://weibo.com/lincanbin 我就可以非常大方地放出来让你们关注。
3、所以@段炼 的说法,也是错误的,OAuth协议只返回openid,并不返回登陆密码。
4、@安雅 的“直接引入原qq好友关系”这个功能是不存在的。
5、@VrWorking 的关于移动终端登陆的说法(原文:“如果在手机或平板客户端 App,就比较难了。因为 App 的特点你是看不到地址栏的,因此无法确认这个登录页面是不是腾讯的。只能看这个 App 是否是官方的,和是否具备足够的知名度。满足这两个条件下的 App 开发商不会、也没必要去偷取你的账户信息(也不绝对,比如 CSDN 脑残程序员偷偷的保存用户密码明文到数据库,结果城门失火殃及池鱼)。”),其实腾讯是有另一个API,可以调用QQ客户端登陆的,并非只有Webview一个方法。不过目前这个只支持安卓和IOS,WP等小众系统是不支持的,如下图:
单点登录(Single Sign On)
使用了这个API的,大家比较熟悉的就有“天天爱消除”、“唱吧”等等,不需要使用WebView跳转到一个网页手动输入账号密码登陆,也是非常方便的。不过SSO登陆这个API会启动QQ客户端,响应在一些手机上相对比WebView较迟缓。
6、@痴梦 说的“婊子立牌坊”,也是错误的说法,首先腾讯的QQ互联要求(即“登陆后不需添加任何新的即可直接登陆”)只适用于留言板等应用,而论坛之类的应用,并不适合。
像各位想保护隐私嘛,所以腾讯返回给与QQ互联互通网站的信息也是有限的,有用的只有一个opedid和name(昵称)。可是论坛为了区分各个用户,必须有identifie,对外展示,所以至少需要再设定一个昵称。可是一个拥有多套登陆系统(必须有多套,最起码自己得有一套,不然就丧失独立性了)的网站,把Openid作为mainkey显然是不合适的,name的话更不用说,是绝对不能作为identifie的——因为有含有非法字符或者过长的可能性,也可能重复,有的网站也有提供UID登陆或者邮箱地址登陆的功能,如果直接把QQ昵称作为username入库,就可能导致该用户通过常规途径登陆失败。
简言:把腾讯返回的name作为username入库前需要做合法性检测,所以用户名是必须在登陆后再次填写的。除非你打算全站只用QQ这个登陆系统,而不采用自己独立的账号系统。
(合法性检测:长度,不能全为数字,不包含非法字符,数据库user表同字段中不存在相同数据。)
当然,有些网站像知乎,是允许使用已存在的name的并且可以任意修改的,像我叫林灿斌,你也可以在知乎注册个号叫林灿斌,你QQ昵称是林灿斌,用QQ登陆后知乎自动帮你创建一个name是林灿斌的号,这样的网站逻辑就可以不输入新昵称直接登陆。而大多数网站,像大部分论坛、微博……name都必须是唯一的,这样就不可能实现直接登陆,有些是历史遗留问题,有些是本意如此。
最后按照知乎答非所问的风气,最后应该会有人出来普及OAuth协议然后获得高票赞同吧,建议那些并没有相关经验的回答者等那种普及知识的回答出现并且看完再作答。
————————————————————————
最后,其实QQ的审核规定还是挺严格的,不过QQ旗下的Discuz是不需要遵照这个规定的。
因此很多使用DIscuz的论坛,都这样,造成了混乱,与腾讯本意相违,这里抄送腾讯反省一下。
————————————————————————
另外还是有好网站的,像我的网站,用QQ或者微博登陆,只需要设置一个在我站显示的昵称(原因见第6条),并不需要设置密码(当然也在设置里提供了设置密码的选项)。
那些让那么多人骂娘的网站,多数是采用了一家不遵守腾讯QQ互联规定的公司旗下的Discuz的程序。
另外OAuth只是方便下次登录,我觉得注册时设置账号密码的设计对于站长来说还是必要的,防止上了贼船下不来,例如: