错误:未设置访问、刷新令牌或 API 密钥

Posted

技术标签:

【中文标题】错误:未设置访问、刷新令牌或 API 密钥【英文标题】:Error: No access, refresh token or API key is set 【发布时间】:2018-10-21 05:05:19 【问题描述】:

我正在尝试在 Node 中制作一个应用程序来访问我的谷歌日历,所以我按照https://developers.google.com/calendar/quickstart/nodejs 的步骤操作,但我收到了Error: Error: No access, refresh token or API key is set.

是的,我已经创建了凭据。

是的,我已经下载了 json,重命名为 client_secret.json 并添加到应用程序文件夹中。

代码如下:

    const fs = require('fs'); 
    const readline = require('readline'); 
    const google = require('googleapis'); 
    const OAuth2Client = google.auth.OAuth2; 
    const SCOPES = ['https://www.googleapis.com/auth/calendar.readonly']; 
    const TOKEN_PATH = './client_secret.json';
        
    try    
        const content = fs.readFileSync('client_secret.json');   
        authorize(JSON.parse(content), listEvents); 
     catch (err)    
        return console.log('Error loading client secret file:', err); 
    
        
    function authorize(credentials, callback)    
        const client_secret, client_id, redirect_uris = credentials.installed;   
        let token = ;   
        const oAuth2Client = new OAuth2Client(client_id, client_secret, redirect_uris[0]);
        
          // Check if we have previously stored a token.   
        try 
            token = fs.readFileSync(TOKEN_PATH);   
         catch (err) 
            return getAccessToken(oAuth2Client, callback);   
           
        oAuth2Client.setCredentials(JSON.parse(token));   
        callback(oAuth2Client); 
    
        
    function getAccessToken(oAuth2Client, callback)    
        const authUrl = oAuth2Client.generateAuthUrl(
            access_type: 'offline',
            scope: SCOPES,   
        );   
        console.log('Authorize this app by visiting this url:', authUrl);   
        const rl = readline.createInterface(
            input: process.stdin,
            output: process.stdout,   
        );   
        rl.question('Enter the code from that page here: ', (code) => 
            rl.close();
            oAuth2Client.getToken(code, (err, token) => 
                if (err) return callback(err);
                oAuth2Client.setCredentials(token);
                // Store the token to disk for later program executions
                try 
                    fs.writeFileSync(TOKEN_PATH, JSON.stringify(token));
                    console.log('Token stored to', TOKEN_PATH);
                 catch (err) 
                    console.error(err);
                
            callback(oAuth2Client);
            );   
        ); 
    
        
    function listEvents(auth)    
        const calendar = google.calendar(version: 'v3', auth);   
        calendar.events.list(
            calendarId: 'primary',
            timeMin: (new Date()).toISOString(),
            maxResults: 10,
            singleEvents: true,
            orderBy: 'startTime',   , (err, data) => 
                if (err) return console.log('The API returned an error: ' + err);
                const events = data.items;
                if (events.length) 
                    console.log('Upcoming 10 events:');
                    events.map((event, i) => 
                    const start = event.start.dateTime || event.start.date;
                    console.log(`$start - $event.summary`);
                );
             else 
              console.log('No upcoming events found.');
               
    ); 

有什么想法吗?

【问题讨论】:

“应用程序文件夹”同const TOKEN_PATH = './client_secret.json';? 是的,我可以看到从文件中加载的内容。 感谢您的回复。我发布了确认点。请检查一下。 【参考方案1】:

您能否再次确认以下几点?

const TOKEN_PATH = './client_secret.json';const content = fs.readFileSync('client_secret.json');的文件是一样的。 请将const TOKEN_PATH = './client_secret.json';修改为const TOKEN_PATH = './credentials.json';,然后重新运行。 这样,您下载的client_secret.json 可能已经被覆盖。所以也请确认一下。 即使进行了上述修改,仍然出现错误时,请确认googleapis的版本。因为据报道 googleapis 使用 v25.0.0 - v30.0.0。对某些 API 有一些错误。 如果您认为错误是bug,请将googleapis的版本修改为v24.0.0。错误可能会被消除。

参考资料:

How do I update my google sheet in v4? Create a gmail filter with Gmail API nodejs, Error: Filter doesn't have any criteria Insufficient Permission when trying to create a folder on Google Drive via API(v3) Youtube Data API V3 - Error fetching video with google.youtube.videos.list() Google drive API - Cannot read property 'OAuth2' of undefined How to run a Google App Script using Google API Service Library (Node.js)

如果这些要点对您的情况没有帮助,我很抱歉。

【讨论】:

谢谢。 token 和 readFile 上的文件相同,将 TOKEN_PATH 更改为 ./credentials.json 改变了游戏规则。

以上是关于错误:未设置访问、刷新令牌或 API 密钥的主要内容,如果未能解决你的问题,请参考以下文章

Withings API不支持node-oauth

何时将刷新令牌传递给 API

获取访问令牌时服务帐户 API 错误

Laravel Google api 客户端获取刷新令牌并上传文件

Git push无法正常运行错误“您必须使用个人访问令牌或SSH密钥”

尝试访问我的 api 平台时未找到 JWT 令牌 401 错误?