Получить адрес электронной почты с помощью скрипта Google Apps. Ошибка: redirect_uri_mismatch - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь получить адрес электронной почты пользователя, используя мой скрипт приложения.Я проконсультировался в нескольких местах:

https://developers.google.com/identity/sign-in/web/sign-in

https://developers.google.com/apps-script/guides/html/

и в вопросе, который я писал ранее, но не могу сделать это, и есть новая проблема.

Этот кодовый файл gs:

function doGet(e) {

 var tmp = HtmlService.createTemplateFromFile("testapi");
 return tmp.evaluate(); 

}

Этот кодовый файл html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="google-signin-client_id" content="1xxxxxxxxxx-xxxxxxxxi87eht.apps.googleusercontent.com">
    <title>Oauth2 web</title>

    <!-- Google library -->
    <script src="https://apis.google.com/js/platform.js" async defer></script>

    <!-- Jquery library to print the information easier -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>

    <!-- Bootstrap library for the button style-->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
</head>
<body>
<div id="profileinfo">
</div>
<div class="g-signin2" data-onsuccess="onSignIn"></div>

<script>
            function onSignIn(googleUser) {
              var profile = googleUser.getBasicProfile();
              console.log('ID: ' + profile.getId()); // Do not send to your backend! Use an ID token instead.
              console.log('Name: ' + profile.getName());
              console.log('Image URL: ' + profile.getImageUrl());
              console.log('Email: ' + profile.getEmail()); // This is null if the 'email' scope is not present.

              $("#profileinfo").append("<h2>Sup " + profile.getName() + ", welcome home my friend</h2>");
              $("#profileinfo").append("<img style='width:250px;height:250px' src='" + profile.getImageUrl() + "'><br><br>");
              $("#profileinfo").append("<p>Your email is: " + profile.getEmail() + "</p>");

            }
        </script>

<button type="button" class="btn btn-danger" onclick="signOut();">Sign out</button>

<script>
            function signOut() {
               var auth2 = gapi.auth2.getAuthInstance();
               auth2.signOut().then(function () {
                 console.log('User signed out.');
               $("#profileinfo").empty();
               $("#profileinfo").append("<h2>Goodbye old friend</h2>");
               });
            }
        </script>
</body>
</html>

create clientID console.developers.google.com

URL of Apps script

error

Ответы [ 3 ]

1 голос
/ 28 июня 2019

Я воспроизвел ваши шаги, и он действительно получает html, но при попытке войти во всплывающее окно выдается следующая ошибка:

“Error: redirect_uri_mismatch

The JavaScript origin in the request, https://XXXXXXX-script.googleusercontent.com, does not match the ones authorized for the OAuth client.”

Вам необходимо скопировать URL-адрес из сообщения об ошибке и выполнить следующие действия:

1) Выберите проект в облаке Google и перейдите к учетным данным -> Экран согласия Oauth, в авторизованных доменах добавьте «googleusercontent.com».

2) Отредактируйте свои учетные данные и добавьте URL, который вы получили ранее, в раздел «Авторизованные источники JavaScript».

3) Развернуть как веб-приложение в новой версии.

Если я правильно понял, это должно сработать, хотя пара моментов, на которые следует указывать при развертывании веб-приложения:

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

2) Если вы устанавливаете параметры развертывания для запуска приложения от своего имени, а в параметре доступа выбираете «Любой, даже анонимный», при щелчке на параметре входа будет отображаться экран ожидаемого согласия oauth. войти в систему. Единственное, что при выходе из системы и повторном нажатии на кнопку входа она автоматически войдет в систему с прежними учетными данными (на обычном сервере вам снова будет предложен экран согласия).

Без необходимости реализации Oauth вы можете установить параметры развертывания в качестве настройки в «1)», а затем использовать объект User из App Script для получения электронной почты пользователя, хотя это единственная информация, которую вы можете получить оттуда. [1].

[1] https://developers.google.com/apps-script/reference/base/user

1 голос
/ 28 июня 2019

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

В бэкэнде создайте эту функцию:

function getUser(){
  //Session.getEffectiveUser().getEmail(); // Just for scope
  var url = "https://www.googleapis.com/oauth2/v1/userinfo?alt=json";
  var param = {
    method      : "Get",
    headers     : {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
    'muteHttpExceptions' :true
  };
  var html = UrlFetchApp.fetch(url,param);
  var data = JSON.parse(html.getContentText());
  Logger.log(JSON.stringify(data))
  /* Result is JSON
  {"id":"Google User ID","email":"user@mail.com","verified_email":true,"picture":"https://xxxxxxxxxxxxxxxxx/photo.jpg"}
  */
  return data
}

Тогда теперь во внешнем интерфейсе вы можете вызвать эту функцию, чтобы получить информацию о пользователе:

function getUserDetails(){
  google.script.run
        .withSuccessHandler(function(user) {
            //Do some stuffs with user details
            // Email is in user.email
          })
        .withFailureHandler(function(msg) {
            console.log(msg);
          })
        .getUser(); 
}

Когда скрипт запрашивает Session.getEffectiveUser (). GetEmail (), пользователь предоставляет область действия, чтобы позволить пользователюинформация.

Тогда вам просто нужно запросить конечную точку https://www.googleapis.com/oauth2/v1/userinfo?alt=json, чтобы получить информацию о пользователе.

Стефан

0 голосов
/ 28 июня 2019

Веб-приложения, созданные внутри скрипта Служб Google, всегда обслуживаются внутри IFRAME и недоступны за пределами IFRAME.

Поэтому стандартный компонент входа в Google не может быть встроен в эти приложения.

...