Почему для получения токена Azure AD с помощью маркера обновления не используется алгоритм подписи? - PullRequest
0 голосов
/ 11 декабря 2018

Когда я получаю токен по коду авторизации (authContext.acquireTokenByAuthorizationCode), я получаю JWT (idToken), который подписан и имеет соответствующие заголовки:

{
  "typ": "JWT",
  "alg": "RS256",
  "x5t": "wLLmYfsqdQuWtV_-hnVtDJJZM3Q",
  "kid": "wLLmYfsqdQuWtV_-hnVtDJJZM3Q"
}

, но когда я использую токен обновления дляполучить новый токен (authContext.acquireTokenByRefreshToken(...)), он возвращает неподписанный JWT:

{
  "typ": "JWT",
  "alg": "none"
}

Как мне получить его, чтобы дать мне подписанный JWT?

return authContext.acquireTokenByRefreshToken( refreshToken, new ClientCredentials( clientId, clientSecret ), null );

1 Ответ

0 голосов
/ 12 декабря 2018

Я не воспроизвел вашу проблему на моей стороне.Я следовал этому учебнику , чтобы получить Authentication code и получить access token и refresh token с кодом ниже успешно.Пожалуйста, обратитесь к нему.

import com.microsoft.aad.adal4j.AuthenticationContext;
import com.microsoft.aad.adal4j.AuthenticationResult;
import com.microsoft.aad.adal4j.ClientCredential;

import java.net.URI;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class GetTokenByAuthenticationCode {

    private static final String APP_ID = "***";
    private static final String APP_SECRET = "***";
    private static final String REDIRECT_URI = "http://localhost:8080";
    private static final String tenant = "***";

    public static void main(String[] args) throws Exception {

        String authority = "https://login.microsoftonline.com/" + tenant + "/oauth2/authorize";
        ExecutorService service = Executors.newFixedThreadPool(1);

        String code = "***";

        AuthenticationContext context = new AuthenticationContext(authority, true, service);

        URI url = new URI(REDIRECT_URI);

        Future<AuthenticationResult> result = context.acquireTokenByAuthorizationCode(
                code,
                url,
                new ClientCredential(APP_ID, APP_SECRET),
                null
        );
        String token = result.get().getAccessToken();
        System.out.println(token);
        String refreshToken = result.get().getRefreshToken();
        System.out.println(refreshToken);


        Future<AuthenticationResult> result1 = context.acquireTokenByRefreshToken(
                refreshToken,
                new ClientCredential(APP_ID, APP_SECRET),
                null
        );

        String tokenNew = result1.get().getAccessToken();
        String refreshTokenNew = result1.get().getRefreshToken();
        System.out.println(tokenNew);
        System.out.println(refreshTokenNew);
    }
}

Декодирование:

enter image description here


Обновление Ответ:

Во-первых, Извините за ошибку.Я заменил getIdToken на getAccessToken, результат такой же, как и у вас. Затем я проверил параметры ответа в Авторизовав доступ к веб-приложениям Azure Active Directory, используя поток предоставления кода OAuth 2.0 , вы можете найтиоператор параметра id_token.

неподписанный веб-токен JSON (JWT), представляющий идентификатор токена.Приложение может base64Url декодировать сегменты этого токена, чтобы запрашивать информацию о пользователе, который вошел в систему. Приложение может кэшировать значения и отображать их, но оно не должно полагаться на них для какой-либо авторизации или границ безопасности.

Итак, токен id - это просто сегмент, на который нельзя положиться.Если вы хотите получить полный идентификатор токена, обратитесь к потоку openId .

...