Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >试图使用people API从googleAccount获取用户信息时出错?

试图使用people API从googleAccount获取用户信息时出错?
EN

Stack Overflow用户
提问于 2019-12-03 00:13:59
回答 1查看 365关注 0票数 0

我试图从google获取用户帐户信息,比如生日、性别和其他用户数据,但是我在使用people API时得到了这个异常

代码语言:javascript
运行
AI代码解释
复制
W/System.err: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "The request is missing a valid API key.",
    "reason" : "forbidden"
  } ],
  "message" : "The request is missing a valid API key.",
  "status" : "PERMISSION_DENIED"
}

我不知道在哪里添加api键来解决我的例外--这里是我的代码

代码语言:javascript
运行
AI代码解释
复制
package com.example.MyApp.ui.activities;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.example.myApp.R;
import com.example.myApp.utils.PreferenceController;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.tasks.Task;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeTokenRequest;
import com.google.api.client.googleapis.auth.oauth2.GoogleBrowserClientRequestUrl;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.people.v1.PeopleService;
import com.google.api.services.people.v1.model.Person;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class LoginActivity extends AppCompatActivity {
    private final String TAG = "LoginActivity";
    private SignInButton loginWithGoogleAccountBtn;
    private static final int RC_SIGN_IN = 1;
    AccountManager accountManager;
    GoogleSignInClient mGoogleSignInClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .build();
// Build a GoogleSignInClient with the options specified by gso.
        mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

        loginWithGoogleAccountBtn = findViewById(R.id.loginWithGoogleAccountBtn);
        loginWithGoogleAccountBtn.setSize(SignInButton.SIZE_STANDARD);
        loginWithGoogleAccountBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                signIn();


            }

        });
    }

    private void signIn() {
        Intent signInIntent = mGoogleSignInClient.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }

    @Override
    protected void onStart() {
        super.onStart();
        GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
        if (account != null) {
            Toast.makeText(this, "account : " + account.getDisplayName() + " : email " + account.getEmail() + "account id " + account.getId(), Toast.LENGTH_SHORT).show();
            try {
                getAccountData(account);
            } catch (IOException e) {
                e.printStackTrace();
            }
            redirectToMain();
        }
    }

    public void getAccountData(final GoogleSignInAccount account) throws IOException {
        Thread myThread = new Thread() {
            @Override
            public void run() {
                HttpTransport httpTransport = new NetHttpTransport();
                JacksonFactory jsonFactory = new JacksonFactory();
                String clientId = Constant.CLIENT_ID;
                String clientSecret = Constant.CLIENT_SECRET;
                GoogleCredential credential = new GoogleCredential.Builder()
                        .setTransport(httpTransport)
                        .setJsonFactory(jsonFactory)

                        .setClientSecrets(clientId, clientSecret)
                        .build();

                PeopleService peopleService =
                        new PeopleService.Builder(httpTransport, jsonFactory, credential).setApplicationName("MyApp").
                                build();
                try {

                    Person profile = peopleService.people().get("people/" + account.getId())
                            .setPersonFields("names,genders")
                            .setAccessToken(account.getIdToken())
                            .execute();

                    Log.i(TAG, profile.getGenders().get(0).getValue());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        myThread.start();


    }


    private void redirectToMain() {

        Intent intent = new Intent(LoginActivity.this, MainActivity.class);
        startActivity(intent);
    }

    private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
        try {
            GoogleSignInAccount account = completedTask.getResult(ApiException.class);

        } catch (ApiException e) {
            // The ApiException status code indicates the detailed failure reason.
            // Please refer to the GoogleSignInStatusCodes class reference for more information.
            e.printStackTrace();
            Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());

        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data
        if (requestCode == RC_SIGN_IN) {
            Log.i(TAG, "onActivityResult: ");
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            handleSignInResult(task);
        }

    }
}

我的person对象在从意图获得google帐户后出现的异常在这里出现

代码语言:javascript
运行
AI代码解释
复制
Person profile = peopleService.people().get("people/" + account.getId())
                        .setPersonFields("names,genders")
                        .setAccessToken(account.getIdToken())
                        .execute();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-03 04:04:34

当调用account.getIdToken()时,它返回的值是null

这是因为在创建GoogleSignIn时,您没有请求Id令牌。

Id令牌必须是显式请求的,您可以这样做:

替换以下代码: GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)

  • = new .requestEmail() .build();

对于以下内容: GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken("YOUR_OAUTH_CLIENT_ID") .requestEmail() .build();

应该将YOUR_OAUTH_CLIENT_ID字符串替换为实际的OAuth客户端Id.。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59152677

复制
相关文章
从SpringMVC获取用户信息谈起
上周末拜读了一位牛人的公众号文章<[Token认证,如何快速方便获取用户信息](https://mp.weixin.qq.com/s/Qi82d5xmlYwiuaGRSn54uw)>,语言风趣,引人入胜,为了表示涛涛敬仰之情,已经转载到自己的公众号了。
A稻田守望者
2019/09/30
1.6K0
从SpringMVC获取用户信息谈起
实战记录—PHP使用curl出错时输出错误信息
踩过的坑,实在不想再踩了,记录记录。 CURL错误列表 curl_exec($ch);//执行curl if (curl_errno($ch)) { echo 'Curl error: ' . curl_error($ch);//出错输出错误 } curl_close($ch);//关闭curl 同理,像正则,Json,数据库这些出错时基本都会有提供有帮助的错误信息 CURL状态码列表 状态码 状态原因 解释 0 正常访问 1 错误的协议 未支持的协议。此版cURL 不支持这一协议。 2 初始
房东的狗丶
2023/02/17
6.3K0
HttpWebRequest 在出错时获取response内容
HttpWebRequest 请求时,服务器会返回500 501这些错误 并包含错误信息,通过如下代码可以拿到错误信息
冰封一夏
2019/09/11
1.3K0
Spring Security - 02 从 SecurityContextHolder 中获取用户信息
新建 HelloController 控制器类,我们可以通过 SecurityContextHolder 获取用户信息(第 17 ~ 19 行):
用户6619361
2022/04/20
2.1K0
Springsecurity从当前请求对象中获取用户信息
SpringMVC中Controller的请求参数都是当前请求HttpServletRequest带来的,Authentication Principal也是HttpServletRequest带来的,在Controller层我们拿到的是HttpServletRequest的实例是Servlet3SecurityContextHolderAwareRequestWrapper
周杰伦本人
2022/10/25
3K0
从暴力枚举用户到获取域所有信息
我们在进行内网渗透中,会遇到存在 windows 域环境的情况,当我们获得一个内网主机权限之后,这个主机可能没有加入域,我们无法直接通过在这个主机上获取域中的相关信息,这是如何进行域渗透呢?
信安之路
2018/08/08
2.8K0
从暴力枚举用户到获取域所有信息
Httpcontext 获取用户信息
http://mpvideo.qpic.cn/0bf23qaamaaamyanvrglafpfbxgda3oaabqa.f10002.mp4?dis_k=abd635532fae29e55080d65
老张的哲学
2022/04/11
1.1K0
扩展和嵌入Python之获取程序出错信息
接着我们上次的内容继续。简单回顾下,上次的这种嵌入方式在Python中称为纯嵌入,我们可以定义自己的模块,在模块中定义自己的函数,通过C API可以让Python解释器识别我们的自定义模块。
用户5908113
2019/07/30
8840
扩展和嵌入Python之获取程序出错信息
微信使用getUserInfo和getUserProfile获取用户信息
getUserProfile是推荐使用的,官方在2021年4月之后,就不在推荐使用getUserInfo来获取用户信息(昵称和头像)。
软件小生活
2021/09/10
2.4K0
Typecho获取指定用户的信息
几年前写过类似的垃圾教程,今天因为需求原因,重新写了下教程,其实就是简单的sql查询! 获取指定uid用户的信息
泽泽社长
2023/04/17
1K0
利用API接口获取社交媒体上特定用户或话题相关信息
社交媒体已成为人们获取信息、交流、分享的重要平台。利用API接口可以方便地获取社交媒体上特定用户或话题相关的信息,帮助我们了解用户需求、抓取时下热点等。本文将为您介绍如何利用API接口获取社交媒体上特定用户或话题相关信息的步骤,并分享实用的代码示例,帮助您快速掌握这一技巧,提升信息获取与分析的能力。
华科云商小彭
2023/10/08
5520
利用API接口获取社交媒体上特定用户或话题相关信息
小程序 获取用户信息
小程序端 一、页面index.js var commRequest=require("../../request/commRequest.js"); Page({ /** * 页面
用户5899361
2020/12/07
1.3K0
从数据类型 varchar 转换为 numeric 时出错。
纠结了好几天了,就是不停的报错,网上说什么有ab什么字符在里面,我百般查找,各种报错
静谧的小码农
2019/01/11
3.2K0
使用k8s的api获取服务endpoint信息
不ready的话,大概率是pause镜像拉取不到,使用pullk8s来修正一下,稍微改动下
code4it
2023/08/31
3100
使用k8s的api获取服务endpoint信息
使用k8s的api获取服务endpoint信息
不ready的话,大概率是pause镜像拉取不到,使用pullk8s来修正一下,稍微改动下
code4it
2023/07/22
3650
Magicodes.WeiChat——使用OAuth 2.0获取微信用户信息
使用Magicodes.WeiChat,可以很方便的获取到微信用户的信息。在使用OAuth 2.0之前,你先需要做以下操作:
雪雁-心莱科技
2018/12/27
7790
点击加载更多

相似问题

试图获取当前用户信息时出错

11

试图从用户(json)获取特定信息时出错。- Future<dynamic>

13

试图从API - Blazor获取数据时出错。

11

从手机API获取信息时出错

116

从google驱动器api获取用户信息时出错

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档