首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有ServiceAccount错误401的Gmail

带有ServiceAccount错误401的Gmail
EN

Stack Overflow用户
提问于 2020-05-08 14:08:41
回答 1查看 336关注 0票数 1

我正在尝试从后端java中使用Gmail。从maven依赖项开始

代码语言:javascript
复制
    <dependency>
        <groupId>com.google.apis</groupId>
        <artifactId>google-api-services-gmail</artifactId>
        <version>v1-rev20200406-1.30.9</version>

    </dependency>
    <dependency>
        <groupId>com.google.auth</groupId>
        <artifactId>google-auth-library-oauth2-http</artifactId>
        <version>0.20.0</version>
    </dependency>  

我已经从google管理器下载了一个p12 Keystore,并创建了一个服务帐户。

代码语言:javascript
复制
PrivateKey key = (PrivateKey)keystore.getKey("privatekey", "somepass".toCharArray()); 
ServiceAccountCredentials serviceAccountCredentials = ServiceAccountCredentials.newBuilder()
                 .setClientEmail("somestuff@developer.gserviceaccount.com")                                                                                         
                 .setServiceAccountUser("somestuff@developer.gserviceaccount.com")                                                                                                
                 .setClientId("somenumber")                                                                                                  
                 .setScopes(SCOPES)                                                                                                  
                 .setPrivateKey(key).build();

现在看来这起作用了

代码语言:javascript
复制
serviceAccountCredentials.refresh();

的形式上生成一个令牌。

ya29.c.Ko8BygeNYc2Onx2IZpK-ocaHKTiCxOcYYK7nbTg8uE0gyqc8rXROuiVJ7oXCfnYD1pDOyHXiy_K5Eyk3aV3epgjtnr2WVCP_xpWCxq-BExh4i1aIXW9m7gkkUtbteXaD1nETUwIc6n9Uz2oCJSU4jrodFv4n4drxlSGd7my0LcxrMk_E5cFY7jo-Vt40i58g5QY

现在我无法工作的部分

代码语言:javascript
复制
HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(serviceAccountCredentials);

Gmail service = new Gmail.Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance(), requestInitializer).setApplicationName(APPLICATION_NAME).build();
Gmail.Users.Labels.List list = service.users().labels().list("b@someemail")
                               .setAccessToken(credential.getAccessToken().getTokenValue());

我还完成了Gmail REST : 400坏请求+失败的先决条件建议的所有gmail配置

但我一直想得到

代码语言:javascript
复制
com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
{
  "code" : 401,
  "errors" : [ {
    "domain" : "global",
    "location" : "Authorization",
    "locationType" : "header",
    "message" : "Invalid Credentials",
    "reason" : "authError"
  } ],
  "message" : "Invalid Credentials"
}

问候

EN

回答 1

Stack Overflow用户

发布于 2020-05-08 15:51:26

备注

您正在使用域委托,您应该按照指南授权服务帐户使用这个特定范围的Gmail。

方法

一旦创建了从服务帐户键开始的凭据对象,就可以这样创建Gmail服务构建器了:

代码语言:javascript
复制
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private static final String SERVICE_ACCOUNT_ID = "your-service-account-id";
private static final String APPLICATION_NAME = "your-app-name";

PrivateKey key = (PrivateKey)keystore.getKey("privatekey", "somepass".toCharArray()); 

HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();

GoogleCredential credential = new GoogleCredential.Builder()
                .setTransport(httpTransport)
                .setJsonFactory(JSON_FACTORY)
                .setServiceAccountId(SERVICE_ACCOUNT_ID)
                .setServiceAccountScopes(SCOPES)
                .setServiceAccountPrivateKey(key)
                .setServiceAccountEmail("user@email")
                .build();

Gmail service =  new Gmail.Builder(httpTransport, JSON_FACTORY, credential)
                .setApplicationName(APPLICATION_NAME).build();

现在,您可以直接使用Gmail服务,而无需再次指定访问令牌或凭据。就像这样:

代码语言:javascript
复制
ListLabelsResponse listResponse = service.users().labels().list("b@somemail").execute();

参考文献

Java Gmail

服务帐户Java

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

https://stackoverflow.com/questions/61681045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档