9. 原生应用 (Native Applications)
原生应用是安装并运行在资源所有者所使用设备上的客户端, 例如桌面应用或原生移动应用. 原生应用在安全性, 平台能力以及整体最终用户体验方面需要特别考虑.
授权端点需要客户端与资源所有者的用户代理 (User-Agent) 之间进行交互. 原生应用可以调用外部用户代理, 也可以在应用内嵌入用户代理. 例如:
-
外部用户代理: 原生应用可以通过以下方式捕获授权服务器返回的响应: 使用在操作系统中注册了方案以调用客户端作为处理程序的重定向 URI, 手动复制粘贴凭据, 运行本地 Web 服务器, 安装用户代理扩展, 或提供一个标识客户端控制下服务器托管资源的重定向 URI, 再由该资源将响应提供给原生应用.
-
嵌入式用户代理: 原生应用通过与嵌入式用户代理直接通信来获取响应, 例如监视资源加载期间发出的状态变化, 或访问用户代理的 Cookie 存储.
在外部用户代理和嵌入式用户代理之间进行选择时, 开发者应考虑以下因素:
-
外部用户代理可能提高完成率, 因为资源所有者可能已经与授权服务器存在活动会话, 从而无需重新认证. 它提供熟悉的最终用户体验和功能. 资源所有者还可以依赖用户代理功能或扩展辅助认证, 例如密码管理器或双因素设备读取器.
-
嵌入式用户代理可以提供更好的可用性, 因为它避免了切换上下文和打开新窗口.
-
嵌入式用户代理带来安全挑战, 因为资源所有者是在一个无法识别的窗口中进行认证, 且无法访问多数外部用户代理提供的视觉保护. 嵌入式用户代理会训练最终用户信任无法识别的认证请求, 从而使钓鱼攻击更容易实施.
在隐式授予类型和授权码授予类型之间进行选择时, 应考虑以下因素:
-
使用授权码授予类型的原生应用应该 (SHOULD) 不使用客户端凭据, 因为原生应用无法保持客户端凭据的机密性.
-
使用隐式授予类型流程时不会返回刷新令牌, 因此访问令牌过期后需要重复授权过程.