получить «401 Unauthorized» при попытке аутентификации с помощью учетной записи службы - PullRequest
0 голосов
/ 27 декабря 2018

Так вот в чем проблема: я недавно сделал это сообщение .

Решение, которое я упомянул, работало для одного токена и одного 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.

, если вам нужен другой код или точность для лучшего понимания проблемы, сообщите мне

1 Ответ

0 голосов
/ 27 декабря 2018

Gmail не поддерживает учетные записи службы поддержки, если только она не является учетной записью gsuite и вы не настроили общий домен.

Если вы посмотрите документацию, вы увидите только информацию об использовании Oauth2, а не учетной записи сервера, это потому, что Google только документирует вещиподдерживаются не те, которые не поддерживаются.

Sheets действительно поддерживает учетные записи служб, только что вспомнил, что вам необходимо предварительно авторизовать учетную запись службы.Это делается путем предоставления доступа к листу с учетной записью службы, как если бы вы использовали любой другой пользователь, использующий адрес электронной почты учетных записей службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...