【问题标题】:Authentication in RESTful Java web service for mobile clients用于移动客户端的 RESTful Java Web 服务中的身份验证
【发布时间】:2012-12-05 00:45:27
【问题描述】:

我已经找到了很多关于这个问题的学术答案,但我希望从该领域的从业者那里得到一个。

背景

我想创建一个基于 Java 的 RESTful API,使用 Grails 框架让各种移动客户端(iOS 和 Android)通过我的服务访问受保护的资源。我需要对某些请求进行身份验证,并且我已经通过网络设置了 SSL(因此所有请求都通过 https 进行)。我的 Web API 最终将作为服务公开给其他 Web 应用程序。

问题

对于要被移动设备以及最终其他网络应用程序使用的网络服务,人们推荐哪种身份验证方法?

这些都是我的选择。你能告诉我什么时候适合每个用例吗?

  1. 我可以进行 HTTP 基本身份验证
  2. 我可以进行 HTTP Digest 身份验证
  3. 我可以实现 OAuth 身份验证(1.0 或 2.0)吗?
  4. 我可以在请求中将凭据作为参数传递
  5. 我可以使用上面的身份验证方法,然后传递一个委托/令牌进行身份验证
  6. 我可以实现自己的自定义 HTTP 身份验证标头
  7. 我可以使用 cookie 并在每次请求时将它们传递给服务器
  8. 其他...?

需要

如果您有一个偏向某一种方式的人,我想知道您为什么会选择这种方式。更好的是,如果您在 Grails 中执行此操作,我会非常感兴趣。

我已经知道了……

我已经阅读了出色的答案 here 以及 Richardson 和 Ruby 的书 Restful Web Services

【问题讨论】:

    标签: java web-services rest authentication grails


    【解决方案1】:

    REST 是无状态协议,因此使用“工作会话”——我的意思是登录/工作/(自动)注销的概念有些问题。由于其简单性,将凭证作为每个请求的参数发送似乎是最常用的方法。请记住,

    1) api url 只能是 SSL - 使用专用域和 ip 地址是有意义的,例如api.example.com 并将您的 Web 服务器配置为仅处理此地址和域的 SSL。只是为了避免意外泄露凭据。

    2) 尽可能避免在请求中使用登录名/密码,而是使用“API 密钥”(共享密钥)。如果您只需要身份验证,即您不需要授权(所有用户共享相同的权限),您始终可以使用“API 密钥”而不是登录名/密码,并且无需记录(谁做了什么)。

    3) 与其在每个请求中发送 API 密钥,不如使用共享密钥“签名”请求并提供签名。有了足够长的密钥,您就可以在普通未加密的 http 上使用这种技术。

    === 回复评论 ===

    如果您需要授权,只需使用基本身份验证:

    HTTPBuilder builder = new HTTPBuilder("https://api.example.com/v1/foo/bar")
    builder.auth.basic(login, password)
    builder.headers.put('Accept', 'application/json')
    def result = builder.request(POST, JSON) { req ->
         body = [
                    ....
                ]
    
         response.'201' = { resp, json ->
                    ....
         }
    
         response.success = { resp, json ->
                    ....
         }
    
         response.failure = { resp ->
                    log.error "failure, ${resp.statusLine}"
         }
    }
    

    【讨论】:

    • 谢谢亚历克斯,我已经在加密我的连接和版本控制我的 API,所以 https;//api.example.com/v1/method 是相当标准的。但是,我也需要授权-如果不清楚,请抱歉。用户并不总是共享相同的资源。
    • Alex,这实际上是我的问题。好的,由于我的移动应用程序没有存储用户名和密码,而是在成功登录时存储 API 令牌,所以基本身份验证是否合适,或者只是在后续请求中标记我的令牌?我已经走了好几条路,从 cookie 到 2-legged OAuth,但似乎无法找到可接受的最佳实践解决方案。
    • 您的应用究竟是如何存储令牌的?程序重启时是否需要输入登录名/密码?
    • 是的,用户必须在应用程序启动时输入用户名和密码,这将与一些设备特定信息一起发送到服务器并交换令牌。令牌在后续请求中发送。
    • 实际上,我会寻找有关他们为什么这样做或那样做的信息,这对于他们实际做的事情并不是必需的。无论如何,来自那些在 iTunes App Store 和 WordPress 插件上发布的真实项目中真正做到这一点的人:如果用户身份很重要(权限或日志记录),则通过 ssl 进行基本身份验证,否则在 url 中使用 API 密钥。
    猜你喜欢
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2016-02-20
    • 1970-01-01
    • 2015-07-09
    相关资源
    最近更新 更多