首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google令牌验证异常

Google令牌验证异常
EN

Stack Overflow用户
提问于 2015-06-11 12:10:33
回答 6查看 5.5K关注 0票数 21

我上个小时面临OAuth2 JWT令牌验证异常(因此没有人可以访问我的应用程序):

java.security.SignatureException:签名长度不正确:获得256个,但预期为128个。我正在使用google-http-client 1.20.0Java 1.7.0。到目前为止,相同的配置是可行的-有什么想法吗?

代码语言:javascript
复制
Stacktrace

java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
    at sun.security.rsa.RSASignature.engineVerify(Unknown Source) ~[na:1.7.0_45]
    at java.security.Signature$Delegate.engineVerify(Unknown Source) ~[na:1.7.0_45]
    at java.security.Signature.verify(Unknown Source) ~[na:1.7.0_45]
    at com.google.api.client.util.SecurityUtils.verify(SecurityUtils.java:164) ~[google-http-client-1.20.0.jar:1.20.0]
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-06-11 13:04:50

同样的问题,我将GoogleIdTokenVerifier的源代码添加到我的项目中,并更改了方法:

代码语言:javascript
复制
 public boolean verify(GoogleIdToken googleIdToken) throws GeneralSecurityException, IOException {
    // check the payload
    if (!super.verify(googleIdToken)) {
      return false;
    }
    // verify signature
    for (PublicKey publicKey : publicKeys.getPublicKeys()) {
      try {
        if (googleIdToken.verifySignature(publicKey)) {
            return true;
          }
    } catch (Exception e) {
        System.err.println("Verify Token:" + e);
    }
    }
    return false;
  }

只要处理异常,第二个证书就能正常工作。

编辑:如果您想让它更干净,可以按照埃里克兹的建议进行子类:

编辑2:我不能用下面的代码使它工作,我将坚持上面的丑陋的黑客。

代码语言:javascript
复制
package com.my.project.package;

import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.PublicKey;

import com.google.api.client.auth.openidconnect.IdTokenVerifier;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;

// Remember to remove this class later by making it deprecated
@Deprecated
public class GoogleIdTokenVerifier2 extends GoogleIdTokenVerifier {

    // Add constructors as needed
    public GoogleIdTokenVerifier2(HttpTransport transport, JsonFactory jsonFactory) {
        super(transport, jsonFactory);
    }

    @Override
    public boolean verify(GoogleIdToken googleIdToken) throws GeneralSecurityException, IOException {
        // check the payload
        if (!((IdTokenVerifier)this).verify(googleIdToken)) {
            return false;
        }
        // verify signature
        for (PublicKey publicKey : getPublicKeysManager().getPublicKeys()) {
            try {
                if (googleIdToken.verifySignature(publicKey)) {
                    return true;
                }
            } catch (Exception e) {
                System.err.println("Verify Token:" + e);
            }
        }
        return false;
    }
}
票数 7
EN

Stack Overflow用户

发布于 2015-06-11 13:53:17

不要认为这是最终的解决方案,而是一项临时的工作,它肯定是改变验证者的受众到tokenId。

代码语言:javascript
复制
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory).setAudience(Arrays.asList(clientId)).build();

代码语言:javascript
复制
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
                    .setAudience(Arrays.asList(tokenResponse.getIdToken())).build();
票数 5
EN

Stack Overflow用户

发布于 2015-06-11 15:03:29

根本原因是在Google方面,JSON中的证书排列得很糟糕:

https://www.googleapis.com/oauth2/v1/certs

您可以调整它们的顺序,如下所示:

http://test.gacivs.info/frontend/certs.json

之后,可以使用GooglePublicKeysManager.setPublicCertsEncodedUrl(...)指定JSON的自定义URL (或使用or :)方法:

代码语言:javascript
复制
final GoogleIdToken idToken = GoogleIdToken.parse(JSON_FACTORY, token);
final GooglePublicKeysManager manager = new GooglePublicKeysManager.Builder(HTTP_TRANSPORT, JSON_FACTORY).setPublicCertsEncodedUrl(CUSTOM_CERTS_URL).build();
final GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(manager).setAudience(Arrays.asList(CLIENT_ID)).build();
verifier.verify(idToken);

...and它起作用了。

我希望谷歌能尽快解决这个问题..。:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30780407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档