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

标签 java web-services rest authentication grails

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

背景

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

问题

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

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

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

需要

如果你有一种倾向,我想知道你为什么会选择那种方法。更好的是,如果您在 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/

相关文章:

java - 获取 Accumulo 实例名称

java - 使用纯 JPA 和 Spring 在 View 中打开 session - 而不是 Hibernate session

java - android全屏 Activity 并隐藏键栏

java - Jersey Web 服务中的 JSON 数据未正确传输

java - RESTful Web 服务中的@POST

web-services - 微服务模式/架构中的数据库

php - PHP 中的 REST 身份验证 (CodeIgniter)

java - selenium webdriver xpath InvalidSelectorError

javascript - 传递给 Javascript 时的 ASP.NET DateTime 对象 "changes"

web-services - 为 Web 服务应用 HTTPS 的最佳实践