【发布时间】:2015-01-10 04:38:25
【问题描述】:
这似乎是一个被广泛询问的问题,在阅读了大量有关该主题的文档之后,我仍然不确定是否正确理解了所有内容(我认为愚蠢是一个可能的答案;))。
我正在尝试构建一个向用户提供服务的 API。用户将通过 Facebook 或任何 OpenId 提供商进行连接(我将 Facebook 分开,因为他们实现了自己的连接系统)。
(我认为这是一个好方法,因为我不会存储用户的密码,并且最终在遇到类似 Gawker 问题的情况下问题会更少。)
当客户端(网络应用程序、移动应用程序等)向 API 发出请求时,必须随请求发送一个指示符,以识别哪个用户正在使用该应用程序。这通常通过在身份验证期间定义的 令牌 使用。
但是关于身份验证,我找不到任何有价值的示例、教程、关于如何正确实现它的说明。
我会(尝试)解释:
在我的(快乐护理熊的精彩世界)中,我将我的项目分为多个部分:
- RESTful API
- 将使用 api 的 Web 应用程序。理想情况下,我正在考虑制作一个完整的 html/css/js 项目,而不需要任何服务器端工作(php/python/java 或其他)
- 移动应用程序
- windows/mac/linux 应用程序
据我所见,每次有人问如何实现 RESTful API 身份验证时,都会弹出三个主要答案:
- HTTP 基本(+最好是 SSL)/摘要方式
- OAuth
- OpenId
由于我不会存储用户的密码,所以第一个对我来说很重要,但是另外两个让我感到困惑。
但是 OAuth 和 OpenId 不相同,一个 (OpenId) 代表 Authentication(问题的基础),而第二个 (OAuth) 代表授权!
当 Twitter 为其 API 实现 OAuth 时,他们并没有实现身份验证系统,而是设置了一种方法来指示他们的用户应用程序 X 想要访问用户帐户(在不同的访问级别)。如果用户当前没有登录 Twitter,他将首先必须验证自己,然后授权当前应用程序访问他的数据。
所以,澄清一下,OAuth 不是身份验证机制,它是:
允许安全 API 的开放协议 授权 (来源:http://oauth.net/)
那么,验证用户身份的唯一方法就是使用 OpenId。然后,该死的就成真了。
如果我以一个完全由 html/css/js 组成的 Web 应用程序为例,没有服务器端组件,则与 API 进行通信。
网络应用必须向 API 表明当前使用 API 的用户是 X 先生。
为此,Web 应用程序会显示一个包含 OpenId 提供者列表的弹出窗口,要求用户进行身份验证。用户单击其中一个,被重定向(或打开一个新的弹出窗口)到 OpenId 提供程序,指示他的登录名/密码,通过 OpenId 提供程序进行身份验证,返回成功并带有令牌(我简化了通信)。
太好了,网络应用现在知道用户确实是 X 先生。但是 API 仍然有任何线索!
最后,我的问题很简单:如何通过网络应用程序通过 OpenId 向 API 验证 x 先生,然后,网络应用程序和 api 如何保留当前正在使用的 X 先生的信息Web 应用程序,当然还有 API。
非常感谢您的帮助!
-编辑格式
【问题讨论】:
标签: api authentication rest openid