Spring Boot集成Facebook OAuth2报错:获取AccessToken响应失败
嘿,我之前碰到过类似的情况,咱们一步步来搞定它!
首先先明确你的问题:Google OAuth2认证能正常跑,但Facebook认证在回调回站点后,触发了SSL握手错误,错误信息如下:
An error occurred while attempting to retrieve the OAuth 2.0 Access Token Response: I/O error on POST request for "https://graph.facebook.com/v3.0/oauth/access_token": Remote host closed connection during handshake; nested exception is javax.net.ssl.SSLHandshakeException: Remote host closed connection during
问题根源
问题出在你的服务器SSL协议配置上!Facebook早在几年前就停止支持TLSv1和TLSv1.1这两个不安全的旧版本协议了,只接受TLSv1.2及以上版本的连接。而你的配置里还把这两个旧版本加在enabled-protocols里,导致握手时直接被Facebook服务器拒绝。反观Google的OAuth端点目前还兼容这些旧协议,所以Google认证能正常工作。
解决方案
1. 清理SSL协议配置,只保留安全版本
修改application.yml里的server.ssl.enabled-protocols,删掉TLSv1和TLSv1.1,只保留TLSv1.2和TLSv1.3(TLSv1.3是更安全的新版本,推荐加上):
server: port: 443 ssl: key-store-type: PKCS12 key-store: classpath:keystore/sslkeystore.p12 key-store-password: passwordValue key-alias: tomcat enabled-protocols: - TLSv1.2 - TLSv1.3
2. 升级Facebook Graph API版本(可选但强烈推荐)
你现在用的是v3.0版本的Facebook API,这个版本已经非常老旧了,Facebook会逐步停止对旧版本的支持,后续可能会出现更多兼容性问题。建议升级到最新的稳定版本(比如当前的v18.0),更新spring.security.oauth2.client.provider.facebook下的三个端点:
spring: security: oauth2: client: provider: facebook: authorizationUri: https://www.facebook.com/v18.0/dialog/oauth tokenUri: https://graph.facebook.com/v18.0/oauth/access_token userInfoUri: https://graph.facebook.com/v18.0/me?fields=id,first_name,middle_name,last_name,name,email,verified,is_verified,picture.width(250).height(250)
3. 验证密钥库完整性
顺便检查一下你的PKCS12密钥库文件有没有损坏,密码和别名配置是否正确,确保证书是受信任的CA颁发的(测试环境如果用自签证书,要确保应用信任该证书)。
做完这些修改后,重启你的Spring Boot应用,再测试Facebook OAuth2认证,应该就能正常工作了!
内容的提问来源于stack exchange,提问作者Rasool Ghafari

