Rails 手机 App 如何保持会话

hxh1246996371 · 2015年03月10日 · 最后由 treeinjar 回复于 2015年10月14日 · 9277 次阅读

我们公司的API是用Rails开发的,现在出手机端了,需要一种方式来保持会话。 我们现在的做法是,在登录的API里,验证成功后将会员ID加密后作为一个token加入到 Response的header里面返回给手机端,手机端接收到这个 token后每次请求都将这个token带到header里面,然后Rails后台对每个过来的请求进行判断,如果header里面有token就将其解密,然后获取到当前登录的会员。 请问这种方式有问题吗?还有没有其他的方式来实现呢?

共收到 10 条回复

嗯,就是这么做吧。 就相当于cookie一样。

大概是这样做,token 就相当于会话的 id,不过你提到的 token 生成机制貌似有缺陷,通过加密方式生成的话难以让 token 失效(过期),不如维护一个 token (user_id, token, expired_at)表,在登录的时候为会员生成 token,把会员 id 和 token 关联起来,另外存一个过期时间,通过时间控制 token 有效性。

大体流程对的。 token 加解密没必要,也不能增加安全性。只要在数据库绑定 token 和设备以及网络的关系,设定过期时间,就安全了。

#2楼 @vincent 没做过移动这块哈,token通过response header发送出去,那是一个自定义的header吗?如果是自定义的话,request header下次不会自动带过来吧 还是说api返回json中有token,然后客户端存下来下次再掉api的时候一起发送过来 谢谢!

#4楼 @jayliud 可以用 header 传 token,也可以用普通参数传 token,通常客户端登录成功后就一直保存这个 token (同时保存过期时间),每次请求的时候都带上 token。

#5楼 @vincent 这种会话保存机制除了用在用户登录验证之外,在移动端还可以用来做点啥呢?

考虑过用长连接来做么

@vincent 基本都解释了,其实本质上和web上的cookie类似,就是换成token了。

1.最基础的版本可以看成是一个永不过期的cookie,客户端存储存储,利用这个来实现验证,相当于保持登录状态,当然安全性比较差一点;

2.继续高级一点就是给token增加过期时间提高安全性;

3.再高级一点可以添加一个refresh_token用于刷新access_token,就是用refresh_token换access_token,可以参考微信的方法:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CNaccess_token(移动开发》微信登录),具体的一些细节可以根据实际情况来改进,首次登录的时候用用户名密码换取 和 refresh_token,以后不需要用户名密码,通过refresh_token去刷新access_token即可,重新登录同理,外加一个请求作用域scope基本是比较安全了,根据自身情况做调整;

4.“这种会话保存机制除了用在用户登录验证之外,在移动端还可以用来做点啥呢?” 作为资源请求的凭证,比如查看文章,需要用户登录才能查看,游客状态无法查看,那么就需要带上access_token,再请求资源的时候来判别当前用户是否有权访问资源;

5.header 头或者普通参数看你自己选择,header头看起来高端一些,你可以自定义一个header头属性,客户端存储这个token,每次需要验证权限的请求一起发送;

有些理解可能有偏差,仅供参考

感谢各位的细心解答

我只是来给wikimo点赞的

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册