澄清:移动应用 = 原生应用
正如其他 cmets 和一些在线资源中所述,隐式似乎很适合移动应用,但最佳解决方案并不总是明确的(实际上不推荐使用隐式,原因如下所述)。
原生应用 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/
建议将授权代码授予流程用于以下应用程序:
有一个网络服务。此流程需要服务器到服务器的通信
使用应用程序的客户端密码。
注意:切勿将您的客户端机密放入分布式代码中,例如应用程序
通过应用商店或客户端 JavaScript 下载。
没有网络服务的应用程序应该使用隐式
拨款流程。
结论
在对入围的方法进行适当的风险评估并更好地了解其影响后,最终决定应考虑您所需的用户体验以及您对风险的偏好。
在这里阅读精彩 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 视图的示例,即嵌入式用户代理,但应避免使用这种方法(尤其是当应用程序不是第一方时),并且在某些情况下可能会导致您被禁止使用 API正如下面来自here 的摘录所示
任何嵌入 OAuth 2.0 身份验证页面的尝试都将导致
您的应用程序被 Fitbit API 禁止。
出于安全考虑,OAuth 2.0 授权页面必须是
呈现在专用的浏览器视图中。 Fitbit 用户只能确认
他们正在使用真正的 Fitbit.com 网站进行身份验证,如果他们有
浏览器提供的工具,例如 URL bar 和 Transport
层安全 (TLS) 证书信息。
对于原生应用,这意味着授权页面必须打开
在默认浏览器中。本机应用程序可以使用自定义 URL 方案
作为重定向 URI 将用户从浏览器重定向回
申请许可。
iOS 应用程序可以使用 SFSafariViewController 类而不是
应用程序切换到 Safari。 WKWebView 或 UIWebView 类的使用是
禁止。
Android 应用程序可能会使用 Chrome 自定义选项卡而不是应用程序
切换到默认浏览器。禁止使用 WebView。
为了进一步澄清,这里引用了this section 以上提供的最佳实践链接的先前草案
嵌入式用户代理,通常通过网络视图实现,是一种
授权本机应用程序的替代方法。然而他们是
根据定义,第三方使用不安全。它们涉及用户
使用他们的完整登录凭据登录,只是为了让他们
缩小到功能较弱的 OAuth 凭据。
即使由受信任的第一方应用程序使用,嵌入式用户代理
通过获得更大的权力来违反最小特权原则
凭据比他们需要的多,可能会增加攻击面。
在典型的基于 Web 视图的嵌入式用户代理实现中,
主机应用程序可以: 将表单中输入的每个按键记录到
捕获用户名和密码;自动提交表单并绕过
用户同意;复制会话 cookie 并使用它们来执行
以用户身份进行身份验证的操作。
鼓励用户在嵌入式 Web 视图中输入凭据,而无需
浏览器具有的常用地址栏和其他身份功能
使用户无法知道他们是否正在登录
合法网站,即使他们是,它也会训练他们没关系
无需先验证网站即可输入凭据。
除了安全问题,网络视图不共享
与其他应用程序或系统浏览器的身份验证状态,需要
用户登录每个授权请求并导致
用户体验差。
由于上述原因,不建议使用嵌入式用户代理,
除非受信任的第一方应用程序充当外部用户 -
其他应用程序的代理,或为多个首次提供单点登录
派对应用。
授权服务器应该考虑采取措施来检测和阻止
通过不属于他们自己的嵌入式用户代理登录,其中
可能。
这里也提出了一些有趣的观点:https://security.stackexchange.com/questions/179756/why-are-developers-using-embedded-user-agents-for-3rd-party-auth-what-are-the-a