使用第三方Oauth提供程序对API的用户进行身份验证

12
我正在将一个服务器端的Web应用转换为单页JavaScript应用,使用RESTful API。目前,用户可以使用Facebook、Twitter、Google等方式进行身份验证,也可以通过电子邮件和密码进行身份验证。我该如何允许相同形式的身份验证运行在RESTful API上?我猜它看起来像这样:
  1. 在客户端与提供程序进行身份验证。
  2. 从Oauth响应中取出某些信息,并交换为访问令牌,在我的服务器上调用API。
  3. 对后续的API调用使用基于令牌的身份验证。
我走在正确的道路上吗?如果是这样的话:
  1. 是否有JS库处理多个提供程序,还是每个提供程序都需要包含类似Facebook的JS SDK之类的东西?
  2. 生成令牌的API应该是什么样子?特别是,我需要从Oauth提供程序那里得到什么,以及我如何在服务器上验证它?

我经常发现那些“离题”的问题恰好符合我的需求。从点赞数来看,这是许多人自己也在问的问题。 - Leogout
2个回答

7
我建议生成API访问密钥或使用专门用于您的API的单独OAuth流程。从概念上讲,您需要将创建服务帐户和连接远程帐户的行为分开。您可能可以完成您所描述的操作,但会令人困惑。
要使客户端中的OAuth更容易,请查看oauth.io

5
在服务器端处理身份提供者的认证流程要比在客户端处理更容易。因此,您的REST服务器应支持自己的身份验证方法(也可以基于OAuth),并将其传输到第三方提供者。因此,一个流程看起来像这样:
  1. 从客户端(JS)发起登录过程 - 调用您的REST auth端点,指定要登录的网络(例如myserver.com/login?provider=facebook)。

  2. 在服务器端处理登录流程 - 重定向到提供程序登录端点,接收登录回调,处理响应(获取Facebook会话令牌等)。

  3. 发出自己的用户会话(或令牌,如果您正在执行OAuth),并向JS客户端做出响应。

有几个社交登录库可以帮助您,请查看http://hybridauth.sourceforge.net/(PHP)或http://code.google.com/p/socialauth/(Java)。
还有几个商业解决方案可以让您的生活变得更加轻松(我为Gigya工作,所以我有偏见),但前提是您有预算。

谢谢,从技术角度来看这很有道理。我是从UX的角度考虑,希望有一种方式可以在不重定向的情况下保持我的单页应用程序。看起来Facebook使用他们的JS SDK可以做到这一点,但可能不适用于其他情况。 - Kris Braun
您可以通过打开弹出窗口来避免从您的页面重定向。您不必从单个页面重定向到登录REST端点,您可以打开一个弹出窗口到该端点,并且将重定向到IDP(如Facebook)在该弹出窗口中完成。在登录过程结束时,您必须通过弹出窗口向主页面上的JS发出登录响应和会话信号。 - Rotem Hermon
太好了!由于我只在单个窗口中工作,所以我没有考虑弹出窗口和页面之间的通信。 - Kris Braun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接