当前位置 : 主页 > 手机开发 > 无线 >

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

来源:互联网 收集:自由互联 发布时间:2021-06-10
我已经在这个问题上找到了许多学术答案,但我想要一个来自该领域的从业者. 背景 我想创建一个基于Java的RESTful API,使用Grails框架为各种移动客户端(iOS和Android)通过我的服务访问受保护
我已经在这个问题上找到了许多学术答案,但我想要一个来自该领域的从业者.

背景

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

问题

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

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

>我可以做HTTP基本身份验证
>我可以进行HTTP摘要身份验证
>我可以实现OAuth身份验证(1.0或2.0)?
>我可以在我的请求中将凭据作为参数传递
>我可以使用上面的身份验证方法,然后传递委托/令牌进行身份验证
>我可以实现自己的自定义HTTP身份验证标头
>我可以使用cookie并在每次请求时将这些cookie传递给服务器
>其他……?

需要

如果你有一个倾斜的方式,我想知道为什么你会选择这种方法.更好的是,如果你在Grails中这样做,我很感兴趣.

我已经知道了……

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

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}"
     }
}
网友评论