Security 什么';这是移动应用程序的OAuth 2.0流
我正在尝试使用OAuth 2.0在移动应用程序的Web API中实现委托授权。根据规范,隐式授权流不支持刷新令牌,这意味着一旦授权访问令牌一段特定时间,一旦令牌过期或被撤销,用户必须再次向应用授予权限 我想这对于规范中提到的在浏览器上运行的一些javascript代码来说是一个很好的场景。我正在尝试最小化用户必须授予应用程序权限才能获得令牌的时间,因此授权代码流似乎是一个不错的选择,因为它支持刷新令牌Security 什么';这是移动应用程序的OAuth 2.0流,security,mobile,oauth-2.0,Security,Mobile,Oauth 2.0,我正在尝试使用OAuth 2.0在移动应用程序的Web API中实现委托授权。根据规范,隐式授权流不支持刷新令牌,这意味着一旦授权访问令牌一段特定时间,一旦令牌过期或被撤销,用户必须再次向应用授予权限 我想这对于规范中提到的在浏览器上运行的一些javascript代码来说是一个很好的场景。我正在尝试最小化用户必须授予应用程序权限才能获得令牌的时间,因此授权代码流似乎是一个不错的选择,因为它支持刷新令牌 但是,此流似乎严重依赖web浏览器来执行重定向。我想知道如果使用嵌入式web浏览器,这个流程是
但是,此流似乎严重依赖web浏览器来执行重定向。我想知道如果使用嵌入式web浏览器,这个流程是否仍然是移动应用程序的一个好选择。还是我应该跟随隐式流 不幸的是,我认为这个问题没有明确的答案。但是,以下是我确定的选项:
- 如果可以要求用户提供其凭据,则使用。然而,由于某些原因,这可能是不可能的,即
- 可用性或安全策略禁止直接在应用程序中插入密码
- 身份验证过程委托给外部身份提供程序,必须通过基于HTTP重定向的流(例如OpenID、SAMLP或WS-Federation)执行
- 如果需要使用基于浏览器的流,则使用。在这里,重定向uri的定义是一个重大挑战,有以下几种选择:
- 使用中所述的技术,其中一个特殊的
(例如重定向uri
)向授权端点发送信号,以显示授权代码,而不是重定向回客户端应用程序。用户可以手动复制此代码,或者应用程序可以尝试从HTML文档标题获取此代码urn:ietf:wg:oauth:2.0:oob
- 在设备上使用
服务器(端口管理可能不容易)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服务的应用程序应该使用隐式 赠款流动