【发布时间】:2013-11-12 08:06:03
【问题描述】:
我开始设计 REST Web 服务,但不清楚最佳的身份验证方法。该服务将允许个人用户访问/管理他们自己的数据,因此需要某种类型的用户身份验证。我一直在研究这些选项:
- OAuth
OAuth 似乎更多的是关于授权而不是身份验证。我计划在服务中本地处理授权,所以我不是在寻找解决方案。但是,OAuth 是否也适用于身份验证?
- OpenID
OpenID 确实提供了一种身份验证解决方案,但这更多是为了允许用户使用他们的第 3 方凭据(Google、Yahoo 等)。虽然我愿意支持这一点,但这不是我主要关心的问题,我肯定会允许用户使用本机凭据(电子邮件/密码)进行注册。
- HTTP 基本身份验证
这很容易实现,但据我了解,这可能不是一个非常安全的方法。此外,似乎每次访问都需要交换凭据,但我希望用户进行一次身份验证,然后通过会话令牌继续访问。
- 自定义身份验证
基本上,推出我自己的登录/令牌生成服务,并需要一个有效的令牌来访问所有其他资源(显然,一切都将通过 SSL)。
除了创建 Web 服务之外,我还将构建一个代表用户使用这些服务的客户端(Web)应用程序,但我不希望该应用程序必须存储用户信息/凭据/等等。所以,是这样的:
用户(使用电子邮件/密码或第 3 方凭据进行身份验证) --> Web 应用程序(使用应用程序 ID 进行身份验证) --> 网络服务
再一次,我希望其他人也可以构建客户端,因此中间层可以是任何 3rd 方应用程序:
用户(使用电子邮件/密码或第 3 方凭据进行身份验证) --> 3rd 方应用程序(使用应用程序 ID 进行身份验证) --> 网络服务
我的最高要求是:
- 安全(显然)
- 本机凭据
- 支持第 3 方凭据(Google、Yahoo、LinkedIn 等)
- 支持多个客户端(Web 应用、移动应用、第 3 方应用等)
- 客户端凭据(只是一个应用 ID?)
- 登录会话过期
- 不需要授权
所以,我的问题是,基于上述(如果这太模糊,请告诉我),是否有“最佳”方法? OAuth 或 OpenID 是否合适,还是我把它弄得太复杂了,而应该只使用我自己的身份验证?
编辑:
我认为我需要实现以下内容:
1) 原生凭证/令牌(基于 SSL 的 HTTP 基本身份验证?)
2) 一个 OpenID“依赖方”,允许我的 api 使用托管在其他地方的 OpenID(即“支持第 3 方凭据”)
3) 一个 OAuth“消费者”,允许我的 api 访问第 3 方服务(例如访问用户的 LinkedIn 个人资料)。
4) 一个 OpenID“提供者”,允许人们在别处使用 api 的原生 ID(可选)
5) 允许第三方应用代表用户访问我的 API 的 OAuth“提供者”(可选)
这看起来是对的,还是我让它变得比需要的更复杂?
【问题讨论】:
-
推荐文章best practices for a pragmatic restful api,你也可以看看其他人是如何实现的,比如github
-
“只是滚动我自己的身份验证”,永远不要这样做。滚动您自己的身份验证是软件工程最佳实践的对立面。人们毕生致力于解决“我们如何安全地验证用户身份?”问题。
标签: web-services rest authentication oauth openid