身份验证

注意

本页假设您已经拥有一个身份提供者 (IdP),例如 Google、Entra ID(原 Azure AD)或 Okta,它们负责处理身份验证过程并返回访问令牌。

了解如何让用户使用 OAuth 2.0 通过 Web 浏览器从您的扩展进行身份验证,并返回到您的扩展。

在 OAuth 2.0 中,“授权类型”(grant type) 一词指代应用程序获取访问令牌的方式。尽管 OAuth 2.0 定义了多种授权类型,但本页仅描述如何使用授权码 (Authorization Code) 授权类型从您的扩展对用户进行授权。

授权码授权流程

授权码 (Authorization Code) 授权类型用于保密和公共客户端,以将授权码交换为访问令牌。

用户通过重定向 URL 返回客户端后,应用程序从 URL 中获取授权码并使用它来请求访问令牌。

Flow for OAuth 2.0

上图显示了

  • Docker 扩展要求用户授权访问他们的数据。
  • 如果用户授予访问权限,则扩展会向服务提供者请求访问令牌,并传递用户的访问授权和身份验证详情以识别客户端。
  • 然后,服务提供者验证这些详情并返回访问令牌。
  • 扩展使用访问令牌向服务提供者请求用户数据。

OAuth 2.0 术语

  • 授权 URL:API 提供者授权服务器的端点,用于检索授权码。
  • 重定向 URI:客户端应用程序回调 URL,用于授权后重定向。必须在 API 提供者处注册此项。

用户输入用户名和密码后,即成功通过身份验证。

打开浏览器页面进行用户身份验证

在扩展 UI 中,您可以提供一个按钮,选择该按钮后,将在浏览器中打开一个新窗口进行用户身份验证。

使用 ddClient.host.openExternal API 在浏览器中打开授权 URL。例如

window.ddClient.openExternal("https://authorization-server.com/authorize?
  response_type=code
  &client_id=T70hJ3ls5VTYG8ylX3CZsfIu
  &redirect_uri=${REDIRECT_URI});

获取授权码和访问令牌

您可以通过将 docker-desktop://dashboard/extension-tab?extensionId=awesome/my-extension 列为您正在使用的 OAuth 应用程序中的 redirect_uri,并将授权码作为查询参数进行拼接,从而从扩展 UI 获取授权码。然后,扩展 UI 代码将能够读取相应的 code 查询参数。

重要

使用此功能需要 Docker Desktop 中的扩展 SDK 0.3.3。您需要确保通过 镜像标签 中的 com.docker.desktop.extension.api.version 为您的扩展设置的所需 SDK 版本高于 0.3.3。

授权

此步骤是用户在浏览器中输入凭据。授权完成后,用户会被重定向回您的扩展用户界面,然后扩展 UI 代码可以消耗 URL 查询参数中的授权码。

交换授权码

接下来,您将授权码交换为访问令牌。

扩展必须向 OAuth 授权服务器发送一个带有以下参数的 POST 请求

POST https://authorization-server.com/token
&client_id=T70hJ3ls5VTYG8ylX3CZsfIu
&client_secret=YABbyHQShPeO1T3NDQZP8q5m3Jpb_UPNmIzqhLDCScSnRyVG
&redirect_uri=${REDIRECT_URI}
&code=N949tDLuf9ai_DaOKyuFBXStCNMQzuQbtC1QbvLv-AXqPJ_f

注意

在本例中,客户端凭据包含在 POST 查询参数中。OAuth 授权服务器可能要求将凭据作为 HTTP 基本身份验证头发送,或可能支持不同的格式。有关详情,请参阅您的 OAuth 提供者文档。

存储访问令牌

Docker Extensions SDK 不提供存储秘密的特定机制。

强烈建议您使用外部存储源来存储访问令牌。

注意

用户界面本地存储在扩展之间是隔离的(一个扩展无法访问另一个扩展的本地存储),并且当用户卸载扩展时,每个扩展的本地存储都会被删除。

下一步

了解如何发布和分发您的扩展

页面选项