获得“401未授权”,而试图与服务帐户认证(getting “401 Unauthorized” w

2019-10-28 12:52发布

所以现在的问题是:,我最近发这个帖子 。

解决方案我mentionned工作了一个令牌和一个API,但是当我试图处理两个API有两个令牌(Gmail和床单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);
    }
...

所以,给你一个更好的了解,我使用的角度和谷歌应用程序引擎创建一个web应用程序。 我wan't使用Gmail API从我的帐户发送邮件,还我使用表API来读取/电子表格/写。 只是要清楚,我对谷歌的点登录(用于Web应用程序的用户)的秘密文件,但这个是服务器端的代码,我不wan't用户看到一个同意画面。

我也问自己,如果我需要使用gcloud以激活服务帐户。

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

如果你需要其他的代码或精度为更好地理解这一问题让我知道

Answer 1:

Gmail的dosent支持服务帐户,除非它是一个gsuite帐户,并设置了域范围内结扎。

如果您选中的文档,你将只能看到使用的OAuth2没有服务器的帐户,这是信息,因为这是不支持那些不只是谷歌文档的东西。

表不只是记住,你需要预先授权的服务帐户支持服务帐户。 即通过与像你这样的服务帐户将使用该服务的其他用户帐户的电子邮件地址分享片完成。



文章来源: getting “401 Unauthorized” while trying to authenticated with service account