认证

注意

本页面假定您已拥有一个身份提供商(IdP),例如 Google、Entra ID(原 Azure AD)或 Okta,该提供商负责处理身份验证流程并返回访问令牌。

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

在 OAuth 2.0 中,“授权类型”(grant type)指的是应用程序获取访问令牌(access token)的方式。尽管 OAuth 2.0 定义了多种授权类型,但本页仅介绍如何通过“授权码”(Authorization Code)授权类型,为您的扩展程序中的用户进行授权。

授权码授权流程

授权码许可类型供机密客户端和公共客户端使用,用于将授权码兑换为访问令牌。

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

Flow for OAuth 2.0

上图显示了以下内容:

  • Docker 扩展会要求用户授权访问其数据。
  • 如果用户授予访问权限,则扩展程序将向服务提供商请求访问令牌,同时传递用户授予的访问授权和用于标识客户端的认证信息。
  • 服务提供商随后验证这些详细信息并返回访问令牌。
  • 该扩展使用访问令牌向服务提供商请求用户数据。

OAuth 2.0 术语

  • 授权 URL:用于 API 提供方授权服务器的端点,用于获取授权码。
  • 重定向URI:客户端应用程序的回调URL,用于在认证完成后重定向。该URL必须已在API提供商处注册。

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

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

从扩展的用户界面中,您可以提供一个按钮,用户点击该按钮后,将在浏览器中打开一个新窗口以进行用户身份验证。

使用 ddClient.host.openExternal API 以在浏览器中打开身份验证 URL。例如:

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

获取授权码和访问令牌

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

重要

使用此功能需要 Docker Desktop 中安装扩展 SDK 0.3.3。您需要确保您的扩展所要求的 SDK 版本在 镜像标签中设置为大于 0.3.3。

授权

此步骤为用户在浏览器中输入凭据的阶段。授权完成后,用户将被重定向回您的扩展程序用户界面,此时扩展程序的UI代码可以获取URL查询参数中包含的授权码。

交换授权码

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

该扩展必须向 0Auth 授权服务器发送一个 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 扩展 SDK 未提供专门用于存储密钥的机制。

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

注意

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

接下来是什么

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