OneLogin:以编程方式获取JWT令牌

时间:2019-02-13 12:47:58

标签: oauth-2.0 jwt openid onelogin scim

我们成功集成了静态前端应用程序,以使用带有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。

1 个答案:

答案 0 :(得分:0)

由于id_token代表用户身份验证事件,因此只能从显式授权流中获取id_token,因此用户应该在场。

在非浏览器方案中,也许有一种方法可以使用“资源所有者密码凭据”授予类型执行相同的操作,但这取决于OneLogin提供的功能。

如果这样做,则必须使用grant_type=password请求令牌并提供scope=openid