Security 什么';这是移动应用程序的OAuth 2.0流

Security 什么';这是移动应用程序的OAuth 2.0流,security,mobile,oauth-2.0,Security,Mobile,Oauth 2.0,我正在尝试使用OAuth 2.0在移动应用程序的Web API中实现委托授权。根据规范,隐式授权流不支持刷新令牌,这意味着一旦授权访问令牌一段特定时间,一旦令牌过期或被撤销,用户必须再次向应用授予权限 我想这对于规范中提到的在浏览器上运行的一些javascript代码来说是一个很好的场景。我正在尝试最小化用户必须授予应用程序权限才能获得令牌的时间,因此授权代码流似乎是一个不错的选择,因为它支持刷新令牌 但是,此流似乎严重依赖web浏览器来执行重定向。我想知道如果使用嵌入式web浏览器,这个流程是

我正在尝试使用OAuth 2.0在移动应用程序的Web API中实现委托授权。根据规范,隐式授权流不支持刷新令牌,这意味着一旦授权访问令牌一段特定时间,一旦令牌过期或被撤销,用户必须再次向应用授予权限

我想这对于规范中提到的在浏览器上运行的一些javascript代码来说是一个很好的场景。我正在尝试最小化用户必须授予应用程序权限才能获得令牌的时间,因此授权代码流似乎是一个不错的选择,因为它支持刷新令牌


但是,此流似乎严重依赖web浏览器来执行重定向。我想知道如果使用嵌入式web浏览器,这个流程是否仍然是移动应用程序的一个好选择。还是我应该跟随隐式流

不幸的是,我认为这个问题没有明确的答案。但是,以下是我确定的选项:

  • 如果可以要求用户提供其凭据,则使用。然而,由于某些原因,这可能是不可能的,即

    • 可用性或安全策略禁止直接在应用程序中插入密码
    • 身份验证过程委托给外部身份提供程序,必须通过基于HTTP重定向的流(例如OpenID、SAMLP或WS-Federation)执行
  • 如果需要使用基于浏览器的流,则使用。在这里,重定向uri的定义是一个重大挑战,有以下几种选择:

    • 使用中所述的技术,其中一个特殊的
      重定向uri
      (例如
      urn:ietf:wg:oauth:2.0:oob
      )向授权端点发送信号,以显示授权代码,而不是重定向回客户端应用程序。用户可以手动复制此代码,或者应用程序可以尝试从HTML文档标题获取此代码
    • 在设备上使用
      localhost
      服务器(端口管理可能不容易)
    • 使用自定义URI方案(例如
      myapp://...
      )当取消引用时会触发已注册的“处理程序”(详细信息取决于移动平台)
    • 如果可用,请使用特殊的“web视图”(如Windows 8上的)来控制和访问HTTP重定向响应
希望这有帮助


Pedro

最流畅的身份验证用户体验,最容易实现的是在应用程序中嵌入webview。处理webview从身份验证点接收到的响应,并检测错误(用户取消)或批准(并从url查询参数中提取令牌)。
我认为在所有平台上都可以做到这一点。我已经成功地为以下几款产品完成了这项工作:ios、android、mac、windows store 8.1应用程序、windows phone 8.1应用程序。我这样做是为了以下服务:dropbox、google drive、onedrive、box、basecamp。对于非windows平台,我使用的是Xamarin,据推测它不会公开整个特定于平台的API,但它确实公开了足够多的API,使之成为可能。因此,即使从跨平台的角度来看,它也是一个非常容易访问的解决方案,您也不必担心身份验证表单的ui。

在移动应用程序中使用webview应该是在Android平台上实现OAuth2.0协议的一种经济实惠的方式

至于重定向uri字段,我认为
http://localhost
是一个不错的选择,您不必在应用程序中移植HTTP服务器,因为您可以覆盖
WebViewClient
类中
onPageStarted
函数的实现,并停止从
http://localhost
检查
url
参数后

public void onPageStarted(final WebView webView, final String url,
        final Bitmap favicon) {}

说明:移动应用程序=本机应用程序

正如其他评论和一些在线来源所述,implicit似乎自然适合移动应用程序,但最佳解决方案并不总是明确的(事实上,出于下文讨论的原因,不建议使用implicit)

本地应用OAuth2最佳实践

无论您选择哪种方法(有一些折衷需要考虑),您都应该注意以下使用OAuth2的本机应用程序的最佳实践:

考虑以下选项

隐含的

我应该使用隐式吗

引用第8.2节

OAuth 2.0隐式授权流(定义见OAuth 2.0[RFC6749]第4.2节)通常与在浏览器中执行授权请求和通过基于URI的应用程序间通信接收授权响应的实践一起工作。
但是,由于PKCE[RFC7636](第8.1节要求)无法保护隐式流,不建议将隐式流用于本机应用程序

通过隐式流授予的访问令牌也无法在没有用户交互的情况下刷新,从而导致授权代码授予流-- 它可以发出刷新令牌——对于需要刷新访问令牌的本机应用程序授权,这是一个更实用的选项

授权代码

如果您使用授权码,那么一种方法是通过您自己的web服务器组件进行代理,该组件使用客户机机密丰富令牌请求,以避免将其存储在设备上的分布式应用程序中

摘录自:

建议将授权代码授权流用于以下应用程序: 拥有一个web服务。此流需要服务器到服务器的通信 使用应用程序的客户端机密

注意:永远不要在分布式代码(如应用程序)中放入客户端密码 通过应用商店或客户端JavaScript下载

没有web服务的应用程序应该使用隐式 赠款流动