Google登录后在App内获取用户生日的实现疑问
不需要OAuth服务器ID,客户端直接就能拿到访问令牌获取生日
你完全不用折腾OAuth服务器ID,Google Sign-In客户端本身就支持在App内直接获取访问令牌,进而调用People API拿到用户生日。下面是具体的实现步骤:
1. 调整Google Sign-In配置,显式请求访问令牌
默认情况下,GoogleSignInAccount不会返回访问令牌,你需要在配置里显式添加请求。在创建GoogleSignInOptions的时候,除了已经添加的生日读取scope,还要加上requestAccessToken()方法:
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .requestScopes(Scope("https://www.googleapis.com/auth/user.birthday.read")) .requestAccessToken() // 这一步是关键,告诉Google我们需要访问令牌 .build()
2. 登录成功后提取访问令牌
当用户登录成功,你拿到GoogleSignInAccount实例后,直接调用account.accessToken就能获取到所需的访问令牌:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == RC_SIGN_IN) { val task = GoogleSignIn.getSignedInAccountFromIntent(data) try { val account = task.getResult(ApiException::class.java) val accessToken = account.accessToken // 这里就是我们要的访问令牌 // 接下来调用People API获取生日 fetchUserBirthday(accessToken) } catch (e: ApiException) { // 处理登录失败的情况 } } }
3. 调用People API获取生日
拿到访问令牌后,你可以直接向People API发起HTTP GET请求,请求头里带上令牌。注意要指定personFields=birthdays参数,不然API不会返回生日数据:
private fun fetchUserBirthday(accessToken: String) { val url = "https://people.googleapis.com/v1/people/me?personFields=birthdays" val request = Request.Builder() .url(url) .addHeader("Authorization", "Bearer $accessToken") .build() OkHttpClient().newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { // 处理请求失败 } override fun onResponse(call: Call, response: Response) { response.body?.string()?.let { responseBody -> // 解析返回的JSON数据,提取生日信息 // 示例JSON结构里会有birthdays数组,包含用户的生日数据 } } }) }
你也可以使用Google官方的People Client Library来简化API调用,避免手动处理HTTP请求。
关于你提到的People API是否被Google Play Services覆盖的问题
Google Play Services主要提供登录、身份验证等基础服务,People API属于独立的Google Cloud API,Play Services并没有封装这个接口的直接调用,所以你需要通过HTTP请求或者官方客户端库来访问它。
注意事项
- 用户必须在登录时同意你的应用读取生日的权限,如果用户拒绝,你将无法获取到生日数据,记得处理这种权限被拒绝的场景。
- 访问令牌有有效期限制,如果令牌过期,你可能需要通过
GoogleSignInAccount的refreshToken来刷新令牌(不过通常Google Sign-In会自动处理令牌刷新)。
内容的提问来源于stack exchange,提问作者Damn Vegetables
相关产品推荐
相关产品推荐

