用于移动客户端的RESTful Java web服务中的身份验证



我已经找到了许多关于这个问题的学术答案,但我希望该领域的从业者能给出一个答案。

背景

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

问题

对于将由移动设备以及最终由其他web应用程序使用的web服务,人们建议使用什么身份验证方法

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

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

需要

如果你有这样或那样的倾向,我想知道你为什么会选择这种方法。更好的是,如果你在Grails中这样做,我很感兴趣。

我已经知道了

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

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

1) api url必须仅为SSL-使用专用域AND 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}"
}
}

最新更新