什么是OpenID Connect授权流程来验证移动应用用户?

时间:2014-12-17 15:12:27

标签: mobile oauth openid openid-connect

我正在构建一个与RESTful API交互的跨平台移动应用程序,我想使用OpenID Connect对我的用户进行身份验证。我将构建自己的OpenID Connect提供程序服务器。

OpenID.net claims

  

OpenID Connect允许所有类型的客户端(包括基于浏览器的JavaScript和本机移动应用程序)启动登录流程并接收有关已登录用户身份的可验证断言。

但是,我找不到任何解释如何为移动应用客户端进行身份验证的文档。

This StackExchange answer清楚地表明OpenID Connect不支持"资源所有者基于密码的授权"流程或客户凭证"流动。

只留下了#34;授权码"流(通常由服务器端应用程序使用)和"隐式授权"流(通常由客户端应用程序使用)。这两者似乎都依赖于将用户重定向到提供者的授权端点,并使提供者重定向回客户端URL。我不知道这如何适用于移动应用。

任何人都可以向我解释(或者更好,请指教我或一些示例代码),这解释了如何做到这一点?

更新

澄清:OpenID Connect依赖于客户端将用户重定向到授权端点,然后提供商将用户重定向回到客户端。如果客户端不是网络应用程序,这怎么可以工作?

4 个答案:

答案 0 :(得分:13)

移动应用程序,至少在iOS和Android上,可以注册自定义URL方案,以便来自浏览器的重定向可以将用户以及一些查询参数发送回您的应用程序。

因此,您可以在本机移动应用程序中使用这些流程,但它涉及将用户发送到Web浏览器(外部浏览器应用程序或应用程序内置的Web视图),以便他们通过OP进行身份验证

但是,我对整个方法的看法是,由于您正在开发自己的OP服务器和自己的原生移动应用程序,因此移动应用程序实际上是一个受信任的客户端,让用户直接输入用户名和密码没有任何问题进入你的应用程序我可以理解为什么OpenID Connect规范不支持这一点,因为它确实不是OIDC试图解决的问题,它可能会鼓励第三方应用程序请求用户直接输入用户名+密码。但是,我希望规范中有关于此问题的更多指导,因为我面临类似的情况,并且不确定如何继续。

答案 1 :(得分:2)

我认为OpenID Connect规范中的混合流可能就是您要使用的那个。 OpenID Connect Core Spec

这确实依赖于配置的返回URI,但正如James所说,您将使用自定义URI方案使移动操作系统在登录到您自己的应用程序后重定向。然后,您的应用程序将拥有一个访问代码,可用于根据需要获取访问令牌(假设您使用Oauth2来保护移动应用程序使用的后端API服务)。

有一个漏洞允许恶意应用程序劫持您的URI方案并获取令牌。有一个规范草案可以克服Proof Key for Code Exchange by OAuth Public Clients值得考虑实施的草案。

答案 2 :(得分:0)

如上所述,使用应用方案 URL 是正确的答案。我想添加额外的说明,因为上面的一些回复包含指向一篇文章的链接,该文章对合规 SSO 设计进行了不完整的断言,并使简单的 SSO 用例变得不必要地复杂。我认为 google 的模型是安全的,所以我可能会根据他们的工作原理来模拟 OIDC 与本土 IDP 的交互。

https://medium.com/klaxit-techblog/openid-connect-for-mobile-apps-fcce3ec3472 上面链接的这篇文章中的设计,如文章中的图表所示,不适用于谷歌在 Android 上的 oAuth/OIDC 实现。这有两个原因:

  1. Google 不会为输入为“Android”的 oAuth 客户端提供任何 client_secret
  2. 假设我切换到确实有秘密的“Web”应用程序:对于键入“Web”的 oAuth 客户端,Google 将不允许使用除“http”或“https”之外的 redirect_uri

相反,谷歌官方建议让典型的移动流程(您也应该使用 PKCE)在客户端上放置一个 ID 令牌,然后客户端可以将其交换为与应用服务器的会话: https://developers.google.com/identity/sign-in/android/backend-auth

这是安全的,因为您的 IDP 应该使用私钥对 JWT ID 令牌进行签名,以便它可以由您系统的应用程序/服务进行验证,并用于声明针对特定 OIDC 客户和受众的已验证(未过期)身份。< br/> ** 不要将 ID 令牌作为每个请求的授权传递,而是与您的后端交换一次,以获得由您的应用程序管理的安全会话上下文。

答案 3 :(得分:-1)

在github上查看MITREid project

  

MITREid Connect

     

此项目包含一个OpenID Connect参考实现   Spring平台上的Java,包括一个正常运行的服务器库,   可部署的服务器包,客户端(RP)库和常规实用程序   库。该服务器可用作OpenID Connect标识   提供程序以及通用OAuth 2.0授权服务器。