Java后端如何通过serverAuthCode获取Google access token
后端通过serverAuthCode兑换谷歌Access Token的Java实现方案
前置准备
- 提前在谷歌云控制台创建OAuth 2.0凭据,类型选择Web应用,获取对应的客户端ID(clientId)和客户端密钥(clientSecret),需确保和前端集成谷歌登录时关联的是同一个谷歌云项目
- 前端请求serverAuthCode时,需传入上述Web应用类型的客户端ID作为服务器客户端ID参数
第一步:引入谷歌官方API依赖
Maven配置(pom.xml):
<dependency> <groupId>com.google.oauth-client</groupId> <artifactId>google-oauth-client</artifactId> <version>1.34.1</version> </dependency> <dependency> <groupId>com.google.http-client</groupId> <artifactId>google-http-client-jackson2</artifactId> <version>1.43.3</version> </dependency>
Gradle配置:
implementation 'com.google.oauth-client:google-oauth-client:1.34.1' implementation 'com.google.http-client:google-http-client-jackson2:1.43.3'
第二步:核心兑换逻辑实现
import com.google.api.client.http.GenericUrl; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.client.auth.oauth2.TokenResponse; import com.google.api.client.auth.oauth2.AuthorizationCodeTokenRequest; import java.io.IOException; public class GoogleAuthService { // 替换为你自己的Web类型客户端ID private static final String CLIENT_ID = "你的Web应用客户端ID"; // 替换为你自己的Web类型客户端密钥 private static final String CLIENT_SECRET = "你的Web应用客户端密钥"; // 谷歌OAuth2.0 token兑换接口地址 private static final String TOKEN_SERVER_URL = "https://oauth2.googleapis.com/token"; // 移动端场景下redirect_uri固定为该值即可 private static final String REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob"; private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport(); private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); public TokenResponse exchangeAuthCodeForToken(String serverAuthCode) throws IOException { // 构造兑换请求 AuthorizationCodeTokenRequest request = new AuthorizationCodeTokenRequest( HTTP_TRANSPORT, JSON_FACTORY, new GenericUrl(TOKEN_SERVER_URL), serverAuthCode ); // 设置请求参数 request.setClientId(CLIENT_ID) .setClientSecret(CLIENT_SECRET) .setRedirectUri(REDIRECT_URI); // 执行请求获取token结果 TokenResponse tokenResponse = request.execute(); // 可直接获取所需字段 String accessToken = tokenResponse.getAccessToken(); Long expiresIn = tokenResponse.getExpiresInSeconds(); String refreshToken = tokenResponse.getRefreshToken(); // 仅前端请求时设置access_type=offline才会返回 String idToken = (String) tokenResponse.get("id_token"); return tokenResponse; } }
注意事项
serverAuthCode为一次性凭证,兑换成功后立即失效,不可重复使用- 如需获取
refresh_token,前端请求serverAuthCode时需额外添加access_type=offline参数 - 客户端ID、客户端密钥属于敏感信息,需存储在后端安全配置中,禁止泄露到前端侧
- 拿到
access_token后可根据业务需求调用谷歌对应开放接口,拿到id_token后可进一步校验签名合法性,避免伪造请求
内容的提问来源于stack exchange,提问作者souradeep majumdar
相关产品推荐
相关产品推荐

