REST 中如何安全地处理用户登录问题? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Feiox
V2EX    API

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

  •  
  •   Feiox
    feiox 2014-07-18 16:08:00 +08:00 15598 次点击
    这是一个创建于 4178 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在设计一个 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     Solana     1141 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 49ms UTC 17:50 PVG 01:50 LAX 09:50 JFK 12:50
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86