Мы успешно интегрировали статическое внешнее приложение для подключения к внутреннему 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 только из явного потока авторизации через интерфейс.





Обычно имеет место возможность получить id_token из явного потока авторизации, поскольку id_token представляет собой событие аутентификации пользователя, и поэтому пользователь должен присутствовать.
Может быть способ использовать тип предоставления учетных данных владельца ресурса, чтобы сделать то же самое в сценарии без браузера, но это зависит от функций, которые предоставляет OneLogin.
Если они это сделают, вам придется запросить токен, используя grant_type=password, и предоставить scope=openid.
Возможно ты прав. Я пытался сделать это для сквозного автоматизированного тестирования без необходимости предоставления альтернативных механизмов безопасности. Если мой бэкэнд принимает только аутентификацию токена JWT Bearer, это кажется невозможным.