Обмен токенов доступа LinkedIn с токеном keycloakJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Обмен токенов доступа LinkedIn с токеном keycloak

Сообщение Anonymous »

Я пытаюсь интегрировать регистрацию/вход из linkedIn в свое приложение, которое в настоящее время использует keycloak для аутентификации. Я реализовал свой поток следующим образом:
  • Мой интерфейс перенаправляется на 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();
}
Я получаю этот ответ от keycloak при попытке обменять токен.
Статус: 400 неверный запрос

Код: Выделить всё

{
"error": "invalid_token",
"error_description": "invalid token"
}
Я добавил необходимую конфигурацию в keycloak:
Изображение
Я также включил разрешение на обмен токенов и установил политику согласно этому документу: Предоставление разрешения на обмен
Изображение

Что мне не хватает или что вызывает ошибку?

Подробнее здесь: https://stackoverflow.com/questions/793 ... loak-token
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»