Мой фронт -перенаправление в LinkedIn для входа. < /Li>
LinkedIn тогда перенаправление в мой обратный вызов в бэкэнд с кодом авторизации. < /li>
Затем мое бэкэнд -приложение обменивается кодом для токена доступа и получает пользователь из LinkedIn и делает необходимый процесс. < /li>
< li> Мой бэкэнд вручную создает пользователя в KeyCloak с федеративными идентификаторами, установленными в LinkedIn. /> < /ol>
Вот пример кода: < /p>
Код: Выделить всё
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);
}
< /code>
....
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
Мобильная версия