我需要将第三方网络服务集成到移动应用程序中。 Web 服务支持 OAuth 2.0。
网站上的其他答案建议使用带有 PKCE 的授权代码流或隐式流。在我的情况下,这两种方法都不起作用,因为 1) 隐式流不支持刷新令牌,2) 第 3 方 Web 服务不支持 PKCE。
我当前的方法是让应用程序在浏览器中打开我的服务器上的无参数 URL(例如 https://server.me/3rdparty/authorize),这会针对第 3 方服务调用标准授权代码流。当重定向从 3rd 方服务到达我的服务器时,我在后台调用 3rd 方服务的令牌端点,并通过将浏览器重定向到应用程序链接(例如 myapp://oauth/响应?access_token=ABCDE&refresh_token=12345)。
对于此实现,我想到的唯一安全问题是该应用程序可能会被另一个注册 myapp:// 前缀的应用程序冒充。此问题的两种可能的解决方案:
您发现这种方法有任何安全问题吗?
PKCE 是授权代码流程的可选扩展。 这不是强制性的。 它可以防止中间人攻击,但这可能是低风险,具体取决于您的用例。
ASWebAuthenticationSession
在应用程序中打开安全浏览器以完成身份验证流程。 您向会话提供 https 回调 url,iOS 会确保只有您的应用收到响应,即使其他应用已注册相同的回调 url。它不使用不安全的应用程序 URL 方案。
如果第 3 方服务提供用于用户身份验证的 Web 界面,那么您可以直接在您的应用程序中打开该界面并在您的应用程序中接收代码响应,但是您的应用程序将需要保留所需的秘密以将代码交换为代币。
您概述的方法(使用您自己的服务器)是一种更安全的方法:
https://server.me/3rdparty/authorize
中打开您的服务器网址(ASWebAuthenticationSession
),提供一些回调网址,例如https://server.me/mobile/authComplete
https://server.me/3rdparty/callback
)和一些随机状态。https://server.me/3rdparty/callback
收到响应时,您可以验证状态并使用其持有的秘密将授权代码交换为令牌。https://server.me/mobile/authComplete
的重定向。ASWebAuthenticationSession
的网址相匹配,因此网络会话将关闭,并且该网址将提供给您的 completionHandler
,您可以在其中提取令牌这种方法的优点是您的移动应用程序不需要知道攻击者可以访问的任何秘密。