in service/common/src/main/java/org/apache/polaris/service/auth/DefaultOAuth2ApiService.java [59:131]
public Response getToken(
String authHeader,
String grantType,
String scope,
String clientId,
String clientSecret,
TokenType requestedTokenType,
String subjectToken,
TokenType subjectTokenType,
String actorToken,
TokenType actorTokenType,
RealmContext realmContext,
SecurityContext securityContext) {
if (!tokenBroker.supportsGrantType(grantType)) {
return OAuthUtils.getResponseFromError(OAuthTokenErrorResponse.Error.unsupported_grant_type);
}
if (!tokenBroker.supportsRequestedTokenType(requestedTokenType)) {
return OAuthUtils.getResponseFromError(OAuthTokenErrorResponse.Error.invalid_request);
}
if (authHeader == null && clientSecret == null) {
return OAuthUtils.getResponseFromError(OAuthTokenErrorResponse.Error.invalid_client);
}
// token exchange with client id and client secret in the authorization header means the client
// has previously attempted to refresh an access token, but refreshing was not supported by the
// token broker. Accept the client id and secret and treat it as a new token request
if (authHeader != null && clientSecret == null && authHeader.startsWith("Basic ")) {
String credentials = new String(Base64.decodeBase64(authHeader.substring(6)), UTF_8);
if (!credentials.contains(":")) {
return OAuthUtils.getResponseFromError(OAuthTokenErrorResponse.Error.invalid_request);
}
LOGGER.debug("Found credentials in auth header - treating as client_credentials");
String[] parts = credentials.split(":", 2);
if (parts.length == 2) {
clientId = parts[0];
clientSecret = parts[1];
} else {
LOGGER.debug("Don't know how to parse Basic auth header");
return OAuthUtils.getResponseFromError(OAuthTokenErrorResponse.Error.invalid_request);
}
}
TokenResponse tokenResponse;
if (clientSecret != null) {
tokenResponse =
tokenBroker.generateFromClientSecrets(
clientId,
clientSecret,
grantType,
scope,
callContext.getPolarisCallContext(),
requestedTokenType);
} else if (subjectToken != null) {
tokenResponse =
tokenBroker.generateFromToken(
subjectTokenType, subjectToken, grantType, scope, requestedTokenType);
} else {
return OAuthUtils.getResponseFromError(OAuthTokenErrorResponse.Error.invalid_request);
}
if (tokenResponse == null) {
return OAuthUtils.getResponseFromError(OAuthTokenErrorResponse.Error.unsupported_grant_type);
}
if (!tokenResponse.isValid()) {
return OAuthUtils.getResponseFromError(tokenResponse.getError());
}
return Response.ok(
OAuthTokenResponse.builder()
.withToken(tokenResponse.getAccessToken())
.withTokenType(BEARER)
.withIssuedTokenType(tokenResponse.getTokenType())
.setExpirationInSeconds(tokenResponse.getExpiresIn())
.build())
.build();
}