gpt4 book ai didi

javascript - Google 身份验证 token 返回不包含 refresh_token

转载 作者:搜寻专家 更新时间:2023-10-31 23:40:48 28 4
gpt4 key购买 nike

我写了一个关于使用 google api 的例子。 Google NodeJS Client library .我遵循了指令集 access_type : 'offline',但是返回的对象不包含 refresh_token

我的代码:

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}`);
});

最佳答案

刷新 token 仅在用户批准您指定的范围后首次登录您的应用程序时发送一次。

编辑 08/2018:使用 approval_prompt:'force' 不再有效,您需要使用 prompt:'consent'(检查@Alexander 的回答)

如果你想在每次用户登录时获取刷新 token (即使用户之前已经登录并批准了范围),你必须在 Oauth2Client 中指定 prompt:'consent' 配置:

var url = oauth2Client.generateAuthUrl({
access_type: 'offline',
scope: scopes,
prompt : 'consent'
});

请注意,这将要求用户在每次点击您的链接进行身份验证时接受指定的范围:

enter image description here

您也可以在 account permission settings 中手动禁用该应用程序,这将撤销应用程序,用户将不得不再次接受范围,这将触发 refresh_token 在您下次进行身份验证时发送:

enter image description here

仅供引用,如果您需要离线使用access_token,您必须存储refresh_token服务器端,并使用存储的refresh_token刷新access_token > 当您从 Google API 收到状态 401 时。因此,如果您按照应有的方式存储 refresh_token,实际上无需使用 prompt:'consent' 并强制用户在每次连接时都批准范围你的申请。

关于javascript - Google 身份验证 token 返回不包含 refresh_token,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42522749/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com