我们成功集成了静态前端应用程序,以使用带有https://github.com/IdentityModel/oidc-client-js的JWT令牌连接到基于Spring的后端API。
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.log('JWT Token: ', user.id_token)
}
我们可以将JWT令牌用作后端的Bearer身份验证调用,并且验证成功。
现在,我们正在尝试寻找一种自动测试后端调用的方法,因此我们需要从NodeJS运行时(POSTman预请求脚本)获取JWT令牌。
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.log('Token or expiry date are missing')
} else if (pm.environment.get('OIDC_JWT_Expiry') <= (new Date()).getTime()) {
console.log('Token is expired')
} else {
getToken = false;
console.log('Token and expiry date are all good');
}
if (getToken === true) {
pm.sendRequest(getJwtTokenRequest, function (err, res) {
console.log(err ? err : res.json());
if (err === null) {
console.log('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());
}
});
}
但是,/ token api端点仅返回一个access_token,而不返回id_token(JWT令牌)。
{
"access_token": "MzEzNzJlMmYtZmFhMS00MXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-fn7fOiqgao-EiPp-PKrtMHqnBafdtbKU-DpodVl9YQqTwxDNTgE0k6w",
"expires_in": 3600,
"token_type": "Bearer"
}
如果我搜索OneLogin API,则表明我们只能通过前端从显式授权流中获取id_token。
答案 0 :(得分:0)
由于id_token
代表用户身份验证事件,因此只能从显式授权流中获取id_token
,因此用户应该在场。
在非浏览器方案中,也许有一种方法可以使用“资源所有者密码凭据”授予类型执行相同的操作,但这取决于OneLogin提供的功能。
如果这样做,则必须使用grant_type=password
请求令牌并提供scope=openid
。