我已经找到了很多关于这个问题的学术答案,但我想要一个来自该领域的从业者的答案。
背景
我想创建一个基于 Java 的 RESTful API,使用 Grails 框架让各种移动客户端(iOS 和 Android)通过我的服务访问 protected 资源。我需要对某些请求进行身份验证,并且我已经通过网络设置了 SSL(因此所有请求都通过 https 发生)。我的 Web API 最终将作为服务公开给其他 Web 应用程序。
问题
对于移动设备以及最终其他网络应用程序使用的网络服务,人们推荐什么身份验证方法?
这些是我的选择。你能告诉我什么时候适合每个用例吗?
- 我可以进行 HTTP 基本身份验证
- 我可以进行 HTTP 摘要认证
- 我可以实现 OAuth 身份验证(1.0 或 2.0)吗?
- 我可以在请求中将凭据作为参数传递
- 我可以使用上面的身份验证方法,然后传递一个委托(delegate)/ token 进行身份验证
- 我可以实现自己的自定义 HTTP 身份验证 header
- 我可以使用 cookie 并根据每个请求将它们传递给服务器
- 其他...?
需要
如果你有一种倾向,我想知道你为什么会选择那种方法。更好的是,如果您在 Grails 中执行此操作,我会非常感兴趣。
我已经知道了...
我已经阅读了优秀的答案 here以及 Richardson 和 Ruby 的书,Restful Web Services .
最佳答案
REST 是无状态协议(protocol),因此使用“工作 session ”——我的意思是登录/工作/(自动)注销概念有些问题。由于其简单性,将凭据作为参数与每个请求一起发送似乎是最常用的方法。请记住这一点
1) api url 只能是 SSL - 使用专用域和 ip 地址是有意义的,例如api.example.com 并将您的 Web 服务器配置为仅为该地址和域处理 SSL。只是为了避免意外泄露凭据。
2) 尽可能避免在请求中使用登录名/密码,而是使用“API key ”(共享 secret )。如果您只需要身份验证,您总是可以使用“API key ”而不是登录名/密码,也就是说您不需要授权(所有用户共享相同的权限)并且无需记录(谁做了什么)。
3) 与其在每个请求中发送 API key ,不如使用共享 key “签署”请求并提供签名。如果 key 足够长,您可以在普通未加密的 http 上使用此技术。
=== 回复评论 ===
如果需要授权,使用basic authentication即可:
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}"
}
}
关于java - 用于移动客户端的 RESTful Java Web 服务中的身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13922337/