Oauth 2.0 使用密码凭证流和一些第三方授权服务器

Oauth 2.0 使用密码凭证流和一些第三方授权服务器,oauth-2.0,Oauth 2.0,这是一个更一般性的问题,但我希望它仍然适用于这一问题 到目前为止,我了解到,一般来说,移动应用程序(如官方Pinterest应用程序)使用密码凭证流让用户直接登录和访问API。(我们假设他们使用OAuth进行此操作) 因此,他们收集用户名和密码,将其发送到服务器,并获得一个令牌作为回报,用于后续请求 现在,用户不想注册并创建一个帐户,例如使用Facebook作为授权服务器。所以我的问题是: 这个流程是如何实现的 我的猜测是: 用户在移动应用程序中选择“使用Facebook登录” Facebook

这是一个更一般性的问题,但我希望它仍然适用于这一问题

到目前为止,我了解到,一般来说,移动应用程序(如官方Pinterest应用程序)使用密码凭证流让用户直接登录和访问API。(我们假设他们使用OAuth进行此操作)

因此,他们收集用户名和密码,将其发送到服务器,并获得一个令牌作为回报,用于后续请求

现在,用户不想注册并创建一个帐户,例如使用Facebook作为授权服务器。所以我的问题是:

这个流程是如何实现的

我的猜测是:

  • 用户在移动应用程序中选择“使用Facebook登录”
  • Facebook登录页面以return\u uri=mobile app打开
  • 移动应用程序接收身份验证令牌
  • 移动应用程序使用客户端凭据并显示API:将此令牌用于用户X

  • 这是否正确?

    首先,应用程序不应使用密码凭据授权。政府对此相当清楚:

    在传统的客户机-服务器身份验证模型中,客户机 请求服务器上的访问受限资源(受保护资源) 通过使用资源所有者的 资格证书为了提供第三方应用程序访问 受限资源,资源所有者与共享其凭据 第三方。这造成了一些问题和限制

    然后,规范继续描述这些问题

    以及关于资源所有者密码凭据授予:

    授权服务器在启用此授权类型时应特别小心,并且仅在其他流不可行时才允许它

    OAuth2.0的全部目的是不必使用密码凭证授权之类的东西,即用户将其密码交给应用程序

    关于你的第二个问题:当用户不想在你的应用程序中注册和创建帐户,但想使用Facebook等进行身份验证时,会发生什么情况

    请记住,隐式授权和授权代码授权都是通过使用浏览器控件对用户进行身份验证来实现的。在与授权服务器的浏览器会话中,您可以随意以任何方式对用户进行身份验证。当然,您可以使用自己的用户/密码数据库,但也可以使用其他机制,如WS-Federation。在您的情况下,听起来用户希望使用Facebook进行身份验证

    然后,使用Facebook进行身份验证不是由您的客户端应用程序完成的,而是由您的授权服务器完成的。它通常通过使用Facebook授权码授权,然后通过调用读取用户的个人资料来获取他们的Facebook用户id、姓名等

    如果您不想自己构建这样的授权服务器,可以使用现有的授权服务器。一些公司提供登录即服务解决方案,包括

    更新:您在下面的评论中提出了几个后续问题。我将在这里简要回答:

    首先,一些使用OAuth保护其服务的公司允许授予密码凭据这一事实并不意味着您应该这样做。事实上,不提供这种可能性的公司可能比提供这种可能性的公司更多

    与设备应用程序共享密码存在真正的信任问题和真正的安全风险。首先,设备上的应用程序比服务器更容易被破解。此外,如果你给应用程序你的密码,可能该应用程序还需要将其存储在某个地方以备将来使用。作为一个用户,我只希望存储是安全的,不会受到我机器上可能运行的恶意软件的影响。有关更多问题,请参阅上述OAuth 2.0规范中的介绍

    其次,所有好的授权服务器都区分第一方客户机和第三方客户机。像您这样的第一方客户机由控制授权服务器的同一家公司控制,对于此类应用程序,授权服务器不要求用户允许共享数据,因为谈论与自己共享数据毫无意义。这就是为什么这些公司的网站不询问您是否允许与他们共享他们代表您持有的数据。他们已经拥有了它,而且没有“分享”在进行

    当然,你可能会说,你从未见过这些公司谈论第一方客户和第三方客户之间的区别。但他们不这么做的原因应该很明显:当你和他们打交道时,你总是一个第三方应用程序。他们不需要告诉你他们对待自己不同

    我将在您的场景中选择的机制取决于客户端应用程序的性质以及它访问的服务的性质。你的要求是什么


    无论如何,如果应用程序正在运行的设备有一个安全的存储设施,例如Windows Phone 8.1,我可能会考虑使用授权码授权而不需要客户端凭据。这样,用户就不必再次登录。如果我们谈论的是网站或SPA,我会考虑隐式授权(如果授权服务器提供了“记住我”的特性)。同样,该规范给出了几种情况下每种补助金类型的优缺点。

    谢谢,这很有帮助。你能解释一下你将使用什么策略进行应用内授权吗(假设它是属于我们服务的我们的应用)?如果用户得到一个浏览器窗口,询问“XYZ应用程序”是否允许访问“XYZ服务”,这将不是一个很好的用户体验。Foursquare、Facebook、Pinterest你可以说它提供用户名/密码验证和第三方登录流。我是否正确地认为ex facebooks的oAuth2登录没有带来任何实际的安全性,因为一个邪恶的第三方ap