REST 中如何安全地处理用户登录问题?

2014-07-18 16:08:00 +08:00
 Feiox
在设计一个 App 与服务端交互的 REST 风格的 API 时,一直不知道如何处理有关用户登录的各种问题,如:

- 判定用户是否已经登录
- 如何对每一次 api 请求进行验证
- 服务端与客户端通信时确保用户授权信息不被泄露。

简而言之,如何设计用户登录?


另:有设计过 REST API (最好是已上线的应用)的童鞋,急切地想向您求教
My Email :Fei2037%#gmail.com My QQ:Feiox#%qq.com
实在找不到了,只能在这里求老师 ~
15072 次点击
所在节点    API
8 条回复
multiple1902
2014-07-18 16:16:08 +08:00
OAuth 这样就挺好的。连接记得用 HTTPS 加密。
cxh116
2014-07-18 17:12:24 +08:00
- 每次登录后,为用户生成一个唯一的随机token,客户端调用时,把token传过来(query params or header),服务器根据token找到对应的用户
- 客户端调用需要验证的接口记得传token
- 简单的方案就是采用https

其实web网站的session也是基于token实现的,只是token是写在cookies里,由web框架自动管理

参考资料 https://auth0.com/blog/2014/01/15/auth-with-socket-io/
mytharcher
2014-07-18 17:55:28 +08:00
正好之前画过一个流程图,可以参考下:

http://yanjunyi.com/blog/posts/think-about-user-login-process.html
GhostFlying
2014-07-18 17:59:00 +08:00
oAuth2不错的
maikcn
2014-07-18 18:05:28 +08:00
之前上线的应用采用下面的方式

- 登录时按时间生成该次登录用的token
- token保存在Redis,值可以再设置此次登录的用户ID之类的,并设置一个expire
- 每次要校验的操作,到Redis判断这个token是否存在,及token对应值的用户是否当前用户,并重置生存期
- 长时间未使用,token自动清理
dorentus
2014-07-18 19:46:49 +08:00
OAuth2, 使用用户名和密码获取 access_token 和 refresh_token。每种客户端都预分配一个 client_id 和 client_secret(这样服务器就可以在必要的情况下禁用特定的 client_id;甚至可以根据不同的 client 分配不同等级的权限)。

> 判定用户是否已经登录
1) access token 没过期的话,直接认为用户已登录
2) access token 过期,有 refresh token 的话,使用 refresh token 来换取 access_token,成功的话就算登录成功,否则清除保存的 token,认为用户没有登录
3) 都没有的话,认为用户没有登录

> 如何对每一次 api 请求进行验证
OAuth2 的标准方式,每次发送请求时带上 access token。

> 服务端与客户端通信时确保用户授权信息不被泄露
使用 https。如果只是 app 用的话,使用自建 CA 签名的证书就可以满足要求,再 app 代码里作好证书验证即可;不过这样的话证书签发管理、处理证书过期等等会稍麻烦些,有条件的话还是建议购买正式的 ssl 证书。


^ 参见: http://tools.ietf.org/html/rfc6749#section-1.3.3
^ 注意服务器可以在必要的情况下强行使没过期的 token 失效(比如提供了让用户踢掉其它登录的客户端的功能),客户端发现这种情况要报错并提升用户重新使用用户名和密码登录。
wzxjohn
2014-07-18 20:31:35 +08:00
我觉得我目前接触的功能最多的REST API是Windows Azure,然后它的验证方式是证书验证。
mofeiwo
2015-12-08 15:07:01 +08:00

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

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

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

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

© 2021 V2EX