询问服务器 token 的实现方案

2015-07-02 15:48:38 +08:00
 xx314327475

目前笔者做了一款iOS的App,需要访问服务器资源,当App登录以后,服务器端验证通过后,会返回一个访问token,用于校验后序的api访问操作,App以后所有的请求都会带上这个token参数,现在想问下,这个token如何实现?

有朋友建议我使用session的session id来实现这个token,但是session销毁后,用户就必须重新登录了,你们有什么好的办法么?

11345 次点击
所在节点    Java
56 条回复
nisnaker
2015-07-02 16:20:05 +08:00
登录之后在服务端用当前用户的唯一id和时间戳做加密,加密的结果作为token返回给客户端。
之后每次请求带上这个token,服务端解密,如果能成功解密而且时间没有过期,就认为登录成功。
至于其他业务建议跟这个token解耦,该查询的查询,该缓存的缓存,不要把这个token当做session来用(存一些临时的东西神马的)。
6IbA2bj5ip3tK49j
2015-07-02 16:20:19 +08:00
放内存,放token和激活时间,每次访问API都刷新一下token的激活时间。超时的时候删掉就好了。
q84629462
2015-07-02 16:21:20 +08:00
token放哪看你服务器条件,内存大的放内存,内存不够大的就只能硬盘存储,不就只有这两种存档方式嘛
你也可以做个折中,活跃度高的token放内存,一段时间内不活跃的就扔硬盘
billlee
2015-07-02 16:22:03 +08:00
@xx314327475 这就看你的需求了。如果是长期的会话, 就按照 @q84629462 说的处理。如果是单次使用的会话,我是连续 20 分钟没有通信活动的情况下销毁。
q84629462
2015-07-02 16:28:00 +08:00
@billlee app用肯定是长期的了,支付宝app也没有一天不用就要登录一次的变态要求,楼主做的app应该不会比支付宝还危险吧
BuilderQiu
2015-07-02 16:31:32 +08:00
@xx314327475
都明白了还需要保存登陆状态么。

例如Java:
过滤器解析合法的,往ThreadLocal里保存用户信息就完了。
其他用的地方直接去取。
处理结束,清除ThreadLocal。
glasslion
2015-07-02 16:38:47 +08:00
@xx314327475 有毛不好的。 如果你们的服务器连session也不用的话,倒是没有必要单独为 token去破坏 server 的无状态性 , 既然都用了 session, 把token存内存/redis/数据库里能有啥坏处?
xx314327475
2015-07-02 16:40:24 +08:00
@q84629462 谁说要用明文了?
xx314327475
2015-07-02 16:41:26 +08:00
@hahasong cookie里面保存着 session id,然后通过session id 在服务器找回之前的session,但是session我要让他多久过期好呢?
xx314327475
2015-07-02 16:46:37 +08:00
@glasslion
@q84629462

那我这个session默认销毁的周期是多长时间呢?难道是永不销毁?
garfeildma
2015-07-02 16:47:37 +08:00
建议直接oauth吧,虽然复杂点,但是都有现成的实现,拿来用就好
xx314327475
2015-07-02 16:47:48 +08:00
@billlee 20分钟用户没用就销毁,然后21分钟用户使用了,我让用户重新登陆么?
hahasong
2015-07-02 16:47:49 +08:00
@xx314327475 对,web认证就是这样的。过期时间,那要看你app的设计需求了,如果是强安全的,像银行,证券类,每次放几分钟就超时的就设短一点。如果是聊天社交类的,你可以设一个月或者2周。每请求一次,就重设过期时间
xx314327475
2015-07-02 16:48:33 +08:00
@garfeildma 您说的是oauth 还是 oauth 2.0
xx314327475
2015-07-02 16:49:35 +08:00
@glasslion 问题是session默认生命周期存活多久?
anubiskong
2015-07-02 16:49:35 +08:00
session存数据库里面, nodejs+mongodb很容易实现, 其他的后端不知道
xx314327475
2015-07-02 16:50:45 +08:00
@hahasong 感谢!
zjmdp
2015-07-02 16:53:32 +08:00
@nisnaker 同意这种做法,用户唯一id可使用设备相关的id,ios的可以使用:[[[UIDevice currentDevice] identifierForVendor] UUIDString]
hahasong
2015-07-02 16:54:22 +08:00
@xx314327475 如果用户量不大,几十万以下的,可以用后台语言自带的session管理,比如php是用文件的形式。如果用户量比较大,对性能要求比较高。就开个redis当永久缓存用。每次放进去的时候设一下过期时间,到期会自动删除。或者用户退出登录就马上删除。业务场景都是这么用的
nisnaker
2015-07-02 17:19:05 +08:00
@zjmdp 这个id最好还是db里的主键,不然用户卖肾换手机咋办……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/202801

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX