4

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

背景

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

问题

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

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

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

需要

如果你有一种或另一种倾向,我想知道你为什么会选择那种方法。更好的是,如果您在 Grails 中执行此操作,我会非常感兴趣。

我已经知道...

我已经阅读了这里的优秀答案以及 Richardson 和 Ruby 的书Restful Web Services

4

1 回答 1

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}"
     }
}
于 2012-12-18T15:29:08.673 回答