Я пытаюсь создать веб-сайт на основе Express.js, который при переходе на определенную страницу получает список альбомов, ссылок, идентификаторов и т. д. У меня есть учетная запись службы со всеми разрешениями. Мой Javascript:

const oauth2Client = new google.auth.OAuth2(
  config.serviceAccount.client_id,
  config.oAuthclientSecret,
  config.oAuthCallbackUrl
);

google.options({auth: oauth2Client});

function getAlbumList(){
    var xhr = new XMLHttpRequest();
    var url = "https://photoslibrary.googleapis.com/v1/albums"
    xhr.open("GET",url,true);

    xhr.onreadystatechange = function () {
        console.log("making xhr")
        if (xhr.readyState == 4 && xhr.status == 200) {
            console.log(xhr);
        }
    }
    xhr.addEventListener('error',function(){
        console.log(xhr.statusMessage)
        console.log("xhr.status is ", xhr.status )
        console.log("ERROR");
    })
    xhr.addEventListener('timeout',function(){
        console.log("SERVER TIMEOUT")
    })
    // Sending our request 
    xhr.send();

}

Тем не менее, я даже никогда не получаю ответ обратно. У меня есть учетная запись службы, и мои учетные данные:

{  "type": "service_account",
  "project_id": "myProj",
  "private_key_id": "8dxxxxxx46",
  "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQExxxxxxxxxQ==\n-----END PRIVATE KEY-----\n",
  "client_email": "ihfphotograb@myproj.iam.gserviceaccount.com",
  "client_id": "10xxxxxxxxx6451",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/proj%40myproj.iam.gserviceaccount.com"}

Я просмотрел это, но они не Я не расскажу вам, как получить токен, и когда я посмотрел на вкладку сети, чтобы увидеть, как проходит запрос и параметры. У меня есть const {google} = require('googleapis'), но я не знаю, как получить этот токен.

Я хочу, чтобы служебное приложение выполняло всю аутентификацию, чтобы посетители моего веб-сайта могли видеть фотографии без аутентификации.

1
user311302 27 Ноя 2022 в 08:13
"получить JSON"? Что вы на самом деле собирались написать в своем заголовке?
 – 
Wyck
27 Ноя 2022 в 08:32

3 ответа

Перед каждым запросом вам нужно использовать токен, сгенерированный ранее и сохраненный в какой-либо переменной, или получать токен обновления каждый раз, когда вы отправляете запрос к API.

Следуйте этому уроку:

https://hmh.engineering/how-to-get-oauth-access-token-and-retrieve-data-from-google-apis-using-postman-9a95ffe030ae

0
Jean-Pierre Carvalho 27 Ноя 2022 в 08:27
Не могли бы вы опубликовать пример кода, пожалуйста, вместо ссылки? Благодарность
 – 
user311302
27 Ноя 2022 в 08:28

Вы должны добавить токен в свой запрос API, иначе вы получите ошибку 401 unauthorized.

Добавьте следующий код в конец файла index.js, используя идентификатор клиента и секрет вместо заполнителей:

/*  Google AUTH  */
 
const GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
const GOOGLE_CLIENT_ID = 'our-google-client-id';
const GOOGLE_CLIENT_SECRET = 'our-google-client-secret';
passport.use(new GoogleStrategy({
    clientID: GOOGLE_CLIENT_ID,
    clientSecret: GOOGLE_CLIENT_SECRET,
    callbackURL: "http://localhost:3000/auth/google/callback"
  },
  function(accessToken, refreshToken, profile, done) {
      userProfile=profile;
      return done(null, userProfile);
  }
));
 
app.get('/auth/google', 
  passport.authenticate('google', { scope : ['profile', 'email'] }));
 
app.get('/auth/google/callback', 
  passport.authenticate('google', { failureRedirect: '/error' }),
  function(req, res) {
    // Successful authentication, redirect success.
    res.redirect('/success');
  });

Вы можете посмотреть более подробный пример кода здесь.

1
Dream Bold 27 Ноя 2022 в 08:32
Могу ли я поместить то, что вы делаете, в вызовы app.get внутри вызова XMLHttpRequest.onreadystatechange? или все это действительно должно быть в main.js моего экспресс-приложения, его app.get("/page-this-should-occur-on", async function(req,res){ var $ = cheerio.load(fs.readFileSync('views/pages/page-this-should-occur-on.ejs')); var pagePath = req.path photofetch.getAlbumList(); res.render("index",{page:$.html(),pagename:pagePath}) })?
 – 
user311302
27 Ноя 2022 в 08:42
1
Есть ли какая-то конкретная причина, по которой вам нужно использовать HTMLHTTPRequest? Если нет, вам лучше использовать пример кода, который я предоставил.
 – 
Dream Bold
27 Ноя 2022 в 08:45
Не приведет ли создание нового экземпляра Express к моему текущему запущенному экземпляру Express? Этот веб-сайт будет работать следующим образом: как только кто-то перейдет на определенную страницу, в конечном итоге все альбомы будут показывать свои миниатюры. Но мое приложение Express работает с путями к страницам
 – 
user311302
27 Ноя 2022 в 08:48
Что вы имеете в виду под винтом? я не понимаю твой вопрос
 – 
Dream Bold
27 Ноя 2022 в 08:51
github.com/LoginRadius/engineering-blog-samples/tree/ master/… Вот полный рабочий код
 – 
Dream Bold
27 Ноя 2022 в 08:53

Поддерживаемые протоколы авторизации

enter image description here

Вы пытаетесь использовать учетную запись службы, которая не поддерживается этим API. Вы также пытаетесь использовать учетную запись службы с JavaScript, который также не поддерживается.

Вам нужно будет переключиться на использование Oauth2.

Пример есть в документации где показано, как это сделать.

<script src="https://apis.google.com/js/api.js"></script>
<script>
  /**
   * Sample JavaScript code for photoslibrary.albums.list
   * See instructions for running APIs Explorer code samples locally:
   * https://developers.google.com/explorer-help/code-samples#javascript
   */

  function authenticate() {
    return gapi.auth2.getAuthInstance()
        .signIn({scope: "https://www.googleapis.com/auth/photoslibrary https://www.googleapis.com/auth/photoslibrary.readonly https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"})
        .then(function() { console.log("Sign-in successful"); },
              function(err) { console.error("Error signing in", err); });
  }
  function loadClient() {
    gapi.client.setApiKey("YOUR_API_KEY");
    return gapi.client.load("https://photoslibrary.googleapis.com/$discovery/rest?version=v1")
        .then(function() { console.log("GAPI client loaded for API"); },
              function(err) { console.error("Error loading GAPI client for API", err); });
  }
  // Make sure the client is loaded and sign-in is complete before calling this method.
  function execute() {
    return gapi.client.photoslibrary.albums.list({})
        .then(function(response) {
                // Handle the results here (response.result has the parsed body).
                console.log("Response", response);
              },
              function(err) { console.error("Execute error", err); });
  }
  gapi.load("client:auth2", function() {
    gapi.auth2.init({client_id: "YOUR_CLIENT_ID"});
  });
</script>
<button onclick="authenticate().then(loadClient)">authorize and load</button>
<button onclick="execute()">execute</button>
0
DaImTo 27 Ноя 2022 в 21:51