关于第三方sdk登录的程序设计问题

大家好,请教一个问题。
有一个手机app,需要做第三方的登录(sina,qq,facebook等)。
原来的设计思路是,第三方登录成功后,直接把第三方的用户名 “abc”,发给服务端,然后在数据库里创建一个账号"abc",以后就用这个账号来进行游戏。
但是现在问题出现了,因为第三方的登录与验证都是在客户端完成的,最终只发给服务端一个用户名就行了。这样,如果有人攻击你,直接发送一个"abc"到服务端,不就可以冒充别人的账号了?

不知道大家有没有什么好的思路,来解决这个问题。

拿第三方的唯一标志id 与服务器对应一个账号id啊

通常你用第三方登陆都会返回一个唯一标识,比如QQ登陆返回的json结果中有个openid值,把该值也传给服务器去校验即可:14:

我本来的想法是,客户端调用登录后,会拿到一个类似token的东西,然后发到服务端,再由服务端用这个token去调用第三方接口,由服务端直接从第三方获取用户的信息,这样就能跳过客户端,从而实现安全了。但是好像好多平台并不提供这样的操作方式。

先去第三方 然后根据第三方 的id 去自己的服务器创建或返回用户, 这个设计是错误的

用服务器端做第三方sdk登陆,

就是sdk分客户端和服务器端的,服务器端做第三方登陆,成功后保存token,传给客户端的是openid和对应你们应用的id,请求的时候,是服务器端直接请求对应的接口,转发一次

1.先取第三方取access_token 和openid(uid),openid是唯一的,表明用户身份的
2.将openid和token传给服务器,服务器拿openid进行注册,并生成openid对应的密码
3.当注册成功后服务器返回sessionid和对应密码(需不需要ssl加密看自己喜好)
4.将openid和对应密码加密后存在本地,本地需要记录的是:openid、对应密码、上一次登录时的登录方式.(qq登录、微信登录,微博登录,或者用户自己输入账号密码登录)
5.客户端每次启动都登录,如果发现上一次登录方式是第三方登录,且此时本地存的openid有对应密码就将openid和对应密码穿服务器进行登录。
这样好处是客户端只走一次授权,将openid在自己公司服务器注册后以后就再也不走了(不再走指的是你项目不关闭,如果sessiodid超时,此时不用和第三方再对接,而是直接拿本地的openid和对应密码进行登录,不会在项目使用过程中,跳到授权页),当然你退出登录时要取消授权,然后重新登录时要重新授权,此时还是会重新跳到授权页的,另外sessionid在有效时间内不会随着不同设备登录而改变,只有超时时才会重新产生新的sid,且过期时间根据最后一次登录重新计算
6.当然最方便的就是sessionid永远不过期。

第二步,你的密码是谁生成的?
如果是自己服务器生成的,那么我删除游戏,再安装登录,走的第一次注册流程,显然不对吧
如果是第三方sdk服务器生成的,像sina,qq等这样第三方平台,是不会生成对应的密码吧

自己公司后台生成的。如果你删除应用或取消授权酒会重新走第三方授权。服务器判断openid已经注册过就会直接登录,且把对应密码给你

密码是自己公司后台生成的。如果你删除应用或取消授权就会重新走一遍第三方授权。然后将openid和token再提交给自己公司后台,服务器判断openid已经注册过就会直接登录,且把对应密码和sessionid再返回给客户端。只是觉得这样不安全。:14:

这样安全吗?
openid是否是唯一不变的?你这个方案,只需要发送openid到服务端,就已经确认身份了哦。都不需要密码的。
而且还有一个问题没有解决,当客户用第三方登录后,我是需要用客户在第三方的用户名,来在我自己的服务器上进行同名注册的,而这个用户名却是由客户端发给我的,我没办法验证,这个用户名的真伪。