OneLogin: Программное получение токена JWT

Мы успешно интегрировали статическое внешнее приложение для подключения к внутреннему API на основе Spring с использованием токенов JWT с https://github.com/IdentityModel/oidc-client-js.

var userManager = new Oidc.UserManager({
    authority: 'https://openid-connect-eu.onelogin.com/oidc',
    client_id: config.oidc_client_id,
    redirect_uri: config.oidc_redirect_uri,
    response_type: 'id_token token',
    scope: 'openid profile email',

    filterProtocolClaims: true,
    loadUserInfo: true
});

var user = {};

async function _login() {
    user = await userManager.getUser();
    if (!user || user.expired) {
        var hash = parseUrl(window.location.hash),
            id_token = hash.id_token;

        if (id_token) {
            user = await userManager.signinRedirectCallback();
            initAfterLogin(user);
        } else {
            userManager.signinRedirect();
        }
    }
    else {
        initAfterLogin();
    }
}
function initAfterLogin() {
    console.info('JWT Token: ', user.id_token)
}

Мы можем использовать токен JWT в качестве вызова аутентификации Bearer для нашего бэкэнда, и проверка пройдет успешно.

Теперь мы пытаемся найти способ автоматически тестировать наши серверные вызовы, поэтому нам нужно получить токен JWT из среды выполнения NodeJS (скрипт предварительного запроса POSTman).

const getJwtTokenRequest = {
    url: 'https://openid-connect-eu.onelogin.com/oidc/token',
    method: 'POST',
    header: [{
            key: 'Content-Type',
            value: 'application/x-www-form-urlencoded'
        },{
            key: 'Authorization',
            value: 'Basic '+Buffer.from(client_id+':'+client_secret).toString('base64')
        }
    ],
    body: {
        mode: 'urlencoded',
        urlencoded: [{
                key: 'username',
                value: test_user
            }, {
                key: 'password',
                value: test_password
            }, {
                key: 'client_id',
                value: client_id
            }, {
                key: 'grant_type',
                value: 'password'
            }, {
                key: 'scope',
                value: 'openid profile email'
            }, {
                key: 'response_type',
                value: 'id_token token'
            }
        ]
    }
};

var getToken = true;

if (!pm.environment.get('OIDC_JWT_Token') ||
    !pm.environment.get('OIDC_JWT_Expiry')) {
    console.info('Token or expiry date are missing')
} else if (pm.environment.get('OIDC_JWT_Expiry') <= (new Date()).getTime()) {
    console.info('Token is expired')
} else {
    getToken = false;
    console.info('Token and expiry date are all good');
}

if (getToken === true) {
    pm.sendRequest(getJwtTokenRequest, function (err, res) {
        console.info(err ? err : res.json());
        if (err === null) {
            console.info('Saving the token and expiry date')
            var responseJson = res.json();
            pm.environment.set('OIDC_JWT_Token', responseJson.id_token)

            var expiryDate = new Date();
            expiryDate.setSeconds(expiryDate.getSeconds() + responseJson.expires_in);
            pm.environment.set('OIDC_JWT_Expiry', expiryDate.getTime());
        }
    });
}

Однако конечная точка API /token возвращает только access_token, а не id_token (токен JWT).

{
    "access_token": "MzEzNzJlMmYtZmFhMS00MXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-fn7fOiqgao-EiPp-PKrtMHqnBafdtbKU-DpodVl9YQqTwxDNTgE0k6w",
    "expires_in": 3600,
    "token_type": "Bearer"
}

Если я ищу через API OneLogin, кажется, что мы можем получить id_token только из явного потока авторизации через интерфейс.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
806
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обычно имеет место возможность получить id_token из явного потока авторизации, поскольку id_token представляет собой событие аутентификации пользователя, и поэтому пользователь должен присутствовать.

Может быть способ использовать тип предоставления учетных данных владельца ресурса, чтобы сделать то же самое в сценарии без браузера, но это зависит от функций, которые предоставляет OneLogin.

Если они это сделают, вам придется запросить токен, используя grant_type=password, и предоставить scope=openid.

Возможно ты прав. Я пытался сделать это для сквозного автоматизированного тестирования без необходимости предоставления альтернативных механизмов безопасности. Если мой бэкэнд принимает только аутентификацию токена JWT Bearer, это кажется невозможным.

GeertPt 25.03.2019 16:29

Другие вопросы по теме