澄清:移动应用 = 原生应用
正如其他评论和一些在线资源中所述,隐式似乎很适合移动应用程序,但是最好的解决方案并不总是明确的(事实上,由于下面讨论的原因,不建议使用隐式)。
原生应用 OAuth2 最佳实践
无论您选择哪种方法(需要考虑一些权衡),您都应该注意此处概述的使用 OAuth2 的本机应用程序的最佳实践:https ://www.rfc-editor.org/rfc/rfc8252
考虑以下选项
隐式
我应该使用隐式吗?
引用第 8.2 节https://www.rfc-editor.org/rfc/rfc8252#section-8.2
OAuth 2.0 隐式授予授权流程(在 OAuth 2.0 [RFC6749] 的第 4.2 节中定义)通常适用于在浏览器中执行授权请求并通过基于 URI 的应用间通信接收授权响应的做法。
但是,由于隐式流不能被 PKCE [RFC7636](第 8.1 节要求)保护,因此不建议将隐式流与本机应用程序一起使用。
通过隐式流程授予的访问令牌在没有用户交互的情况下也无法刷新,这使得授权代码授予流程(可以发出刷新令牌)成为需要刷新访问令牌的本机应用程序授权的更实用选项。
授权码
如果您确实使用授权代码,那么一种方法是通过您自己的 Web 服务器组件进行代理,该组件使用客户端密钥丰富令牌请求,以避免将其存储在设备上的分布式应用程序中。
以下摘录自:https ://dev.fitbit.com/docs/oauth2/
对于具有 Web 服务的应用程序,建议使用授权代码授予流程。此流程需要使用应用程序的客户端密钥进行服务器到服务器的通信。
注意:切勿将您的客户端机密放在分布式代码中,例如通过应用商店下载的应用程序或客户端 JavaScript。
没有 Web 服务的应用程序应使用隐式授予流程。
结论
在对入围的方法进行适当的风险评估并更好地理解其影响后,最终决定应考虑您所需的用户体验以及您对风险的偏好。
一个很好的阅读在这里https://auth0.com/blog/oauth-2-best-practices-for-native-apps/
另一个是https://www.oauth.com/oauth2-servers/oauth-native-apps/其中指出
当前的行业最佳实践是使用授权流程而忽略客户端密码,并使用外部用户代理来完成流程。外部用户代理通常是设备的本机浏览器(具有与本机应用程序不同的安全域),因此应用程序无法访问 cookie 存储或检查或修改浏览器内的页面内容。
PKCE 考虑
您还应该考虑此处描述的 PKCE https://www.oauth.com/oauth2-servers/pkce/
具体来说,如果您还实现了授权服务器,那么https://www.oauth.com/oauth2-servers/oauth-native-apps/checklist-server-support-native-apps/声明您应该
- 允许客户端为其重定向 URL 注册自定义 URL 方案。
- 支持具有任意端口号的环回 IP 重定向 URL,以支持桌面应用程序。
- 不要假设原生应用程序可以保守秘密。要求所有应用声明它们是公开的还是机密的,并且只向机密应用发布客户端机密。
- 支持 PKCE 扩展,并要求公共客户端使用它。
- 尝试检测授权接口何时嵌入到本机应用程序的 Web 视图中,而不是在系统浏览器中启动,并拒绝这些请求。
Web 视图注意事项
在野外有很多使用 Web 视图的示例,即嵌入式用户代理,但应该避免这种方法(尤其是当应用程序不是第一方时),并且在某些情况下可能会导致您被禁止使用 API 作为摘录下面从这里演示
任何嵌入 OAuth 2.0 身份验证页面的尝试都将导致您的应用程序被 Fitbit API 禁止。
出于安全考虑,OAuth 2.0 授权页面必须显示在专用浏览器视图中。Fitbit 用户只有在拥有浏览器提供的工具(例如 URL 栏和传输层安全 (TLS) 证书信息)的情况下,才能确认他们正在使用真正的 Fitbit.com 网站进行身份验证。
对于本机应用程序,这意味着授权页面必须在默认浏览器中打开。本机应用程序可以使用自定义 URL 方案作为重定向 URI,将用户从浏览器重定向回请求权限的应用程序。
iOS 应用程序可以使用 SFSafariViewController 类而不是应用程序切换到 Safari。禁止使用 WKWebView 或 UIWebView 类。
Android 应用程序可能会使用 Chrome 自定义选项卡,而不是应用程序切换到默认浏览器。禁止使用 WebView。
为了进一步澄清,这里引用了上面提供的最佳实践链接的先前草案的这一部分
嵌入式用户代理,通常使用 web 视图实现,是授权原生应用程序的另一种方法。但是,根据定义,它们对于第三方使用是不安全的。它们涉及用户使用其完整登录凭据登录,只是将它们缩小为功能较弱的 OAuth 凭据。
即使在受信任的第一方应用程序使用时,嵌入式用户代理也违反了最小权限原则,因为它获得了比他们需要的更强大的凭据,这可能会增加攻击面。
在嵌入式用户代理的典型基于 Web 视图的实现中,主机应用程序可以: 记录在表单中输入的每一次击键以捕获用户名和密码;自动提交表格并绕过用户同意;复制会话 cookie 并使用它们以用户身份执行经过身份验证的操作。
鼓励用户在没有浏览器通常的地址栏和其他身份功能的情况下在嵌入式 Web 视图中输入凭据,这使得用户无法知道他们是否正在登录合法站点,即使登录了,它也会对他们进行培训无需先验证站点即可输入凭据。
除了安全问题之外,web-views 不会与其他应用程序或系统浏览器共享身份验证状态,需要用户为每个授权请求登录并导致糟糕的用户体验。
由于上述原因,不建议使用嵌入式用户代理,除非受信任的第一方应用充当其他应用的外部用户代理,或为多个第一方应用提供单点登录。
授权服务器应该考虑采取措施,在可能的情况下,通过不属于他们自己的嵌入式用户代理来检测和阻止登录。
这里还提出了一些有趣的观点:https ://security.stackexchange.com/questions/179756/why-are-developers-using-embedded-user-agents-for-3rd-party-auth-what-are-the-一个