当前位置: 首页 > 知识库问答 >
问题:

尝试访问谷歌联系人应用程序接口时,401未授权

陶超
2023-03-14

我正试图连接到google Contacts api以访问保存在google中的联系人/联系人,但它抛出了一个TokenResponseException:401 Unauthorized。我对谷歌Oauth2有些陌生。0.我已按要求将服务帐户密钥文件下载到我的项目根目录。

代码如下:

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.gdata.client.contacts.ContactsService;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Arrays;

public class Connector {
private static ContactsService contactService = null;
    private static HttpTransport httpTransport;

    private static final String APPLICATION_NAME = "example";
    private static final String SERVICE_ACCOUNT_EMAIL = "example_mail@example-166608.iam.gserviceaccount.com";
    private static final java.util.List<String> SCOPE = Arrays.asList("https://www.google.com/m8/feeds/");

    private Connector() {
        // explicit private no-args constructor
    }

    public static void main(String[] args) {
        System.out.println(getInstance());
    }

    public static ContactsService getInstance() {
        if (contactService == null) {
            try {
                contactService = connect();
            } catch (GeneralSecurityException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return contactService;
    }

    private static ContactsService connect() throws GeneralSecurityException, IOException {
        httpTransport = GoogleNetHttpTransport.newTrustedTransport();

        java.io.File p12File = new java.io.File("example-e8135faedf4e.p12");

        // @formatter:off
        GoogleCredential credential = new GoogleCredential.Builder()
                .setTransport(httpTransport)
                .setJsonFactory(JacksonFactory.getDefaultInstance())
                .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
                .setServiceAccountScopes(SCOPE)
                .setServiceAccountPrivateKeyFromP12File(p12File)
                .setServiceAccountUser("example@gmail.com")
                .build();
        // @formatter:on

        if (!credential.refreshToken()) {
            throw new RuntimeException("Failed OAuth to refresh the token");
        }

        ContactsService myService = new ContactsService(APPLICATION_NAME);
        myService.setOAuth2Credentials(credential);

        return myService;
    }
}

但是,会引发以下异常:

通用域名格式。谷歌。应用程序编程接口。客户啊。oauth2。TokenResponseException:401未经授权
null
在com上。谷歌。应用程序编程接口。客户啊。oauth2。TokenResponseException。来自com上的(TokenResponseException.java:105)。谷歌。应用程序编程接口。客户啊。oauth2。代币请求。executeUnparsed(TokenRequest.java:287)位于com.google.应用程序编程接口。客户啊。oauth2。代币请求。在com上执行(TokenRequest.java:307)。谷歌。应用程序编程接口。客户古格里皮斯。啊。oauth2。谷歌。executeRefreshToken(GoogleCredential.java:384)位于com.google.应用程序编程接口。客户啊。oauth2。资质在连接器上刷新令牌(Credential.java:489)。在连接器处连接(Connector.java:58)。连接器上的getInstance(Connector.java:31)。main(Connector.java:25)构建成功(总时间:9秒)

共有2个答案

罗安宁
2023-03-14

我发现您的代码与Quickstart示例中的代码基本相同。如果这至少奏效一次,请检查您是否有任何令牌保存在tokens文件夹下。

燕翼
2023-03-14

从这个相关线程来看,TokenResponseException可能是由无效的客户机ID、客户机机密或作用域以及刷新令牌过度使用等许多原因造成的。这里还指出,“401未经授权”异常的另一个可能来源是离开凭证。refreshToken()。调用是将访问代码写入引用所必需的。

可能也有帮助的其他参考: 401响应时,通过服务帐户和OAuth2到谷歌驱动器

 类似资料:
  • 我正在使用oauth 1.0,到目前为止,我可以成功地从谷歌获得访问令牌。但是当我想从https://www.google.com/m8/feeds/contacts/default/full检索用户联系人时,它返回401错误,没有进一步的解释。 我发现来自Google playground的信息可能不太准确,例如,步骤3和步骤5中的签名基本字符串包含oauth_version,但它是错误的。(如

  • 我试图通过访问Google Admin SDK API来提取我域中的用户。但是,我被赋予了401未经授权的异常。下面的代码是我的设置类,其中包含我调用API的方法。 下面的代码是我用来从我的域中提取用户的测试用例: 最后,这是我面临的一个例外。 任何帮助都将不胜感激!!!

  • 我是第一次使用谷歌API,我在尝试下载文件对象“下载Url”属性的文件时遇到问题。我当前正在使用“服务帐户”选项以及关联的服务帐户电子邮件和 P12 证书。 但是,URL返回“https://doc-08-68-docs.googleusercontent.com/docs/securesc/bteg36c1tifegg79l2ov17og25612tet/gk7kn52ahe4d0to7d6ht

  • 我在写spring应用程序。我在我的项目中加入了招摇过市,但不知何故它无法正常运行。我的项目中也有带令牌的承载身份验证。请告诉我如何解决这个问题

  • 我想使用谷歌驱动器作为一个网站的准CMS工作,我正在使内容所有者可以编辑他们的内容使用谷歌驱动器。我希望使用一个可以访问Google Drive的特定用户帐户(在写这篇文章时,服务帐户不能直接访问Google Drive),并且能够与内容所有者共享文档。 在阅读了API和教程之后,我在委托中找到了答案:https://developers.google.com/drive/development

  • 我试着连接到谷歌云物联网MQTT Brocker。我没有被授权连接(5)作为Java客户端的异常。 使用以下回购的示例代码。https://github.com/googlecloudplatform/java-docs-samples/tree/master/iot/api-client/mqtt_example