【问题标题】:getting "401 Unauthorized" while trying to authenticated with service account尝试使用服务帐户进行身份验证时收到“401 Unauthorized”
【发布时间】:2018-12-26 23:28:01
【问题描述】:

所以问题来了:我最近做了this post

我提到的解决方案适用于一个令牌和一个 API,但是当我尝试使用两个令牌(gmail 和 Sheets API)处理两个 API 时,它失败了。

所以我现在想做的是让这两个工作,所以我告诉自己“嘿,让我们创建一个服务帐户”。即使我不太了解这两种方法之间的区别。服务帐户似乎阻止了同意屏幕(对吗?)。

我已经在网上搜寻答案,但似乎都失败了。

我已刷新令牌,使用 GoogleCredential 而不是 Credential,创建了新密钥等...虽然我没有尝试过的一件事是使用 Gsuite 帐户,但我使用的是基本帐户。

所以现在我已经创建了一个新的 p12 文件,并且我立即收到了 401 错误。我将分享我的代码以便更好地理解。

我的邮件类

public class mailService {
    private static final String APPLICATION_NAME = "AHS";
    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

    private static final String TOKENS_DIRECTORY_PATH = "tokens";
//I've added sheet scope as it is activated in my project
    private static final Collection<String> SCOPES = Arrays.asList(GmailScopes.GMAIL_SEND, GmailScopes.GMAIL_LABELS, SheetsScopes.SPREADSHEETS);

    private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException, GeneralSecurityException {
        File sa = new File("WEB-INF/mykeyfile.p12");
        Credential credential = new GoogleCredential.Builder()
                    .setTransport(HTTP_TRANSPORT)
                    .setJsonFactory(JSON_FACTORY)
                    .setServiceAccountId(
                            "myapp@appspot.gserviceaccount.com")
                    .setServiceAccountScopes(SCOPES)
                    .setServiceAccountPrivateKeyFromP12File(sa)
                    .setServiceAccountUser("myemailadress@gmail.com")
                    .build();
        //credential.refreshToken();
        return (credential);
    }
    
    public static Gmail getService() throws GeneralSecurityException, IOException {
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
        /*Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
                .setApplicationName(APPLICATION_NAME)
                .build();*/
        Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, null)
                .setHttpRequestInitializer(getCredentials(HTTP_TRANSPORT)).setApplicationName(APPLICATION_NAME).build();
        return (service);
    }
...

所以为了让您更好地理解,我正在使用 Angular 和 Google 应用引擎创建一个网络应用。我不想使用 Gmail API 从我的帐户发送邮件,而且我正在使用表格 API 来读取/写入电子表格。为了清楚起见,我有一个用于 google-sign-in 的秘密文件(供网络应用程序的用户使用),但这是服务器端代码,我不希望用户看到同意屏幕。

我也在问自己是否需要使用gcloud 来激活服务帐户。

我正在(目前)使用 Eclipse 和谷歌应用引擎插件在本地运行我的服务器。

如果您需要其他代码或精度来更好地理解问题,请告诉我

【问题讨论】:

  • 服务帐户不能与 Gmail 一起使用,除非这是一个 gsuite 电子邮件帐户,然后您需要设置域范围的委托
  • @DaImTo 哇,谢谢你的回答。能告诉我写在哪里吗?工作表 API 也一样吗?非常感谢,哈哈,我很坚持:)
  • @DaImTo 你也可以回答我的帖子我会标记为已回答
  • 如果您查看文档中提到的使用 Oauth2 的所有内容,这意味着服务帐户没有任何意义,这是因为 Google 只记录有效的内容,而不是不支持的内容 developers.google.com/gmail/api/auth/web-server。是的,您可以将服务帐户与 Google 表格一起使用。只记得与使用服务帐户电子邮件地址的任何其他用户一样,与服务帐户共享工作表。
  • @DaImTo 好的,非常感谢,我会检查一下。

标签: java google-app-engine oauth-2.0 credentials service-accounts


【解决方案1】:

Gmail dosent 支持服务帐户,除非它是一个 gsuite 帐户并且您设置了域范围的委托。

如果您查看文档,您只会看到有关使用 Oauth2 而不是服务器帐户的信息,这是因为 Google 只记录受支持的内容,而不是不支持的内容。

Sheets 确实支持服务帐户,只是记得您需要对服务帐户进行预授权。这是通过与服务帐户共享工作表来完成的,就像使用服务帐户电子邮件地址的任何其他用户一样。

【讨论】:

  • @Hey 希望不要打扰,但我已经尝试过使用床单的服务帐户,但没有成功。我已尝试将工作表共享给myproject@appspot.gserviceaccount.com,但仍然未经授权获得 401。我需要一个 gsuite 帐户吗?
  • 我的 Java 技能有限,尽管你应该可以为工作表更改它developers.google.com/analytics/devguides/config/mgmt/v3/…
  • @JSmith 你还记得你还需要做些什么吗?我正在调整 HelloAnalytics 示例,但即使工作表与服务帐户共享,我也得到了 401 未授权
  • @LukeBickell 你能写一篇文章吗,如果可以的话我很乐意提供帮助
猜你喜欢
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 2014-07-19
  • 2020-06-24
  • 2020-05-21
  • 2020-11-24
相关资源
最近更新 更多