本网站QQ第三方登录对接时是怎样解决“没有明文密码而让用户登录”问题的?
我在系统对接QQ第三方登录时遇到一些问题,比如用户在第一次请求QQ登录时,QQ会获取登录信息并回调本网站地址,此时本网站帮它完成账号注册以及信息绑定动作。
问题来了,在第一次绑定用户信息时你可以获取到它的明文密码,此时调用你原有的用户登录流程即可。可是当用户第二次还是通过第三方登录时,你会发现只能获取到openId和accessToken,此时并不可能会有明文密码,那在调用原有的登录流程时就会有问题,因为原有的登录流程中是拿数据库里加密密码来对比的。
我现在暂时将openId默认作为用户密码,这样每次进来我都可以获取到这个值,并将它传入原有的登录流程中。这样看似解决了问题,但其实隐藏着风险。
所以想请教大家是怎样做的,有没有更好的方法???
Answers
我只做过微信登录,由始至终都是拿不到用户密码的,因为出于安全考虑不应该把用户的微信/qq密码告诉你,但是你居然能拿到明文密码?你只要给用户表里增加一个字段,存好用户的
openid
,等待微信/qq告诉你有个
openid
为
xxx
的用户登录了,就用这个
xxx
去寻找
openid
为
xxx
的用户,查到了就让他登录,没查到就让他注册。
openid
是每个用户唯一的标识,而且不会改变。
不用担心只使用
openid
登录会不安全,因为你能保证这个
openid
是来自腾讯的,腾讯说这个人登录了,你难道还能说不是吗?
你要把
openid
作为在你网站的用户名,
登录验证就是你的把
openId
accessToken
发送给腾讯的服务器,服务器会把验证结果告诉你,
如果认证正确,就可以让这个用户用这个帐号登录了
第三方认证过程
首先你的服务器有个信任的服务器,比如腾讯的服务器
1、首先用户选择 第三方登录,跳转到腾讯服务器认证
2、腾讯服务器认证成功后会给用户返回一个 url 类似于
http://你的服务器/path/to/login?openId=xxxxxx&accessToken=yyyyyyy
(其中,openid每个QQ号对应的唯一不变,accessToken是腾讯服务器随机生成,有有效期)
3、然后用户的页面就会跳转到这个url ,你的服务器就会从用户那里获得这个
openId
和
accessToken
4、你得到这个
openId
和
accessToken
,然后你就的服务器给腾讯的服务器(这个服务器是你可以信任的)用get/post把这两个参数发过去。然后腾讯服务器会给你答复,这个是不是有效的。
5、如果是效,那么就可以让他用这个
openid
登录,否则登录失败。
openid
是大家都知道的,所以说可以伪造,但是
accessToken
是认证成功之后腾讯服务器随机生成,并且有一定的有效期的,所以即使有人伪造了两个这样的参数,在第四步,你给你信任的腾讯服务器发送这个参数的时候服务器自然会给你返回一个错误。。。
第三方认证本身就是让你不需要保存用户的密码,不需要你认证,只是第三方服务器认证用户之后,把认证结果告诉你而已,只是保存用户的唯一标识,在这个里面这个唯一的标识就是
openid