Я пытаюсь создать веб-сайт на основе 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')
, но я не знаю, как получить этот токен.
Я хочу, чтобы служебное приложение выполняло всю аутентификацию, чтобы посетители моего веб-сайта могли видеть фотографии без аутентификации.
3 ответа
Перед каждым запросом вам нужно использовать токен, сгенерированный ранее и сохраненный в какой-либо переменной, или получать токен обновления каждый раз, когда вы отправляете запрос к API.
Следуйте этому уроку:
Вы должны добавить токен в свой запрос 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');
});
Вы можете посмотреть более подробный пример кода здесь.
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}) })
?
HTMLHTTPRequest
? Если нет, вам лучше использовать пример кода, который я предоставил.
Поддерживаемые протоколы авторизации
Вы пытаетесь использовать учетную запись службы, которая не поддерживается этим 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>
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Имейте в виду, что JavaScript — это НЕ то же самое, что Java! Включите все ярлыки, относящиеся к вашему вопросу; например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [svelte] и т. д.