【问题标题】:How to receive user photos in MS Teams Bot which installed in different organizations?如何在安装在不同组织的 MS Teams Bot 中接收用户照片?
【发布时间】:2021-01-28 01:38:42
【问题描述】:

根据文档https://docs.microsoft.com/en-us/graph/api/profilephoto-get?view=graph-rest-beta - 为了获取用户照片,我们需要执行 HTTP 请求 https://graph.microsoft.com/beta/users/{userId}/photo/$value 提供访问令牌和用户 ID。 使用客户端凭据流,我可以接收特定组织(租户 ID)的访问令牌,例如:

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();
    }

但是以这种方式接收的访问令牌只允许接收组织用户的照片,该组织的租户 ID 与 Azure Active Directory 应用程序注册中注册的机器人应用程序的租户 ID 相同。 是否可以使用客户端凭据流令牌从安装了我的机器人的其他组织接收用户的照片? 在这种情况下,我收到:

{
    "error": {
        "code": "UnknownError",
        "message": "{\"error\":{\"code\":\"NoPermissionsInAccessToken\",\"message\":\"The token contains no permissions, or permissions can not be understood.\",\"innerError\":{\"oAuthEventOperationId\":\"d90f2331-a22a-44d5-889e-c0c14ea9129e\",\"oAuthEventcV\":\"n+NecjM040KWn+2G+e5oFQ.1\",\"errorUrl\":\"https://aka.ms/autherrors#error-InvalidGrant\",\"requestId\":\"0b6bb579-94a7-47ac-8ff9-26ee893e5cb0\",\"date\":\"2021-01-28T00:57:52\"}}}",
        "innerError": {
            "date": "2021-01-28T00:57:52",
            "request-id": "0b6bb579-94a7-47ac-8ff9-26ee893e5cb0",
            "client-request-id": "0b6bb579-94a7-47ac-8ff9-26ee893e5cb0"
        }
    }
}

【问题讨论】:

标签: azure-active-directory botframework microsoft-teams microsoft-graph-teams


【解决方案1】:

我当然不是身份验证方面的专家,但如果有帮助,请参考以下两条建议:

  1. “https://login.microsoftonline.com//” -> 使用“组织”而不是租户 ID

  2. 检查您正在使用的范围(您没有列出您正在尝试的内容,所以可能是这样)

【讨论】:

    【解决方案2】:

    只需尝试使用“https://login.microsoftonline.com/common”端点,看看您是否可以正常工作。请详细阅读here

    您甚至可以向单个租户发送 REST 请求以获取访问令牌并相应地访问信息。请注意发送请求时有范围。

    【讨论】:

    • 您能否告诉我应该向各个租户 ID 发送哪个 REST 请求以获取访问令牌并相应地访问信息?
    • 您需要先使用client cred flow获取承载令牌,然后使用get Photo API
    • 使用客户端凭据流(上面在我的问题中描述)我收到 .authority("login.microsoftonline.com/<<tenantId>>/") 和 .authority("login.microsoftonline.com/common/") 的错误。使用客户端凭据流和 .authority("login.microsoftonline.com/<<tenantId>>/") 我只能接收用户照片,该用户在注册应用程序的同一租户(组织)中注册。可能在收到我需要执行的不记名令牌之前一些身份验证步骤,以便外部租户(客户端租户)可以信任我的应用租户?
    • 您需要使用不同的租户 ID 进行两次单独的调用,以“login.microsoftonline.com/>”获取访问令牌并相应地访问它们。
    • 您是否尝试过使用multi tenant 应用程序?如果问题仍然存在您需要使用不同的租户 ID 进行两次单独的调用,以“login.microsoftonline.com/>”获取相应的访问令牌并相应地向图形 API 发送请求。
    猜你喜欢
    • 2021-11-20
    • 2021-10-08
    • 2020-08-12
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    相关资源
    最近更新 更多