【问题标题】:Error when trying to get user information using people API from googleAccount?尝试使用来自谷歌帐户的人员 API 获取用户信息时出错?
【发布时间】:2019-12-03 08:13:59
【问题描述】:

我正在尝试从谷歌获取用户帐户信息,例如生日、性别和其他用户数据,但在使用人员 API 时出现此异常

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 密钥来解决我的异常 这是我的代码

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 profile = peopleService.people().get("people/" + account.getId())
                        .setPersonFields("names,genders")
                        .setAccessToken(account.getIdToken())
                        .execute();

【问题讨论】:

  • 您好,根据您收到的错误消息,我认为问题可能出在您使用 account.getIdToken() 从您的帐户获得的凭据上。您可以尝试在通话前使用Log.i(TAG, account.getIdToken()) 之类的方式记录它们吗?你从中得到什么?干杯
  • 它返回 null 但是当我从 Person 对象中删除 setAccessToken 时。我也有同样的例外
  • 嘿@BlackAndWhite,我提供的答案应该可以解决您的问题。请让我知道这是否适合您。干杯!

标签: android google-api google-people-api


【解决方案1】:

调用account.getIdToken()时,其返回值为null。

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

必须明确请求 Id 令牌,您可以执行以下操作:

  • 替换以下代码:
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                                                     .requestEmail()
                                                     .build();
    
    对于以下内容:
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                                                     .requestIdToken("YOUR_OAUTH_CLIENT_ID")
                                                     .requestEmail()
                                                     .build();
    
    应将 YOUR_OAUTH_CLIENT_ID 字符串替换为您的实际 OAuth 客户端 ID。

【讨论】:

  • 我尝试了您的解决方案,但我仍然有相同的异常,并且 account.getIdtoken 返回 null。如果有其他解决方案,请告诉我。谢谢
  • @BlackAndWhite 感谢您的回答。您能否在 Google Developers Console 中检查您创建的凭据?请确保您的凭据的应用程序类型是Web application(而不是 Android 或其他)。如果不是,请使用它创建新凭据,并在您的项目中替换它们。
  • 我如您所说,使用 Web 应用程序为 OAuth 客户端 ID 创建新凭据,并使用新 ID 更改 requestIdToken 但我仍然遇到与 null idToken 相同的错误
  • @BlackAndWhite 您是否还更改了代码中的clientId 和clientSecret 变量? (run() 函数)。此外,如果您正在使用任何凭据缓存,请确保将其删除(在您的项目中找到“tokens”文件夹,如果存在,请删除“StoredCredential”文件)。确保 OAuth 身份验证流程正常运行 - 它要求您手动登录并接受应用程序正在使用的范围
  • @BlackAndWhite 也许这个其他问题可以帮助你:stackoverflow.com/questions/34111978/…
猜你喜欢
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多