Так вот в чем проблема: я недавно сделал это сообщение .
Решение, которое я упомянул, работало для одного токена и одного API, но когда я попытался обработать два API с двумя токенами(gmail и Sheets 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 app engine.Я не хочу использовать Gmail API для отправки почты из моей учетной записи, также я использую API листов для чтения / записи из / в электронную таблицу.Просто чтобы прояснить, у меня есть секретный файл для входа в Google (для пользователя веб-приложения), но там есть код на стороне сервера, и я не хочу, чтобы пользователь видел экран согласия.
Я также спрашиваю себя, нужно ли мне использовать gcloud
для активации служебной учетной записи.
Я запускаю (на данный момент) мой сервер локально, используя Eclipse и плагин движка приложения Google.
, если вам нужен другой код или точность для лучшего понимания проблемы, сообщите мне