According to Docs, I have authenticated my app on request call
and try to insert a post:
var blogger = google.blogger('v3');
app.post('/creatGoogleBloggerPost', function(req, res, next){
console.log('creatGoogleBloggerPost called');
var oauth2Client = new google.auth.OAuth2();
var key = require('./public_html/SoulSeeker2-1bxxxaaa727d.json');
var jwtClient;
jwtClient = new google.auth.JWT(key.client_email, null, key.private_key, ['https://www.googleapis.com/auth/blogger'], null);
jwtClient.authorize(function(err, tokens) {
console.log('retrieved tokens.access_token from google', tokens.access_token);
google.options({
auth: jwtClient
});
if (err) {
console.log(err);
return;
} else {
blogger.posts.insert({
auth: jwtClient,
blogId: '4113791741191234135',
resource: {
title: 'Sample rootscope',
content: 'Content rootscope'
}
}, function(){
console.log('success');
});
}
});
});
I am getting the token back and also it prints the call back success message
but however, no post is inserted when I check the blog. There is no error either. What could be wrong here?
Update:
Actually google-blogger-api
doesn't accept service account token. So modify my code to use oauth2.0
with node-passport
but still getting login error
:
blogger.posts.insert({
Authorization: 'Bearer ' +USERS.accessToken,
blogId: '4113796741591234135',
resource: {
title: 'Sample rootscope',
content: 'Content rootscope'
}
}, function(err, reponse){
if(err){
console.log('error ', err);
} else {
console.log('blog post success in google blogger' , reponse);
}
});
I have passed the auth token
but I get error like this now:
error { [Error: Login Required]
code: 401,
errors:
[ { domain: 'global',
reason: 'required',
message: 'Login Required',
locationType: 'header',
location: 'Authorization' } ] }
I am using official google blogger api. I guess I am not passing the token in the header. How do I properly pass the token to fix this issue?
It took so many days to properly figure this out using nodejs way (without using passportjs). Hope this helps.
One more way posting to blogger API is as follows:
Note: I am using nodejs with expressjs.
var express = require('express');
var app = express();
var request = require('request');
var rp = require('request-promise');
app.get('/creatGoogleBloggerPost', blogPost);
app.get("/auth/google/Bloggercallback", blogCallBack);
Get Auth Client:
function getOAuthClient() {
return new OAuth2('client id', 'client secret', 'callback url');
}
Get Auth Url:
function getAuthUrl() {
var oauth2Client = getOAuthClient();
var url = oauth2Client.generateAuthUrl({
access_type: 'offline',
scope: 'https://www.googleapis.com/auth/blogger'
});
return url;
}
function blogPost(req, res, next) {
var params = {
name: "sample",
auth: getAuthUrl()
};
console.log('');
console.log('=======================================================================');
console.log('blogger api auth url: ', params);
console.log('=======================================================================');
console.log('');
res.send(params.auth); //on the front-end view, I am doing window.location.replace to route `params.auth`
}
post to blogger inside callback:
function blogCallBack(req, res, next) {
var oauth2Client = getOAuthClient();
var code = req.query.code;
oauth2Client.getToken(code, function (err, tokens) {
if (!err) {
oauth2Client.setCredentials(tokens);
console.log('');
console.log('===============================================================');
console.log('BloggerAPI Callback....');
console.log('Success Getting BloggerAPI Token', tokens);
console.log('===============================================================');
console.log('');
var params = {
title: 'Sample title',
content: 'Sample Content'
};
var options = {
uri: 'https://www.googleapis.com/blogger/v3/blogs/1939594269984333602/posts/',
method: 'POST',
body: params,
headers: {
'User-Agent': 'Request-Promise',
"Authorization": 'Bearer ' + tokens.access_token
},
json: true // Automatically parses the JSON string in the response
};
rp(options)
.then(function (response) {
console.log('=================================');
console.log('=================================');
console.log("RESPONSE.STATUSCODE: ", res.statusCode);
console.log('=================================');
console.log('=================================');
if (res.statusCode >= 100 && res.statusCode < 600)
return res.redirect('/');
else
return res.status(500);
})
.catch(function (err) {
console.log('=================================');
console.log('=================================');
console.log('POST error ', err.stack);
console.log('=================================');
console.log('=================================');
return res.status(res.statusCode).send(err);
});
} else {
console.log('Error Getting BloggerAPI Token', err);
}
});
}
The only problem is I am passing hard-coded values to post the blog in the callback. If anyone can help me out with that it would be great. Thanks