Java Web(Spring MVC) 用户验证问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ruoran
V2EX    Java

Java Web(Spring MVC) 用户验证问题

  •  
  •   ruoran 2014-01-20 03:15:18 +08:00 10426 次点击
    这是一个创建于 4348 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近我在学用 Spring MVC 写 RESTful API. 现在到了加用户的时候。

    以下问题可能组织的不是很好,好多概念还很模糊 :)

    1. 我现在这个练习的web service 简单来说就是有User,每个User 可以 CRUD 属于自己的 Task。
    API想做成下面这样 (不知道spring security 有没有提供现成的功能)

    POST /user/authenticate form_data: { username, password }
    return: access_token
    第一步获取这个token,这个会expire,如果expired后续的call会返回“请重新authenticate”的status code。
    后续的API call 都会加上这个 access_token

    GET /user/{user_id}/tasks form_data:{ access_token }
    return: a list of tasks

    POST /user/{user_id}/tasks form_data: { access_token, content: “the content”}
    return: success create task

    POST /register form_data: { access_token, username: “”, password: “” }
    return: success create user

    以上的验证方式算是OAuth的简单用法么,以上方法正确可行么?

    2. 宏观来说,一般对于web的app,好像都用form login,然后用cookie+session记录这个login的状态。但是对于一个REST Service,如何实现用户的认证?
    我看了一下,
    (a). 简单的可以用http basic, http digest但是这个必须要https。
    (b). 复杂的是OAuth。 这个涉及到给第三方client权限,对于我的这个练习,web_client / mobile_client 是我自己写的,应该不需要认证。
    (c). 好像也可以沿用cookie,在android上把cookie存在某个地方,模拟浏览器的那些对cookie的动作,这个感觉不那么好。

    一般在企业里用的是什么样的用户认证方式?比如说QQ之类有不同客户端的应用(desktop,web,mobile)
    2 条回复    1970-01-01 08:00:00 +08:00
    yyfearth
        1
    yyfearth  
       2014-01-20 04:11:39 +08:00   1
    虽然我没有企业里面的经验,但是我看到的一般是推荐用 OAuth
    如果是简单的 https + basic auth 也可以,对于信任的客户端也是可以接受的

    或者自己做一套 token 的生成和验证算法 (其实和cookie session差不多)只不过把 token/session_id 放到 authenticate header 里面,我记得 amazon 的auth就是用的这样的方式。MVC 可以用 filter 或者 配置 Spring Security 来做验证。

    我之前还用过用 basic auth,但是里面的 username 和 password 实际上是 user id 和 hashed token,这样密码在客户端也有个比较基本的保护
    sharpnk
        2
    sharpnk  
       2014-01-21 08:44:32 +08:00
    oAuth 1/2的,Spring有成的Library: https://github.com/spring-projects/spring-security-oauth

    具情取於你的workflow,但基本的流程都是用username和password一access token。然後你在每API call的Header都加上token就可以。API就可以是stateless的了,你不用心session的。但在客端你可能是需要保存token以便後使用。如果是web app的那你基本上只有cookie一。iOS可以放在keychain面。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5190 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 07:43 PVG 15:43 LAX 23:43 JFK 02:43
    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