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

Cyr*_* N. 12 openid authentication api rest

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

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

(我认为这是一个很好的方法,因为我不会存储用户的密码,并且在类似的Gawker问题的情况下最终会有更少的问题.)

当客户端(Web应用程序,移动应用程序等)向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通信.

Web应用程序必须向API指示当前使用API​​的用户是X先生.

为此,Web应用程序会显示一个包含OpenId提供程序列表的弹出窗口,要求用户对自己进行身份验证.用户单击其中一个,重定向(或打开一个新弹出窗口)到OpenId提供程序,指示他的登录/通过,由OpenId提供程序进行身份验证,使用令牌返回成功(我简化了通信).

这很棒,网络应用现在知道用户真的是X先生.但是API仍然有任何线索!

最后,我的问题非常简单:我如何通过Web应用程序通过OpenId对x先生进行身份验证,然后,如何通过Web应用程序和api保存这是当前正在使用Web应用程序的先生X的信息当然还有API.

非常感谢您的帮助 !

- 编辑格式

Cyr*_* N. 2

(如果你不想阅读,下面的列表总结了整个想法)

一个可能的解决方案(如果我错了请告诉我)是在消费者(网络应用程序、移动应用程序等)中显示登录表单,用户单击其提供者(myopenid、google 等),打开一个弹出窗口进行登录。棘手的部分是 return_to 参数将设置为 API,而不是网站

然后,API 将重新发送 check_authentication 并获取 is_valid:true (或不)。在此步骤中,应用程序将查询 api 到特定的 url,该 url 返回身份验证的状态(正在处理、失败、成功)。在处理过程中,会向用户显示一个指示器(正在加载 gif),如果成功/失败,则会向用户显示结果。

如果 api 收到 is_valid:true,那么它将向 openid 服务器询问有关用户的信息,例如电子邮件、名字、姓氏,并将它们与用户的数据库进行比较。如果存在匹配,API 会在自身和应用程序之间创建一个会话,如果用户是新用户,则会创建一个新条目,然后创建会话。

该会话将是具有特定持续时间的唯一令牌(可能等于 openid 服务器 assoc_handle 持续时间?)

这似乎是可能的,但我不是安全专家。

为了更简单地解释事情,这里有一个小“地图”:

注意:Provider是OpenId服务器(提供有关身份验证的信息)

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