You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:00:02