使用 passport-google-oauth 验证正常,但无法访问任何 API
Authenticated ok with passport-google-oauth but can't access any API
在我的微服务中使用 passport
我可以成功地将我的端点授权给多个 Google 用户。
下一步应该是写入 Google 表格,但我得不到任何结果,也找不到任何已完成的示例。
import gapis from 'googleapis';
import { OAuth2Client } from 'google-auth-library';
app.get('/report',
passport.authenticate(['jwt'], { session: false }),
(req, res) => {
const secrets = getSecrets();
const oauth2Client = new OAuth2Client(
secrets.GOOGLE_CLIENTID,
secrets.GOOGLE_CLIENTSECRET,
secrets.GOOGLE_REDIRECT_URI
);
const creds = {
access_token: req.user.providers[0].tkn,
refresh_token: ''
}
oauth2Client['credentials'] = creds;
gapis.sheets('v4').spreadsheets.values.get({
auth: oauth2Client,
spreadsheetId: '1NITk258-perOnxMk?????????????????M1J82kcEk',
range: 'Report!A1:G50',
}, function(err, response) {
if (err) {
console.log('The API returned an error: ' + err);
return;
}
if ( response ) {
var rows = response.values;
if ( rows && rows.length > 0) {
console.log('Report Data');
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
console.log('%s, %s', row[0], row[4]);
}
} else {
console.log('No data found.');
}
} else {
console.log('Got no response at all.');
}
});
res.send('Secure response from ' + JSON.stringify(req.user));
}
);
当我调用该端点时,浏览器页面正确显示...
Secure response from {"name":"Dilbert","email":"dilbert@gma .....
...但是,服务器日志显示:
The API returned an error: Error: No refresh token is set.
很明显,我应该提供一个 refresh_token,但是 passport-google-oauth
似乎 return 没有!
passport.use(
new passportGoogle.OAuth2Strategy( passportConfig, (accessToken, refreshToken, profile, done) => {
console.log('* * * Google : Create Member : '); // * * * Google : Create Member :
console.log( accessToken ); // ya29.GlxRBVEyXnMedqHBifJ-kSvrojGCpKk... etc
console.log( refreshToken ); // undefined
SSO 是否与 API 访问不兼容?如果不是,它们是否是两个完全独立的功能,无法在一个步骤中处理?
我是否需要 运行 OAuth 两次,一次创建用户并获得初始授权令牌,然后第二次获得第二个授权令牌以 API 访问他们的数据?
Google 描述了 authenticating/authorizing 访问其 API 的各种技术:JWT、API 密钥等。正确使用的名称是什么在这种情况下?
如果它有助于理解我正在尝试做的事情......我的要求是允许大量用户连接,然后代表他们管理每个用户的私人驱动器中的几个不同的 Google 工作表 space.这似乎是一个常见的用例,但我还没有找到一个值得信赖的最新教程或代码示例来证明它有效。
Update : @chris-h 给了我正确的答案,但它没有立即起作用。我必须打开 Google 的管理页面 Apps with access to your account,找到我的微服务并 删除访问权限
查看以下获取refreshToken
https://github.com/jaredhanson/passport/issues/42
在我的微服务中使用 passport
我可以成功地将我的端点授权给多个 Google 用户。
下一步应该是写入 Google 表格,但我得不到任何结果,也找不到任何已完成的示例。
import gapis from 'googleapis';
import { OAuth2Client } from 'google-auth-library';
app.get('/report',
passport.authenticate(['jwt'], { session: false }),
(req, res) => {
const secrets = getSecrets();
const oauth2Client = new OAuth2Client(
secrets.GOOGLE_CLIENTID,
secrets.GOOGLE_CLIENTSECRET,
secrets.GOOGLE_REDIRECT_URI
);
const creds = {
access_token: req.user.providers[0].tkn,
refresh_token: ''
}
oauth2Client['credentials'] = creds;
gapis.sheets('v4').spreadsheets.values.get({
auth: oauth2Client,
spreadsheetId: '1NITk258-perOnxMk?????????????????M1J82kcEk',
range: 'Report!A1:G50',
}, function(err, response) {
if (err) {
console.log('The API returned an error: ' + err);
return;
}
if ( response ) {
var rows = response.values;
if ( rows && rows.length > 0) {
console.log('Report Data');
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
console.log('%s, %s', row[0], row[4]);
}
} else {
console.log('No data found.');
}
} else {
console.log('Got no response at all.');
}
});
res.send('Secure response from ' + JSON.stringify(req.user));
}
);
当我调用该端点时,浏览器页面正确显示...
Secure response from {"name":"Dilbert","email":"dilbert@gma .....
...但是,服务器日志显示:
The API returned an error: Error: No refresh token is set.
很明显,我应该提供一个 refresh_token,但是 passport-google-oauth
似乎 return 没有!
passport.use(
new passportGoogle.OAuth2Strategy( passportConfig, (accessToken, refreshToken, profile, done) => {
console.log('* * * Google : Create Member : '); // * * * Google : Create Member :
console.log( accessToken ); // ya29.GlxRBVEyXnMedqHBifJ-kSvrojGCpKk... etc
console.log( refreshToken ); // undefined
SSO 是否与 API 访问不兼容?如果不是,它们是否是两个完全独立的功能,无法在一个步骤中处理?
我是否需要 运行 OAuth 两次,一次创建用户并获得初始授权令牌,然后第二次获得第二个授权令牌以 API 访问他们的数据?
Google 描述了 authenticating/authorizing 访问其 API 的各种技术:JWT、API 密钥等。正确使用的名称是什么在这种情况下?
如果它有助于理解我正在尝试做的事情......我的要求是允许大量用户连接,然后代表他们管理每个用户的私人驱动器中的几个不同的 Google 工作表 space.这似乎是一个常见的用例,但我还没有找到一个值得信赖的最新教程或代码示例来证明它有效。
Update : @chris-h 给了我正确的答案,但它没有立即起作用。我必须打开 Google 的管理页面 Apps with access to your account,找到我的微服务并 删除访问权限
查看以下获取refreshToken https://github.com/jaredhanson/passport/issues/42