Почему для получения токена Azure AD с помощью токена обновления нет алгоритма подписи?

Когда я получаю токен по коду авторизации (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 );


person Don Rhummy    schedule 11.12.2018    source источник
comment
Вы получаете idToken обратно после первого вызова, т.е. authContext.acquireTokenByAuthorizationCode, но второй вызов, то есть authContext.acquireTokenByRefreshToken, вернет вам токен доступа, токен обновления и информацию о сроке действия токена доступа согласно документации docs.microsoft.com/en-us/java/api / Не могли бы вы рассказать подробнее, на какую часть возвращенной информации вы обращаетесь? и для какого именно ресурса вы приобретаете этот токен и т. д.?   -  person Rohit Saigal    schedule 12.12.2018


Ответы (1)


Я не воспроизводил вашу проблему на своей стороне. Я следил за этим руководством чтобы получить 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);
    }
}

Расшифровать:

введите здесь описание изображения


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

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

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

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

person Jay Gong    schedule 12.12.2018
comment
вы получаете токен доступа. токен идентификатора беззнаковый - person Don Rhummy; 12.12.2018
comment
@DonRhummy Извините за ошибку. Не могли бы вы опубликовать образец кода для получения токена идентификатора? Чтобы я мог проверить на своей стороне. - person Jay Gong; 12.12.2018