我的iOS应用程序包括几个使用OAuth2授权的API集成。我看到很多在线建议不要在设备上存储客户端id、机密或令牌。然而,我不清楚其中有多少适用于OAuth2。例如,clientId是Authorization请求的查询参数。因此,任何用户都可以通过代理(例如Charles(轻松地截获此值,所以我看不出隐藏此值有什么好处。我的理解是,ios应用程序最重要的漏洞是另一个应用程序试图使用您的应用程序的自定义方案捕获重定向。但是,如果我们使用代码交换验证密钥(PKCE(,恶意应用程序只能拦截授权代码,并且如果没有代码验证程序,他们就无法将其交换为令牌。那么,使用OAuth2的iOS应用程序的最佳实践是什么?
OAuth for Native Apps推荐AppAuth模式,其中有几个关键特性:
-
该应用程序使用系统浏览器的一种形式(ASWebAuthenticationSession窗口(,因此该应用程序永远无法访问用户的凭据
-
正如您所指出的,使用了授权代码流(PKCE(。您可以通过使用https://callback URL而不是自定义方案来进一步加强这一点,尽管这有点困难。
与比较的东西
以下是我的几个链接,以及你可以运行的更多细节和示例,这可能会给你自己的解决方案带来一些想法:
- 运行AppAuth代码示例
- 详细的AppAuth-博客文章
- 详细的AppAuth-代码示例