如何使用 OkHttpClient 自定义 Microsoft Graph 客户端

How to customize Microsoft Graph client using OkHttpClient

我正在使用客户端凭据方法通过 Microsoft Graph api 获取数据。 如documentation所述,我们可以自定义。

但是我无法理解如何创建 coreAuthenticationProvider。

解释自定义化的任何代码片段都会有所帮助。

下面是我试过的代码片段:

    final ClientCredentialProvider authProvider = new ClientCredentialProvider(this.clientId, this.scopes,
            this.clientSecret, this.tenantId, NationalCloud.Global);

    final OkHttpClient httpClient = HttpClients.createDefault(authProvider).newBuilder()
            .retryOnConnectionFailure(false).build();

    final IHttpProvider httpProvider = DefaultClientConfig.createWithAuthenticationProvider(authProvider)
            .getHttpProvider(httpClient);

    final IGraphServiceClient graphClient = GraphServiceClient.builder().authenticationProvider(authProvider)
            .httpProvider(httpProvider).buildClient();

但是我最终遇到以下错误:

2021-03-12T22:10:39,340 ERROR [restartedMain] c.m.g.l.DefaultLogger: CoreHttpProvider[send] - 220Graph service exception Error code: InvalidAuthenticationToken
2021-03-12T22:10:39,340 ERROR [restartedMain] c.m.g.l.DefaultLogger: CoreHttpProvider[send] - 220Error message: CompactToken parsing failed with error code: 80049217
2021-03-12T22:10:39,340 ERROR [restartedMain] c.m.g.l.DefaultLogger: CoreHttpProvider[send] - 220
2021-03-12T22:10:39,341 ERROR [restartedMain] c.m.g.l.DefaultLogger: CoreHttpProvider[send] - 220GET https://graph.microsoft.com/v1.0/users?%24select=Id%2CDisplayName%2CMail%2CUserPrincipalName%2CEmployeeId&%24expand=registeredDevices
2021-03-12T22:10:39,341 ERROR [restartedMain] c.m.g.l.DefaultLogger: CoreHttpProvider[send] - 220SdkVersion : graph-java/v2.6.0
2021-03-12T22:10:39,341 ERROR [restartedMain] c.m.g.l.DefaultLogger: CoreHttpProvider[send] - 220Authorization : [PII_REDACTED]
2021-03-12T22:10:39,341 ERROR [restartedMain] c.m.g.l.DefaultLogger: CoreHttpProvider[send] - 220
2021-03-12T22:10:39,342 ERROR [restartedMain] c.m.g.l.DefaultLogger: CoreHttpProvider[send] - 220
2021-03-12T22:10:39,342 ERROR [restartedMain] c.m.g.l.DefaultLogger: CoreHttpProvider[send] - 220401 : Unauthorized
2021-03-12T22:10:39,342 ERROR [restartedMain] c.m.g.l.DefaultLogger: CoreHttpProvider[send] - 220[...]
2021-03-12T22:10:39,342 ERROR [restartedMain] c.m.g.l.DefaultLogger: CoreHttpProvider[send] - 220
2021-03-12T22:10:39,343 ERROR [restartedMain] c.m.g.l.DefaultLogger: CoreHttpProvider[send] - 220[Some information was truncated for brevity, enable debug logging for more details]
2021-03-12T22:10:39,343 ERROR [restartedMain] c.m.g.l.DefaultLogger: Throwable detail: com.microsoft.graph.http.GraphServiceException: Error code: InvalidAuthenticationToken
Error message: CompactToken parsing failed with error code: 80049217

GET https://graph.microsoft.com/v1.0/users?%24select=Id%2CDisplayName%2CMail%2CUserPrincipalName%2CEmployeeId&%24expand=registeredDevices
SdkVersion : graph-java/v2.6.0
Authorization : [PII_REDACTED]


401 : Unauthorized
[...]

如果我删除客户端自定义代码,它会起作用。以下代码有效:

final ClientCredentialProvider authProvider = new ClientCredentialProvider(this.clientId, this.scopes,
        this.clientSecret, this.tenantId, NationalCloud.Global);

final IGraphServiceClient graphClient = GraphServiceClient.builder().authenticationProvider(authProvider)
        .buildClient();

return graphClient;

下面是失败场景的 OKHttp 日志记录拦截器(级别:Header)(我已截断访问令牌)

Mar 14, 2021 6:50:45 PM okhttp3.internal.platform.Platform log
INFO: --> GET https://graph.microsoft.com/v1.0/users
Mar 14, 2021 6:50:45 PM okhttp3.internal.platform.Platform log
INFO: SdkVersion: graph-java/v2.10.0
Mar 14, 2021 6:50:45 PM okhttp3.internal.platform.Platform log
INFO: Authorization: Bearer eyc19PUm5Cei1qUFBZdzZ0Y2REeWJjcW9zdlhPeTktVnVvdWhrZ0kiLCJhbGciOiJSUzI1NiIsIng1dCI6Im5PbzNaRHJPRFhFSzFqS1doWHNsSFJfS1hFZyIsImtpZC    Mar 14, 2021 6:50:45 PM okhttp3.internal.platform.Platform log
INFO: Accept: */*
Mar 14, 2021 6:50:45 PM okhttp3.internal.platform.Platform log
INFO: SdkVersion: graph-java-core/v1.0.9 (featureUsage=0), java/1.8.0_66
Mar 14, 2021 6:50:45 PM okhttp3.internal.platform.Platform log
INFO: client-request-id: afbfefac-a85e-4b1b-8133-cf4599b502f6
Mar 14, 2021 6:50:45 PM okhttp3.internal.platform.Platform log
INFO: Authorization: Bearer ec19PUm5Cei1qUFBZdzZ0Y2REeWJjcW9zdlhPeTktVnVvdWhrZ0kiLCJhbGciOiJSUzI1NiIsIng1dCI6Im5PbzNaRHJPRFhFSzFqS1doWHNsSFJfS1hFZyIsImtpZC    Mar 14, 2021 6:50:45 PM okhttp3.internal.platform.Platform log
INFO: --> END GET
Mar 14, 2021 6:50:47 PM okhttp3.internal.platform.Platform log
INFO: <-- 401 Unauthorized https://graph.microsoft.com/v1.0/users (2794ms)
Mar 14, 2021 6:50:47 PM okhttp3.internal.platform.Platform log
INFO: Date: Sun, 14 Mar 2021 13:20:47 GMT
Mar 14, 2021 6:50:47 PM okhttp3.internal.platform.Platform log
INFO: Content-Type: application/json
Mar 14, 2021 6:50:47 PM okhttp3.internal.platform.Platform log
INFO: Transfer-Encoding: chunked
Mar 14, 2021 6:50:47 PM okhttp3.internal.platform.Platform log
INFO: Vary: Accept-Encoding
Mar 14, 2021 6:50:47 PM okhttp3.internal.platform.Platform log
INFO: WWW-Authenticate: Bearer realm="", authorization_uri="https://login.microsoftonline.com/common/oauth2/authorize", client_id="00000003-0000-0000-c000-000000000000"
Mar 14, 2021 6:50:47 PM okhttp3.internal.platform.Platform log
INFO: Strict-Transport-Security: max-age=31536000
Mar 14, 2021 6:50:47 PM okhttp3.internal.platform.Platform log
INFO: request-id: bfdaf163-7429-416f-a139-208934180ef2
Mar 14, 2021 6:50:47 PM okhttp3.internal.platform.Platform log
INFO: client-request-id: afbfefac-a85e-4b1b-8133-cf4599b502f6
Mar 14, 2021 6:50:47 PM okhttp3.internal.platform.Platform log
INFO: x-ms-ags-diagnostic: {"ServerInfo":{"DataCenter":"Korea Central","Slice":"E","Ring":"2","ScaleUnit":"001","RoleInstance":"SE1PEPF00000918"}}
Mar 14, 2021 6:50:47 PM okhttp3.internal.platform.Platform log
INFO: Cache-Control: proxy-revalidate
Mar 14, 2021 6:50:47 PM okhttp3.internal.platform.Platform log
INFO: Connection: Keep-Alive
Mar 14, 2021 6:50:47 PM okhttp3.internal.platform.Platform log
INFO: Proxy-support: Session-based-authentication
Mar 14, 2021 6:50:47 PM okhttp3.internal.platform.Platform log
INFO: <-- END HTTP
Mar 14, 2021 6:50:48 PM com.microsoft.graph.logger.DefaultLogger logError
SEVERE: CoreHttpProvider[send] - 220Graph service exception Error code: InvalidAuthenticationToken
Mar 14, 2021 6:50:48 PM com.microsoft.graph.logger.DefaultLogger logError
SEVERE: CoreHttpProvider[send] - 220Error message: CompactToken parsing failed with error code: 80049217
Mar 14, 2021 6:50:48 PM com.microsoft.graph.logger.DefaultLogger logError
SEVERE: CoreHttpProvider[send] - 220
Mar 14, 2021 6:50:48 PM com.microsoft.graph.logger.DefaultLogger logError
SEVERE: CoreHttpProvider[send] - 220GET https://graph.microsoft.com/v1.0/users
Mar 14, 2021 6:50:48 PM com.microsoft.graph.logger.DefaultLogger logError
SEVERE: CoreHttpProvider[send] - 220SdkVersion : graph-java/v2.10.0
Mar 14, 2021 6:50:48 PM com.microsoft.graph.logger.DefaultLogger logError
SEVERE: CoreHttpProvider[send] - 220Authorization : [PII_REDACTED]
Mar 14, 2021 6:50:48 PM com.microsoft.graph.logger.DefaultLogger logError
SEVERE: CoreHttpProvider[send] - 220
Mar 14, 2021 6:50:48 PM com.microsoft.graph.logger.DefaultLogger logError
SEVERE: CoreHttpProvider[send] - 220
Mar 14, 2021 6:50:48 PM com.microsoft.graph.logger.DefaultLogger logError
SEVERE: CoreHttpProvider[send] - 220401 : Unauthorized
Mar 14, 2021 6:50:48 PM com.microsoft.graph.logger.DefaultLogger logError
SEVERE: CoreHttpProvider[send] - 220[...]
Mar 14, 2021 6:50:48 PM com.microsoft.graph.logger.DefaultLogger logError
SEVERE: CoreHttpProvider[send] - 220
Mar 14, 2021 6:50:48 PM com.microsoft.graph.logger.DefaultLogger logError
SEVERE: CoreHttpProvider[send] - 220[Some information was truncated for brevity, enable debug logging for more details]
Mar 14, 2021 6:50:48 PM com.microsoft.graph.logger.DefaultLogger logError
SEVERE: Throwable detail: com.microsoft.graph.http.GraphServiceException: Error code: InvalidAuthenticationToken
Error message: CompactToken parsing failed with error code: 80049217

GET https://graph.microsoft.com/v1.0/users
SdkVersion : graph-java/v2.10.0
Authorization : [PII_REDACTED]


401 : Unauthorized
[...]

(如果使用 Postman 手动测试相同的访问令牌有效)

**但我需要一种自定义 Microsoft Graph SDK 服务客户端的方法**

我终于可以设置 OkHttpClient 了,

final ClientCredentialProvider authProvider = new ClientCredentialProvider(this.clientId, this.scopes,
            this.clientSecret, this.tenantId, NationalCloud.Global);

final OkHttpClient httpClient = HttpClients.createDefault(new ICoreAuthenticationProvider() {
            @Override
            public Request authenticateRequest(final Request request) {
                return request;
            }
        }).newBuilder().retryOnConnectionFailure(false).build();



final IHttpProvider httpProvider = DefaultClientConfig.createWithAuthenticationProvider(authProvider)
            .getHttpProvider(httpClient);

final IGraphServiceClient graphClient = GraphServiceClient.builder().authenticationProvider(authProvider)
            .httpProvider(httpProvider).buildClient();