Web services RESTWeb服务的身份验证
我正在开始设计REST web服务,但还不清楚最好的身份验证方法。该服务将允许个人用户访问/管理他们自己的数据,因此需要某种类型的用户身份验证。我一直在考虑这些选项:Web services RESTWeb服务的身份验证,web-services,rest,authentication,oauth,openid,Web Services,Rest,Authentication,Oauth,Openid,我正在开始设计REST web服务,但还不清楚最好的身份验证方法。该服务将允许个人用户访问/管理他们自己的数据,因此需要某种类型的用户身份验证。我一直在考虑这些选项: 非统组织 OAuth似乎更多的是授权,而不是身份验证。我计划在服务中以本机方式处理授权,因此我不寻求解决方案。但是,OAuth也适用于身份验证吗 OpenID OpenID当然为身份验证提供了一个解决方案,但它更适合于允许用户使用他们的第三方凭据(Google、Yahoo等)。虽然我想支持这一点,但这不是我主要关心的问题,
- 非统组织
- OpenID
- HTTP基本身份验证
- 自定义身份验证
除了创建web服务外,我还将构建一个客户端(web)应用程序,它代表用户使用这些服务,但我不希望应用程序必须存储用户信息/凭据等。因此,类似以下内容: 用户(使用电子邮件/密码或第三方凭据进行身份验证) -->Web应用程序(使用应用程序ID进行身份验证) -->网络服务 同样,我希望允许其他人也构建客户端,因此中间层可以是任何第三方应用程序: 用户(使用电子邮件/密码或第三方凭据进行身份验证) -->第三方应用程序(使用应用程序ID进行身份验证) -->网络服务 我的最高要求是:
- 安全(显然)
- 本机凭据
- 支持第三方凭据(谷歌、雅虎、LinkedIn等)
- 支持多个客户端(web应用、移动应用、第三方应用等)
- 客户端凭据(只是一个应用程序ID?)
- 过期的登录会话
- 不需要授权
因此,我的问题是,基于上述情况(请让我知道这是否太模糊),是否有“最佳”方法?OAuth或OpenID是否合适,或者我是否把它弄得太复杂了,应该只使用我自己的身份验证 编辑: 我认为我需要实施以下措施: 1) 本机凭据/令牌(通过SSL的HTTP基本身份验证?) 2) 一个OpenID“依赖方”,允许我的api使用托管在别处的OpenID(即“支持第三方凭据”) 3) OAuth“消费者”,允许我的api访问第三方服务(如访问用户的LinkedIn配置文件) 4) 一个OpenID“提供者”,允许人们在其他地方使用api的本机ID(可选) 5) OAuth“提供者”,允许第三方应用程序代表用户访问我的api(可选)
这似乎是对的,还是我让它变得比需要的更复杂了?基于您的需求,我认为
OAuth 2.0
实际上可能是一个有趣的选择。OAuth确实是一种授权协议,但它也使用clientId
和clientSecret
对客户机进行身份验证。您可以使用客户端凭证流
,并选择不包括刷新令牌
,这样用户就拥有一个访问令牌
,该令牌在一定时间后过期。由于OAuth是一种广泛使用的协议,它们已经有许多客户端和服务器端库供您和您的客户端使用
如果您认为OAuth对于您的应用程序来说太重或太复杂,我可能会坚持使用Basic Authentication
而不是HTTPS
。但正如我在另一个类似问题的答案中所说,我永远不会发明自己的身份验证机制
对于更多的信息,您还可以看一下我前面给出的类似问题的另一个答案: < P>一个很好的选择是“共享密钥认证”。这是Amazon web服务和Windows Azure存储服务使用的身份验证类型。我们在开发的REST服务中使用了共享密钥身份验证。你可以在谷歌上快速搜索“共享密钥认证”,你会得到很多详细信息 我写了一篇关于这个的博客文章 高级步骤包括:
您可以使用HTTP Basic Auth,其中传输的密码实际上不是一个密码,而是一个令牌,客户端在不同的资源请求中获取该令牌,他/她/它必须提供他/她/它的密码一次,而且只能提供一次(甚至可能通过不同的通道)。这不会保护中间人攻击(因为没有消息签名),但其思想是,您可以始终要求客户端以某种方式(即在您自己的身份验证服务上)生成动态令牌,然后让它将该令牌作为密码替换发送,这样实际密码就不会通过网络不断传输。 是的,这看起来像是一个“自定义身份验证解决方案”,但实际上并不是因为你可以强加任何规则