如何通过Google Sign-In库获取authorization code?
当然可以!Google Sign-In库完全支持获取auth code,不需要依赖WebView
你之前的代码是直接获取客户端侧的access token,但只要调整一下Google Sign-In的配置,就能轻松拿到可以传给服务端的auth code,具体步骤如下:
1. 调整GoogleSignInOptions配置
首先,你需要在初始化GoogleSignInOptions的时候,显式请求服务端auth code,并指定你的后端OAuth客户端ID(注意:这个ID是你在Google Cloud控制台中创建的「Web应用」类型的客户端ID,不是Android客户端ID):
// 替换成你的YouTube scope和后端客户端ID const val YOUTUBE_SCOPE = "https://www.googleapis.com/auth/youtube.readonly" const val YOUR_SERVER_CLIENT_ID = "你的后端Web客户端ID.apps.googleusercontent.com" val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestScopes(Scope(YOUTUBE_SCOPE)) .requestServerAuthCode(YOUR_SERVER_CLIENT_ID) .build() // 初始化GoogleSignInClient val googleSignInClient = GoogleSignIn.getClient(context, gso)
2. 登录成功后获取auth code
在登录回调中,你不需要再用GoogleAccountCredential去拿token,直接从SignInAccount中提取serverAuthCode即可:
val result = Auth.GoogleSignInApi.getSignInResultFromIntent(data) if (result.isSuccess) { val account = result.signInAccount val authCode = account?.serverAuthCode if (!authCode.isNullOrEmpty()) { // 这里把authCode传给你的服务端 // 比如用Retrofit或者OkHttp发送POST请求 sendAuthCodeToBackend(authCode) } else { // 处理auth code为空的异常情况 } }
关键注意事项
- 客户端ID匹配:确保你的Android客户端ID和后端Web客户端ID在同一个Google Cloud项目下,否则会无法获取auth code。
- 服务端换token逻辑:服务端拿到auth code后,需要向Google的token端点发送请求,参数包括:
code:你传过去的auth codeclient_id:后端Web客户端IDclient_secret:后端客户端的密钥grant_type:authorization_coderedirect_uri:可以设为postmessage(如果是纯后端调用)
- auth code的有效性:每个auth code只能使用一次,服务端兑换后会得到access token和refresh token,建议保存refresh token以便后续刷新access token。
你之前的代码用GoogleAccountCredential获取的是客户端本地的access token,这种token只能在设备侧使用,无法安全地传给服务端(因为客户端token容易泄露),而auth code是专门用来让服务端去兑换服务端可用的access token的,安全性更高。
内容的提问来源于stack exchange,提问作者cora32
相关产品推荐
相关产品推荐

