使用 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