gpt4 book ai didi

java - 尝试使用服务帐户进行身份验证时获取 "401 Unauthorized"

转载 作者:行者123 更新时间:2023-12-02 01:44:16 30 4
gpt4 key购买 nike

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

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

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

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

我已经刷新了 token ,使用了 GoogleCredential 而不是 Credential,创建了新 key 等...虽然我没有尝试过的一件事是使用 Gsuite 帐户我我正在使用基本帐户。

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

我的邮件类(class)

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 从我的帐户发送邮件,而且我还使用 Sheets API 从电子表格读取/写入。需要明确的是,我有一个用于谷歌登录的 secret 文件(对于网络应用程序的用户),但这是服务器端代码,我不希望用户看到同意屏幕。

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

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

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

最佳答案

Gmail 不支持服务帐户,除非它是 gsuite 帐户并且您设置了域范围的授权。

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

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

关于java - 尝试使用服务帐户进行身份验证时获取 "401 Unauthorized",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53938197/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com