如何从Web应用程序向API验证用户身份?

时间:2010-12-17 21:45:52

标签: api authentication rest openid

这似乎是一个被广泛提问的问题,在阅读了大量有关该主题的文档后,我仍然不确定是否正确理解了所有内容(我认为愚蠢是一个可能的答案;))。

我正在尝试构建一个为用户提供服务的API。用户将通过Facebook或任何OpenId提供商连接(我将Facebook分开,因为他们实现了自己的连接系统)。

(我认为这是一个很好的方法,因为我不会存储用户的密码,如果出现类似的Gawker问题,最终会有更少的问题。)

当从客户端(网络应用程序,移动应用程序等)向API发出请求时,必须与请求一起发送指示符,以便识别哪个用户正在使用该应用程序。这通常通过在身份验证期间定义的令牌来使用。

但是关于身份验证,我无法找到有关如何正确实现它的任何有价值的示例,教程和解释。

我会(试着)解释一下:

在我(快乐护理熊的精彩世界)中,我将项目分为不同部分:

  • RESTful API
  • 将使用api的网络应用。理想情况下,我正在考虑制作一个完整的html / css / js项目,没有任何服务器端工作(php / python / java或其他)
  • 移动应用程序
  • Windows / mac / linux应用程序

据我所知,每次有人询问如何实现RESTful API身份验证时,都会出现三个主要答案:

  • HTTP基本(+最好是SSL)/摘要方式
  • 的OAuth
  • 的OpenID

由于我不会存储用户的密码,所以第一个用于我,但另外两个让我感到困惑。

但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。

非常感谢你的帮助!

- 编辑格式

2 个答案:

答案 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服务器(提供有关身份验证的信息)

  • 用户访问webapp并点击其提供商的登录图标(Google for ex)
  • webapp会打开一个包含提供者登录页面和访问页面的弹出窗口,并指定return_to 到Api
  • 提供者向Api发送信息
  • Api通过check_authentication
  • 验证这些信息
  • 如果无效,API会向webapp指示(每隔x秒询问api)失败
  • 如果有效,Api会向提供商询问有关用户的信息,例如电子邮件,显示名称等。
  • 如果用户存在,则会创建会话
  • 如果用户是新用户,则会将其添加到数据库并创建会话
  • Api使用令牌会话返回auth的状态(在本例中为成功),该会话将由Web应用程序用于进一步请求。

答案 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连接内部,永远不会暴露它。