在使用 OAuth 做第三方登录时必须用 session 来记录信息吗?

红薯 发布于 2016/05/27 11:38
阅读 1K+
收藏 2

在使用例如 ScribeJava 这样的第三方认证框架做登录时候。首先是生成一个认证 URL 然后对方回调网站提供的 URL。

生成 URL 的时候会有一个 OAuth20Service 实例,需要在回调的时候用到。

这样就必须在 session 里保存 OAuth20Service 实例,否则 callback 怎么拿到这个实例呢? 但是这样的话就要在 Web 应用中使用 session ,这是我最不愿意看到的,一般还有其他的做法吗?

加载中
0
乌龟壳
乌龟壳
callback的时候不是用户浏览器发起的,根本找不到用户的session,这个顶多放cache里而不是session
公孙二狗
公孙二狗
回复 @乌龟壳 : 是的,让浏览器 redirect 到我们的服务器,这样就把 cookie 带上了,cookie 里有 session id
乌龟壳
乌龟壳
回复 @jorneyr : callback不是浏览器发起的,是oauth服务器的回调呢
公孙二狗
公孙二狗
回复 @乌龟壳 : Session 的 ID 在 Cookie 里,服务器会自动的找到用户的 Session,不需要我们干预
乌龟壳
乌龟壳
回复 @jorneyr : 能找到session但是也要依赖一个形如cache的全局状态,表示哪个ID对应哪个session才行。
公孙二狗
公孙二狗
callback 是第三方服务器让 URL 带上 ST 重定向到自己的服务器,肯定能找到用户的 Session,然后自己的服务器用这个 ST 去第三方服务器获取登陆的有效性和获取用户信息。
下一页
0
SSSWIIILLL
SSSWIIILLL
session是单用户的,可以通过URL传参的方式来区分,比如用户的openid
0
凯特利
凯特利
我真的不会 不过进来学习
0
zigzagroad
zigzagroad
生成URL时产生Token并缓存起来,并将Token作为URL参数的一部分;需要缓存的其他数据需要与该Token建立对应关系。回调URL时,获取Token值,然后使用该Token值获取到与其对应的其他缓存数据;最后在你的OAth20Service中使用这些缓存数据。
zigzagroad
zigzagroad
如果不能缓存,那只能将相关数据作为URL参数再次提交过来了,前提是做好防破解工作。(只是设想)
红薯
红薯
有状态信息没法缓存,话说你做过还是自己在想啊
zigzagroad
zigzagroad
使用分布式缓存,或者存到数据库中;这两种都需要引入过期自动删除功能。
红薯
红薯
问题是在分布式环境里这个globalmap就是个大问题
zigzagroad
zigzagroad
在OAth20Service中获得Token参数和相关联的数据: String token = getTokenValueFromParameter(); relatedDatas = GlobalMap.get(token); (以上没有处理数据合法性校验等问题)
下一页
0
Jeff-Tian
Jeff-Tian
不用session,关键拿到 token 和 code 回调。
0
春眠不觉晓
春眠不觉晓
@红薯 哥, 这问题有解决方案了没?
返回顶部
顶部