web-services - REST Web 服务的身份验证

标签 web-services rest authentication oauth openid

我开始设计 REST Web 服务,但不清楚身份验证的最佳方法。该服务将允许个人用户访问/管理自己的数据,因此需要某种类型的用户身份验证。我一直在研究这些选项:

  • OAuth

OAuth 似乎更多的是授权而不是身份验证。我计划在服务中本地处理授权,因此我不寻找解决方案。但是,OAuth 也适合身份验证吗?

  • OpenID

OpenID 当然提供了一种身份验证解决方案,但这更多的是为了允许用户使用他们的第 3 方凭据(Google、Yahoo 等)。虽然我想支持这一点,但这不是我主要关心的问题,我肯定会允许用户使用 native 凭据(电子邮件/密码)进行注册。

  • HTTP 基本身份验证

这很容易实现,但据我了解,这可能不是一个非常安全的方法。另外,每次访问似乎都需要交换凭据,但我更希望用户进行一次身份验证,然后通过 session token 继续访问。

  • 自定义身份验证

基本上,推出我自己的登录/ token 生成服务,并需要有效的 token 才能访问所有其他资源(显然,一切都将通过 SSL 进行)。

<小时/>

除了创建 Web 服务之外,我还将构建一个代表用户使用这些服务的客户端(Web)应用程序,但我不希望该应用程序必须存储用户信息/凭据/ETC。所以,像这样:

用户(使用电子邮件/密码或第三方凭据进行身份验证) --> Web 应用程序(使用应用程序 ID 进行身份验证) --> 网络服务

再说一次,我希望允许其他人也构建客户端,因此中间层可以是任何第 3 方应用程序:

用户(使用电子邮件/密码或第三方凭据进行身份验证) --> 第 3 方应用程序(使用应用程序 ID 进行身份验证) --> 网络服务

我的最高要求是:

  • 安全(显然)
  • native 凭据
  • 支持第三方凭据(Google、Yahoo、LinkedIn 等)
  • 支持多个客户端(网络应用、移动应用、第三方应用等)
  • 客户端凭据(只是应用 ID?)
  • 过期的登录 session
  • 无需授权

所以,我的问题是,根据上述内容(如果这太模糊,请告诉我),是否有“最佳”方法? OAuth 或 OpenID 是否合适,或者我是否让这变得太复杂,而应该只进行我自己的身份验证?

编辑:

我认为我需要实现以下内容:

1) native 凭证/ token (通过 SSL 进行 HTTP 基本身份验证?)

2) OpenID“依赖方”允许我的 api 使用其他地方托管的 OpenID(即“支持第 3 方凭证”)

3) 一个 OAuth“消费者”,允许我的 api 访问第 3 方服务(例如访问用户的 LinkedIn 个人资料)。

4) 一个 OpenID“Provider”,允许人们在其他地方使用 api 的 native ID(可选)

5) 一个 OAuth“提供商”,允许第 3 方应用程序代表用户访问我的 api(可选)

这看起来正确吗,还是我让事情变得比需要的更复杂了?

最佳答案

您可以考虑 JWT(JSON Web token ),请参阅 JWT draft rfc 。它肯定会满足您的安全性和 session 过期要求。然而,作为一个标准草案,它目前不太可能被广泛使用,这种情况可能很快就会改变,因为 JWT 是 OAuth 2.0 的一部分。 JWT 在大多数语言中都很容易实现,并且已经有很多库。作为一个简单的解释,JWT token 由 3 部分组成: header 、正文和签名。 header 和 body 是经过 basee64url 编码的 json 对象(字母与 base64 的最后 2 个字符不同),然后使用 HMAC256(或 header 中指定的其他算法)进行签名,RFC 解释了如何准确生成此签名。您可能想检查这个 online token generator .

JWT 对 http header 和查询参数友好。

关于web-services - REST Web 服务的身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19721403/

相关文章:

c# - 如何从 WCF 服务端捕获传入和传出的 XML

java - 当 REST 客户端和服务器在同一台服务器上时如何避免网络调用

java - 如何捕获 RESTEasy Bean 验证错误?

authentication - 使用 connect-auth 持久登录

web-services - 客户端 spring-ws 连接池是否可能?

Java,使用用户名和密码访问安全的 WSO2 Web 服务

web-services - 如何从 NAnt 调用 Web 服务

c# - “开放式”REST 框架 (.Net)

validation - 如何验证电子商务网站的电子邮件地址?

angularjs - 我应该在哪里将 Bearer token 注入(inject) AngularJS 中的 $http?