我正在使用 openid4java 库在 spring-mvc 应用程序中实现“使用 google 登录”功能。
它在我的本地 tomcat 服务器上工作正常,但在远程服务器上它突然停止工作。在那之前它也工作得很好。
在 catalina.out 中进行一些登录后,我发现在 google 重定向到返回网址后,响应验证失败
VerificationResult verification = openIdService.getConsumerManager().verify(
receivingURL.toString(),
response, discovered);
Identifier verified = verification.getVerifiedId(); //Null
在远程服务器上,verified 的值为空。在本地服务器上它是一个 uri
我知道在处理响应时,ConsumerManager 需要相同 用于发出身份验证请求的实例。
其余代码实现如下
有一个 OpenIdController,其中 OpenIdService 是 Autowired 的。
OpenIdServiceImpl 实现 OpenIdService 并具有返回 ConsumerManager 实例的 getConsumerManager 方法。
在 OpenIdServiceImpl 的构造中,创建了 ConsumerManager 的实例。
创建提交表单并处理响应的操作写在 打开IdController并使用getConsumerManager方法访问consumerManager实例。
编辑:
我尝试在表单提交之前记录 Discovery 信息,并在此处的回调中记录输出
Debugging OpenId: Discovered (before) OpenID2
OP-endpoint:https://www.google.com/accounts/o8/ud
ClaimedID:null
Delegate:null
Debugging OpenId: Discovered (after) OpenID2
OP-endpoint:https://www.google.com/accounts/o8/ud
ClaimedID:null
Delegate:nul
我在这里做错了什么吗?但它可以在本地服务器上运行!
或者与远程服务器上的 tomcat 配置有关?
感谢任何帮助。如果需要的话我可以发布代码。
谢谢。
最佳答案
我可以通过在创建 ConsumerManager 实例后添加以下行来解决此问题。
consumerManager.setAssociations(new InMemoryConsumerAssociationStore());
consumerManager.setNonceVerifier(new InMemoryNonceVerifier(5000));
consumerManager.setMinAssocSessEnc(AssociationSessionType.DH_SHA256);
我发现它在 SampleConsumer 示例的评论之一中提到了这一点 - http://code.google.com/p/openid4java/wiki/SampleConsumer
请参阅底部的响应 #3。
尚未尝试弄清楚它的作用,但希望这是解决问题的正确方法:)
关于java - 使用 openid4java 进行 'login with google' 时验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7645226/