问题 使用第三方Oauth提供程序对API的用户进行身份验证[关闭]


我正在使用RESTful API将服务器端Web应用程序转换为单页JavaScript应用程序。目前。用户可以使用Facebook,Twitter,Google等或通过电子邮件和密码进行身份验证。如何允许在RESTful API上运行相同形式的身份验证?我猜它看起来像这样:

  1. 在客户端与提供商进行身份验证。
  2. 从Oauth响应中获取一些内容并将其传递给我的服务器上的API以换取访问令牌。
  3. 使用基于令牌的身份验证进行后续API调用。

我是在正确的轨道上吗?如果是这样:

  1. 是否有一个处理多个提供商的JS库,或者每个提供者都需要包含Facebook的JS SDK?
  2. 我的API应该如何生成令牌?特别是,我需要从Oauth提供商处获得什么以及如何在服务器上验证它?

11965
2017-08-05 19:41


起源



答案:


您可以更轻松地对服务器端的身份提供程序而不是客户端处理身份验证过程。 因此,您的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 所以我有偏见),但这只是在你有预算的情况下。


3
2017-08-06 18:10



谢谢,从技术角度来看,这是有道理的。我从一个用户体验角度思考,希望有一些方法可以保留在我的单页应用程序中,而无需重定向。看起来Facebook可能会使用他们的JS SDK,但可能不是更普遍。 - Kris Braun
您可以通过打开弹出窗口来避免从页面重定向。您不必从单个页面重定向到您的登录REST端点,您可以打开该端点的弹出窗口,并且将在该弹出窗口中完成到IDP(如facebook)的重定向。在登录过程结束时,您必须通过登录响应和会话从弹出窗口向主页面上的JS发出信号。 - Rotem Hermon
完善!因为我只在一个窗口中工作,所以我没想过在弹出窗口和页面之间进行通信。 - Kris Braun


答案:


您可以更轻松地对服务器端的身份提供程序而不是客户端处理身份验证过程。 因此,您的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 所以我有偏见),但这只是在你有预算的情况下。


3
2017-08-06 18:10



谢谢,从技术角度来看,这是有道理的。我从一个用户体验角度思考,希望有一些方法可以保留在我的单页应用程序中,而无需重定向。看起来Facebook可能会使用他们的JS SDK,但可能不是更普遍。 - Kris Braun
您可以通过打开弹出窗口来避免从页面重定向。您不必从单个页面重定向到您的登录REST端点,您可以打开该端点的弹出窗口,并且将在该弹出窗口中完成到IDP(如facebook)的重定向。在登录过程结束时,您必须通过登录响应和会话从弹出窗口向主页面上的JS发出信号。 - Rotem Hermon
完善!因为我只在一个窗口中工作,所以我没想过在弹出窗口和页面之间进行通信。 - Kris Braun


我建议您专门为您的API生成API访问密钥或使用单独的OAuth流程。从概念上讲,您需要将创建帐户的行为与您的服务分开,并连接远程帐户。你可能会把你所描述的内容拉下来,但这会令人困惑。

为了使客户端更容易使用OAuth,请查看 oauth.io


7
2017-08-05 21:16