无法使用oidc-client-js和Apereo CAS验证访问令牌

问题描述 投票:0回答:1

我正在尝试使用OIDC在我的反应应用程序中使用Apereo CAS 5.1.1登录。寻找库来实现这一点,我登陆oidc-client-js 1.7.0,但我遇到以下错误:

ResponseValidator._validateAccessToken:无法验证at_hash dWr5-bD5lv8C1x3VcfFn1Q dWr5 + bD5lv8C1x3VcfFn1Q ==

跟踪之后,我发现抛出异常的位置

var a = s.substr(0, s.length / 2), u = this._joseUtil.hexToBase64Url(a);

return u !== e.profile.at_hash ? 
(i.Log.error("ResponseValidator._validateAccessToken: Failed to validate at_hash", u, e.profile.at_hash), Promise.reject(new Error("Failed to validate at_hash"))) : 
(i.Log.debug("ResponseValidator._validateAccessToken: success"), Promise.resolve(e));

问题是this._joseUtil.hexToBase64Url(a)不添加填充(=),在这种特殊情况下,+标志。那是因为URL中不接受这些字符。因此,总是(或几乎总是)比较将是错误的。例如,在此执行中:

dWr5-bD5lv8C1x3VcfFn1Q != dWr5+bD5lv8C1x3VcfFn1Q==

另一方面,我认为我的应用程序中缺少或配置错误,因为否则每个使用此库的人都会遇到同样的问题。

所以,我的问题是:如何在这种情况下成功验证访问令牌?

谢谢。

javascript reactjs cas oidc oidc-client-js
1个回答
0
投票

我发现问题通过两个代码交互执行验证的代码。

事实证明,我使用的CAS版本(5.1.1)在创建访问令牌哈希值at_hash时出错。

org.apereo.cas.oidc.token.OidcIdTokenGeneratorService有以下方法:generateAccessTokenHash。实际生成哈希的最后一行代码是:

final byte[] digested = DigestUtils.rawDigest(hashAlg, tokenBytes);
final byte[] hashBytesLeftHalf = Arrays.copyOf(digested, digested.length / 2);
return EncodingUtils.encodeBase64(hashBytesLeftHalf);

问题是,根据at_hash,当this应该在base64url中编码时,它编码为base64:

访问令牌哈希值。它的值是access_token值的ASCII表示的八位字节的最左半部分的base64url编码,其中使用的散列算法是ID令牌的JOSE标题的alg Header参数中使用的散列算法。例如,如果alg是RS256,则使用SHA-256对access_token值进行散列,然后取最左边的128位并对其进行base64url编码。 at_hash值是区分大小写的字符串。

在以下版本的CAS中解决了这个问题,至少我可以确认5.2.x通过更改(除其他外)最后一行来解决它:

return EncodingUtils.encodeUrlSafeBase64(hashBytesLeftHalf);

我希望这对任何面临同样问题的人都有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.