- Мой интерфейс перенаправляется на linkedIn для входа.
- Затем LinkedIn перенаправляет на мой обратный вызов в серверной части с кодом авторизации.
- Затем мое серверное приложение обменивает код на токен доступа, получает информацию о пользователе из linkedIn и выполняет необходимую обработку.
< li>Мой сервер вручную создает пользователя в keycloak с федеративными идентификаторами, установленными на linkedin. - Вызовите API обмена токенами keycloaks, чтобы обменять токен из LinkedIn на jwt из keycloak.
Код: Выделить всё
public JwtTokenResponse processOAuthCallbackAndGetToken(String code) {
// Step 1: Exchange authorization code for an access token
String accessToken = exchangeAuthorizationCodeForAccessToken(code);
// Step 2: Fetch user info from LinkedIn
Map userInfo = fetchLinkedInUserProfile(accessToken);
// Step 3: Create users in app
if (userInfo == null) {
throw new SomeException("Error occurred while fetching user info from LinkedIn.");
}
String email = (String) userInfo.get("email");
// create user in the application if needed
// Step 4: Create use in keycloak with federatedIdentity
log.info("User Info from LinkedIn ::: {}", userInfo);
Map federatedIdentity = new HashMap();
federatedIdentity.put("identityProvider", "linkedin");
federatedIdentity.put("userId", userInfo.get("sub")); // LinkedIn user ID
federatedIdentity.put("userName", email);
userService.createKeycloakUserWithFederatedIdentity(agentByEmail.getUser(), federatedIdentity);
log.info("Created user in keycloak with federated identity ::: {}", federatedIdentity);
// Step 5: Exchange LinkedIn access_token with jwt
return keycloakAuthServerConnector.getTokenFromLinkedInAccessToken(accessToken);
}
Код: Выделить всё
....
private static final String GRANT_TYPE_OAUTH_TOKEN_EXCHANGE =
"urn:ietf:params:oauth:grant-type:token-exchange";
private static final String REQUESTED_TOKEN_TYPE =
"urn:ietf:params:oauth:token-type:access_token";
public static final String PROTOCOL_OPENID_CONNECT_TOKEN = "/protocol/openid-connect/token";
public com.agencyheight.dto.onboardingv2.auth.JwtTokenResponse getTokenFromLinkedInAccessToken(
String accessToken) {
log.info("Requesting token with linkedIn access token :: {}", accessToken);
return webClient
.post()
.uri(PROTOCOL_OPENID_CONNECT_TOKEN)
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.body(
BodyInserters.fromFormData("client_id", clientId)
.with("client_secret", clientSecret)
.with("grant_type", GRANT_TYPE_OAUTH_TOKEN_EXCHANGE)
.with("subject_token", accessToken)
.with("subject_issuer", "linkedin")
.with("requested_token_type", REQUESTED_TOKEN_TYPE))
.retrieve()
.bodyToMono(com.agencyheight.dto.onboardingv2.auth.JwtTokenResponse.class)
.block();
}
Статус: 400 неверный запрос
Код: Выделить всё
{
"error": "invalid_token",
"error_description": "invalid token"
}

Я также включил разрешение на обмен токенов и установил политику согласно этому документу: Предоставление разрешения на обмен

Что мне не хватает или что вызывает ошибку?
Подробнее здесь: https://stackoverflow.com/questions/793 ... loak-token
Мобильная версия