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

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

  •  
  •   ruoran · 2014-01-20 03:15:18 +08:00 · 9875 次点击
    这是一个创建于 3958 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近我在学用 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   ·   实用小工具   ·   3079 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 13:39 · PVG 21:39 · LAX 05:39 · JFK 08:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.