V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Feiox
V2EX  ›  API

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

  •  
  •   Feiox ·
    feiox · 2014-07-18 16:08:00 +08:00 · 15188 次点击
    这是一个创建于 3770 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在设计一个 App 与服务端交互的 REST 风格的 API 时,一直不知道如何处理有关用户登录的各种问题,如:

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

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


    另:有设计过 REST API (最好是已上线的应用)的童鞋,急切地想向您求教
    My Email :Fei2037%#gmail.com My QQ:Feiox#%qq.com
    实在找不到了,只能在这里求老师 ~
    8 条回复    2015-12-08 15:07:01 +08:00
    multiple1902
        1
    multiple1902  
       2014-07-18 16:16:08 +08:00
    OAuth 这样就挺好的。连接记得用 HTTPS 加密。
    cxh116
        2
    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
        3
    mytharcher  
       2014-07-18 17:55:28 +08:00 via Android
    正好之前画过一个流程图,可以参考下:

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

    - 登录时按时间生成该次登录用的token
    - token保存在Redis,值可以再设置此次登录的用户ID之类的,并设置一个expire
    - 每次要校验的操作,到Redis判断这个token是否存在,及token对应值的用户是否当前用户,并重置生存期
    - 长时间未使用,token自动清理
    dorentus
        6
    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
        7
    wzxjohn  
       2014-07-18 20:31:35 +08:00
    我觉得我目前接触的功能最多的REST API是Windows Azure,然后它的验证方式是证书验证。
    mofeiwo
        8
    mofeiwo  
       2015-12-08 15:07:01 +08:00   ❤️ 1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1061 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 19:43 · PVG 03:43 · LAX 11:43 · JFK 14:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.