第一方移动和单页应用的OAuth 2密码授权

时间:2017-10-03 22:37:38

标签: authentication mobile oauth oauth-2.0 single-page-application

我正在开发一个既有第一方移动应用又有单页网页应用的项目。我想使用OAuth 2进行身份验证,但我想知道是否允许这些公共第一方客户端使用此授权类型,因为它们无法保护其客户端凭据。

理想情况下,我不希望将移动用户推向外部浏览器或Web应用程序用户到单独的网页,以便使用授权代码授予类型进行身份验证。

我可以让密码授予类型与这些客户端类型一起使用,还是应该为第一方应用程序探索OAuth的替代方案?

2 个答案:

答案 0 :(得分:1)

对于"信任"应用程序,即你所说的"第一方"应用程序,通常可以使用移动应用程序的资源所有者密码授予。您可以交换访问令牌和刷新令牌的用户名和密码,然后将其尽可能安全地存储在移动应用程序中。在完成后,不要忘记从内存中清除最终用户的用户名和密码。

对于单页应用程序,转到授予流程是隐式授权,您将通过片段(#access_token=...)中的重定向接收访问令牌,以便SPA可以从那里获取它。在这种情况下,SPA永远不会拥有自己范围内的用户名和密码。这些只会暴露给授权服务器和/或身份提供商的登录界面(取决于您的实施)。

如果是SPA,您仍然需要初始重定向到授权服务器进行初始身份验证和授权;如果您需要刷新访问令牌,您可以查看OIDC规范,其中引入了额外的&prompt=none添加以允许通过例如隐式授权获取新的访问令牌。隐藏的iframe。最后,此方法依赖于授权服务器与最终用户的用户代理(=浏览器)进行会话,但具有SPA的来源,可以是任何类型的静态Web服务器。

答案 1 :(得分:0)

使用移动应用程序应该会更容易,因为通常有一些方法可以保证数据位的安全。例如,在IOS上你有钥匙串,你可以存储你的秘密。移动应用程序应该可以保持其客户端的安全,只要您不在某处的代码中留下它。

就SPA而言,我非常怀疑你会找到一种保证安全的方法。

我多次做的是构建一个非常简单的api,它处理OAuth2的复杂性并将ClientSecret保存在那里。 SPA将调用此api,此api将通过请求传递给OAuth2保护的真实api并将响应转发回SPA。所以基本上是一个额外的层。

显然,如果添加此图层,这也意味着您需要在前端应用程序中使用另一层保护。如果您有用户管理并期望用户在他们可以访问任何内容之前登录,那么这样做。当然,您的用户管理和OAuth2组件之间存在差异。 OAuth2确保只有经过身份验证的应用程序才能访问其数据,并且一旦用户通过身份验证,您就可以确定一切正常。

这样可以确保没有任何人在未暴露ClientSecret的情况下触及OAuth2 api。