javascript - node - El retorno del token de autenticación de Google no contiene refresh_token
id oauth google (2)
En algunos casos (principalmente clientes web), el token de actualización solo se envía la primera vez que el usuario se autentica.
Si va a aplicaciones conectadas a su cuenta, elimine la aplicación en cuestión. Luego inténtalo y autentícalo de nuevo. Verifique y ahora debería haber un token de actualización.
Escribo un ejemplo sobre google api usando. Biblioteca de Google NodeJS Client . He seguido el conjunto de instrucciones access_type : ''offline''
; sin embargo, el retorno del objeto no contiene refresh_token
.
Mi código:
var http = require(''http'');
var express = require(''express'');
var Session = require(''express-session'');
var google = require(''googleapis'');
var plus = google.plus(''v1'');
var OAuth2 = google.auth.OAuth2;
const ClientId = "251872680446-rvkcvm5mjn1ps32iabf4i2611hcg086e.apps.googleusercontent.com";
const ClientSecret = "F1qG9fFS-QwcrEfZbT8VmUnx";
const RedirectionUrl = "http://localhost:8081/oauthCallback";
var app = express();
app.use(Session({
secret: ''raysources-secret-19890913007'',
resave: true,
saveUninitialized: true
}));
function getOAuthClient () {
return new OAuth2(ClientId , ClientSecret, RedirectionUrl);
}
function getAuthUrl () {
var oauth2Client = getOAuthClient();
// generate a url that asks permissions for Google+ and Google Calendar scopes
var scopes = [
''https://www.googleapis.com/auth/plus.me''
];
var url = oauth2Client.generateAuthUrl({
access_type: ''offline'',
scope: scopes // If you only need one scope you can pass it as string
});
return url;
}
app.use("/oauthCallback", function (req, res) {
var oauth2Client = getOAuthClient();
var session = req.session;
var code = req.query.code;
oauth2Client.getToken(code, function(err, tokens) {
console.log("tokens : ", tokens);
// Now tokens contains an access_token and an optional refresh_token. Save them.
if(!err) {
oauth2Client.setCredentials(tokens);
session["tokens"]=tokens;
res.send(`
<html>
<body>
<h3>Login successful!!</h3>
<a href="/details">Go to details page</a>
<body>
<html>
`);
}
else{
res.send(`
<html>
<body>
<h3>Login failed!!</h3>
</body>
</html>
`);
}
});
});
app.use("/details", function (req, res) {
var oauth2Client = getOAuthClient();
oauth2Client.setCredentials(req.session["tokens"]);
var p = new Promise(function (resolve, reject) {
plus.people.get({ userId: ''me'', auth: oauth2Client }, function(err, response) {
console.log("response : " , response);
resolve(response || err);
});
}).then(function (data) {
res.send(`<html><body>
<img src=${data.image.url} />
<h3>Hello ${data.displayName}</h3>
</body>
</html>
`);
})
});
app.use("/", function (req, res) {
var url = getAuthUrl();
res.send(`
<html>
<body>
<h1>Authentication using google oAuth</h1>
<a href=${url}>Login</a>
</body>
</html>
`)
});
var port = 8081;
var server = http.createServer(app);
server.listen(port);
server.on(''listening'', function () {
console.log(`listening to ${port}`);
});
El token de actualización solo se envía una vez que el usuario inicia sesión por primera vez en su aplicación después de aprobar los ámbitos que ha especificado.
Si desea obtener el token de actualización cada vez que el usuario inicie sesión (incluso si el usuario ya Oauth2Client
sesión y aprobó los ámbitos), debe especificar approval_prompt : ''force''
en la configuración de Oauth2Client
:
var url = oauth2Client.generateAuthUrl({
access_type: ''offline'',
scope: scopes,
approval_prompt : ''force''
});
Tenga en cuenta que esto requerirá que el usuario acepte el alcance especificado cada vez que haga clic en su enlace para autenticarse:
También puede deshabilitar manualmente la aplicación en la configuración de permisos de su cuenta , esto revocará la aplicación y el usuario tendrá que aceptar los ámbitos de nuevo que activarán el refresh_token
la próxima vez que se autentique:
FYI, si necesita usar access_token
sin conexión, debe almacenar el servidor refresh_token
y actualizar el access_token con el refresh_token
almacenado cuando reciba el estado 401 de la API de Google. Por lo tanto, si almacena refresh_token
como debería, en realidad no es necesario usar approval_prompt : ''force''
y obliga al usuario a aprobar los ámbitos cada vez que se conecta a su aplicación.