说明:移动应用=本地应用
如其他评论和在线上的一些消息所述,隐式似乎很适合移动应用程序,但是最好的解决方案并不总是很明确(事实上,出于下面讨论的原因,不建议使用隐式)。
本机应用OAuth2最佳做法
无论选择哪种方法(都需要权衡考虑),都应注意此处概述的使用OAuth2的本机应用程序的最佳做法:https : //tools.ietf.org/html/rfc8252
考虑以下选项
隐含的
我应该使用隐式吗?
引用第8.2节https://tools.ietf.org/html/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 Views的示例,例如嵌入式用户代理,但应避免使用这种方法(特别是在应用不是第一方的情况下),在某些情况下,可能会导致您被禁止使用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视图不会与其他应用程序或系统浏览器共享身份验证状态,这要求用户针对每个授权请求登录,并导致不良的用户体验。
由于上述原因,建议不要使用嵌入式用户代理,除非受信任的第一方应用程序充当其他应用程序的外部用户代理,或者为多个第一方应用程序提供单点登录。
授权服务器应考虑采取步骤,在可能的情况下,通过不是自己的嵌入式用户代理来检测和阻止登录。
这里也提出了一些有趣的观点:https : //security.stackexchange.com/questions/179756/why-are-developers-using-embedded-user-agents-for-3rd-party-auth-what-are-the-一种