是否可以接收 MS Teams 机器人(消息扩展)为 tenantId 指定的访问令牌?

Is it possible to receive the access token specified for tenantId by MS Teams bot (message extension)?

在我的例子中,我需要在我的 MS Teams 机器人(消息扩展)中接收并保存为 tenantId 指定的访问令牌,以便进一步访问 Graph API。有很多关于将代表用户身份验证流程添加到机器人的信息 (https://docs.microsoft.com/en-us/microsoftteams/platform/bots/how-to/authentication/add-authentication?tabs=dotnet%2Cdotnet-sample)。在这种情况下,我们需要在 Azure 门户上注册额外的应用程序(身份提供者)并将其连接到机器人(OAuth 连接设置)... 但是,就我而言,我需要实施客户端凭据身份验证流程,并使用在 Azure 门户上注册的机器人应用程序的凭据(AppId 和机密)接收访问令牌。为了实现这个目标,我可以使用msal4j库,例如:

public static String getAppAccessToken(String[] scopes) {
        ConfidentialClientApplication cca;
        try {
            cca = ConfidentialClientApplication.builder(applicationId, ClientCredentialFactory.createFromSecret(applicationSecret))
                    .authority("https://login.microsoftonline.com/<<tenantId>>/")
                    .build();
        } catch (MalformedURLException e) {
            return null;
        }

        Set<String> scopeSet = Set.of(scopes);

        ClientCredentialParameters clientCredentialParam = ClientCredentialParameters.builder(
                scopeSet)
                .build();

        CompletableFuture<IAuthenticationResult> future = cca.acquireToken(clientCredentialParam);
        return future.join().accessToken();
    }

使用这种方法,我收到了一段时间后过期的令牌。 问题:

  1. 是否可以使用 MS Teams Bot 中的客户端凭据身份验证流程接收尚未过期的访问令牌(针对特定租户 ID)?
  2. 我应该使用 Bot Framework SDK 还是 msal4j 库来实现客户端凭据身份验证流程?
  3. 客户端凭据身份验证流程需要 Azure 门户上的其他身份提供者应用程序(除了 Bot 应用程序)吗?

问题 1:是否可以使用 MS Teams Bot 中的客户端凭据身份验证流程接收尚未过期的访问令牌(针对特定租户 ID)?

=> 由于安全机制,访问令牌很容易在一段时间后过期,因为 OAuth 2.0 客户端凭据授予流程提供访问令牌而不是模拟用户,这是出于安全原因必须具备的。要生成新的访问令牌,您需要刷新令牌,该令牌在您使用客户端凭据流时不可用,但在使用时可用 auth code grant.

问题 2:我应该使用 Bot Framework SDK 还是 msal4j 库来实现客户端凭据身份验证流程?

=>应该没有问题,如果为机器人应用程序提供了所需的权限,您可以使用机器人身份验证生成令牌。

问题 3:客户端凭据身份验证流程是否需要 Azure 门户上的其他身份提供者应用(除了 Bot 应用)?

=>如果您已有与机器人关联的应用程序 ID,则无需创建。我看到文档没有提到这一点,但您不需要在门户中创建新的应用程序。您可以在 Azure Active Directory 中使用您的应用程序(机器人),并提供所需的权限 => 生成令牌 => 将令牌发送到图形 API 并获得结果。