公共客户端与机密客户端之间的区别是什么?
本文揭示了 OAuth 中公共客户端与机密客户端之间的区别,以 Logto 应用为例。
使用 Logto 创建应用时,你会注意到有几种不同的应用类型可供选择,包括单页面应用程序(SPA)、本机应用程序和传统 Web 应用程序。从名称上来看,可以直观地知道本机应用程序是运行在常见设备操作系统上的应用程序,比如手机。那么,究竟什么是 SPA 和传统 Web 应用呢?为什么我们需要区分这些不同类型的应用程序?本文将揭示这些问题的答案。
在开始之前,我们需要简要介绍一些概念。
什么是 OAuth?
OAuth 是一种开放的访问授权标准,通常被用于互联网用户授权网站或应用程序访问他们在其他网站上的信息,而无需提供其密码。
在最近的十年间,它逐渐成为了标准的授权流程,并被谷歌、Meta、微软等大多数公司广泛接受。目前使用的版本是 OAuth 2.0。
在 OAuth 的背景下,我们之前提到的应用被称为客户端。只要它们获得了资源拥有者(通常为最终用户)的授权,它们就可以请求受保护的资源。
公共客户端和机密客户端
OAuth 根据客户端维护其凭证机密性的能力,定义了两种客户端类型。
机密客户端
能够维护其凭证机密性的客户端(例如,实施在安全服务器上、对客户端凭证有访问限制的客户端),或者可以通过其他方式进行安全客户端认证的客户端。
公共客户端
无法维护其凭证机密性的客户端(例如,运行在资源拥有者设备上的客户端,如本机应用程序或基于 Web 的应用程序),而且无法通过任何其他方式进行安全的客户端认证。
SPA、本机应用程序和传统 Web 应用程序
有了上述背景知识,让我们看看在 Logto 的上下文中,SPA、本机应用程序和传统 Web 应用程序意味着什么,以及它们是否被视为公共客户端或机密客户端。
SPA
SPA 的客户端代码从 Web 服务器下载,并在资源拥有者设备上的用户代理(如 Web 浏览器)中执行。协议数据和凭证对资源拥有者来说易于访问(而且通常是可见的)。
本机应用程序
本机应用程序安装并在资源拥有者的设备上运行。协议数据和凭证对资源拥有者是可访问的。通常假设包含于应用程序中的任何客户端认证凭证都是可以被提取的。
传统 Web 应用程序
传统 Web 应用程序是运行在 Web 服务器上的客户端。资源拥有者通过其设备上的用户代理呈现的 HTML 用户界面访问客户端。客户端凭证以及颁发给客户端的任何访问令牌都存储在 Web 服务器上,不会暴露或对资源拥有者可访问。
因此,我们可以明确地看到,SPA 和本机应用程序是公共客户端,而传统 Web 应用程序是机密客户端。
你可能会发现,在 Logto 中创建 SPA 或本机应用程序时,没有应用程序密钥,而传统 Web 应用程序既有应用程序 ID 又有应用程序密钥。这是因为公共客户端的密钥无法保证是安全的。