Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用现有凭据向youtube数据api发出请求_Node.js_Youtube Api_Youtube Data Api - Fatal编程技术网

Node.js 使用现有凭据向youtube数据api发出请求

Node.js 使用现有凭据向youtube数据api发出请求,node.js,youtube-api,youtube-data-api,Node.js,Youtube Api,Youtube Data Api,我正在尝试向youtube数据API发出授权请求,以获取有关用户活动和订阅的信息。在我的应用程序中,我使用。因此,我已经拥有访问用户数据所需的授权令牌。对我来说,如果我已经有了用户凭据,我还不清楚应该如何使用youtube API。这是我的心路历程和奋斗之处: 使用passportjs获取用户凭据(令牌) 使用youtube数据API或任何其他请求库向youtube数据API发出“手动”请求: const baseUri = "https://www.googleapis.com/youtube

我正在尝试向youtube数据API发出授权请求,以获取有关用户活动和订阅的信息。在我的应用程序中,我使用。因此,我已经拥有访问用户数据所需的授权令牌。对我来说,如果我已经有了用户凭据,我还不清楚应该如何使用youtube API。这是我的心路历程和奋斗之处:

  • 使用passportjs获取用户凭据(令牌)

  • 使用youtube数据API或任何其他请求库向youtube数据API发出“手动”请求:

    const baseUri = "https://www.googleapis.com/youtube/v3/subscriptions";
    const opts = {
      params: {
        part: "snippet",
        mine: true,
        fields: "items(snippet(title%2C+channelId%2Cthumbnails%2Fdefault%2Furl))",
        key: youtubeAuth.clientID,
        access_token: user.youtube.token
      }
    }
    
    return axios.get(baseUri, opts)
      .then(response => {
        console.log(response);
      })
      .catch(err => {
        console.log(err);
      });
    
  • 我的关键参数如下所示:

    857220510254-q8pkdd9ugp2be167s5ged7ave4pqa5rn.apps.googleusercontent.com
    
    代币看起来像这样

    ya29.GlttZIaiVLxzaZDu-5-KTd5jRHhqh684Q4PFoUF3_72D9Ig0uz9CyrLwnotKMOUcnZ93kTVoYH5Bc6WCfUS1tNY5DbEMDN7nCeiUMU9vmkQWLTUAaKVS3A7XhB65
    
    这似乎不是正确的做法,因为我不断收到401错误:

    {
        "error": {
            "errors": [
                {
                    "domain": "global",
                    "reason": "authError",
                    "message": "Invalid Credentials",
                    "locationType": "header",
                    "location": "Authorization"
                }
            ],
            "code": 401,
            "message": "Invalid Credentials"
        }
    }
    

    甚至可以这样做吗?或者我必须使用google SDK,如图所示?

    要进行google API调用,建议使用官方的google库:

    您可以通过以下方式请求Youtube订阅:

    var google = require('googleapis'),
        OAuth2 = google.auth.OAuth2;
    
    // ....
    
    var oauth2Client = new OAuth2(
        config.clientID,
        config.clientSecret,
        config.callbackURL
    );
    
    oauth2Client.credentials = {
        access_token: req.user.access_token,
        refresh_token: req.user.refresh_token
    };
    
    var youtube = google.youtube({
        version: 'v3',
        auth: oauth2Client
    });
    
    youtube.subscriptions.list({
        part: 'snippet',
        mine: true,
        headers: {}
    }, function(err, data, response) {
        console.log(data);
    });
    
    以下是使用和的完整示例:

    要运行此示例,您应该在google控制台中安装:

    • javascript源代码:
      http://localhost:8080
    • 重定向URI:
      http://localhost:8080/auth/google/callback
    请注意,您还可以使用而不是

    var app = require('express')(),
        passport = require('passport'),
        YoutubeV3Strategy = require('passport-youtube-v3').Strategy,
        mongoose = require('mongoose'),
        google = require('googleapis'),
        OAuth2 = google.auth.OAuth2,
        session = require('express-session');
    
    var config = {
        clientID: 'CLIENT_ID',
        clientSecret: 'CLIENT_SECRET',
        callbackURL: 'http://localhost:8080/auth/google/callback'
    };
    
    var db = mongoose.connect("mongodb://localhost:27017/testDB");
    
    var userSchema = new mongoose.Schema({
        _id: { type: String, unique: true },
        access_token: String,
        refresh_token: String,
        name: String
    }, { collection: "user" });
    
    var User = db.model('User', userSchema);
    
    passport.serializeUser(function(user, done) {
        done(null, user._id);
    });
    
    passport.deserializeUser(function(id, done) {
        User.findById(id, function(err, user) {
            done(err, user);
        });
    });
    
    passport.use(new YoutubeV3Strategy({
            clientID: config.clientID,
            clientSecret: config.clientSecret,
            callbackURL: config.callbackURL,
            scope: ['https://www.googleapis.com/auth/youtube.readonly']
        },
        function(accessToken, refreshToken, profile, done) {
    
            process.nextTick(function() {
    
                User.findOne({ _id: profile.id }, function(err, res) {
                    if (err)
                        return done(err);
                    if (res) {
                        console.log("user exists");
                        return done(null, res);
                    } else {
                        console.log("insert user");
                        var user = new User({
                            _id: profile.id,
                            access_token: accessToken,
                            refresh_token: refreshToken,
                            name: profile.displayName
                        });
                        user.save(function(err) {
                            if (err)
                                return done(err);
                            return done(null, user);
                        });
                    }
                })
            });
        }
    ));
    
    function userLogged(req, res, next) {
        if (req.isAuthenticated())
            return next();
        res.redirect('/auth/google');
    }
    
    app.use(session({ secret: 'somesecret' }));
    app.use(passport.initialize());
    app.use(passport.session());
    
    app.get('/auth/google', passport.authenticate('youtube'));
    
    app.get('/auth/google/callback',
        passport.authenticate('youtube', {
            successRedirect: '/profile',
            failureRedirect: '/'
        }));
    
    app.get('/profile', userLogged, function(req, res) {
    
        var oauth2Client = new OAuth2(
            config.clientID,
            config.clientSecret,
            config.callbackURL
        );
    
        oauth2Client.credentials = {
            access_token: req.user.access_token,
            refresh_token: req.user.refresh_token
        };
    
        google.youtube({
            version: 'v3',
            auth: oauth2Client
        }).subscriptions.list({
            part: 'snippet',
            mine: true,
            headers: {}
        }, function(err, data, response) {
            if (err) {
                console.error('Error: ' + err);
                res.json({
                    status: "error"
                });
            }
            if (data) {
                console.log(data);
                res.json({
                    status: "ok",
                    data: data
                });
            }
            if (response) {
                console.log('Status code: ' + response.statusCode);
            }
        });
    });
    
    app.listen(8080)
    
    console.log('go to http://localhost:8080/auth/google')