这似乎是一个被广泛提问的问题,在阅读了大量有关该主题的文档后,我仍然不确定是否正确理解了所有内容(我认为愚蠢是一个可能的答案;))。
我正在尝试构建一个为用户提供服务的API。用户将通过Facebook或任何OpenId提供商连接(我将Facebook分开,因为他们实现了自己的连接系统)。
(我认为这是一个很好的方法,因为我不会存储用户的密码,如果出现类似的Gawker问题,最终会有更少的问题。)
当从客户端(网络应用程序,移动应用程序等)向API发出请求时,必须与请求一起发送指示符,以便识别哪个用户正在使用该应用程序。这通常通过在身份验证期间定义的令牌来使用。
但是关于身份验证,我无法找到有关如何正确实现它的任何有价值的示例,教程和解释。
我会(试着)解释一下:
在我(快乐护理熊的精彩世界)中,我将项目分为不同部分:
据我所知,每次有人询问如何实现RESTful API身份验证时,都会出现三个主要答案:
由于我不会存储用户的密码,所以第一个用于我,但另外两个让我感到困惑。
但OAuth和OpenId 不相同,一个(OpenId)代表身份验证(问题的基础),其中第二个(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通过Web应用程序向x先生验证API,然后,web应用程序和api如何保留当前正在使用的先生X的信息网络应用程序,当然还有API。
非常感谢你的帮助!
- 编辑格式
答案 0 :(得分:2)
(如果您不想阅读,下面的列表总结了整个想法)
一个可能的解决方案(告诉我,如果我错了)将在消费者(网络应用程序,移动应用程序等)中显示登录表单,用户点击它的提供者(myopenid) ,谷歌等)打开弹出窗口进行登录。 棘手的部分是return_to参数将设置为API,而不是网站
然后,API将重新发送check_authentication并获取is_valid:true(或不是)。 在此步骤中,应用程序将查询api以返回返回身份验证状态(处理,失败,成功)的特定URL。在处理过程中,会向用户显示一个指示符(加载gif),如果成功/失败,则会向用户显示结果。
如果api收到is_valid:true,那么它会向openid服务器询问有关用户的信息,比如email,firstname,lastname,并将它们与用户的数据库进行比较。如果匹配,则api在其自身和应用之间创建会话,如果用户是新的,则创建新条目然后创建会话。
会话将是具有特定持续时间的唯一令牌(可能等于openid server assoc_handle持续时间?)
这似乎是可能的,但我不是安全方面的专家。
为了解释简单的事情,这里有一点点“地图”:
注意:Provider是OpenId服务器(提供有关身份验证的信息)
答案 1 :(得分:2)
您真的不想使用OpenID登录API。正如您所说,OpenID用于身份验证,即Who,而OAuth用于授权,即我是否被允许?但是您的结构建议您将API用作后端,将Web应用程序用作前端。
最好的方法是在Web应用程序上使用OpenID对用户进行身份验证,然后Web应用程序连接到API并存储OpenID凭据。然后,web-app知道用户是谁,并且可以提供服务。 API与用户无关,只是它存储了数据。
OpenID和OAuth之间的根本区别在于它的使用。在你的情况下,你可以有类似的东西:
-------- --------- -------
| User | <------> | App | <--------> | API |
-------- OpenID --------- (OAuth) -------
用户永远不会直接与API交互:谁想要手动发送HTTP请求? (lol)相反,该服务是通过应用程序提供的,可以选择使用OAuth授权。但是,如果单个应用访问API,您可以创建应用&lt; =&gt; API连接内部,永远不会暴露它。