尝试通过服务帐户进行身份验证时收到“ 401未经授权”

时间:2018-12-26 23:28:02

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

这就是问题所在:我最近造了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应用程序引擎创建一个Web应用程序。我不会使用Gmail API从我的帐户发送邮件,也正在使用表格API从电子表格中读取/写入电子表格。为了清楚起见,我有一个用于Google登录的秘密文件(针对Web应用程序的用户),但这是服务器端代码,我不希望用户看到同意屏幕。

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

(目前)我正在使用Eclipse和Google App Engine插件在本地运行服务器。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

相关问题