针对移动客户端的RESTful Java Web服务中的身份验证

4

我已经找到了很多学术上的答案,但我希望能从实践者那里得到一个答案。

背景

我想创建一个基于Java的RESTful API,使用Grails框架为各种移动客户端(iOS和Android)提供访问受保护资源的服务。我需要在某些请求上进行身份验证,并且我已经设置了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》中的优秀答案。

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}"
     }
}

谢谢Alex,我已经加密了我的连接并对我的API进行版本控制,所以https;//api.example.com/v1/method是相当标准的。然而,我还需要授权 - 如果这不清楚,很抱歉。用户并不总是共享相同的资源。 - KappaMax
Alex,这实际上是我的问题。好的,既然我的移动应用程序没有存储用户名和密码,而只是在成功登录后存储API令牌,那么基本身份验证是否合适,还是只需在后续请求中标记我的令牌?我已经尝试了多种方法,从cookie到2-legged OAuth,但似乎找不到最佳实践的解决方案。 - KappaMax
你的应用程序是如何存储令牌的?在程序重新启动时是否需要输入登录/密码? - Alex Pavlov
我知道BasicAuth是在授权头中的用户名:密码。我想知道的是,在实践中,人们是否使用标头发送令牌代替凭据,而不是基本身份验证,而更像是自制的身份验证和授权。是的,所有内容都通过SSL进行。还是您会将应用程序商店的用户名/密码发送到每个请求中。再次强调,我正在尝试从那些这样做的人那里了解他们实际上做了什么,而不是他们应该做什么。 - KappaMax
1
实际上,我想了解的是他们为什么这样做的信息,而不一定是他们实际上做什么。无论如何,在真正将其应用于iTunes App Store和WordPress插件的发布项目中执行此操作的人中:如果用户身份很重要(权限或日志记录),则使用基本身份验证;否则,请在URL中使用API密钥。 - Alex Pavlov
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接