oauth-io/sdk-node

TypeError: Cannot read property 'google' of undefined

Closed this issue · 2 comments

I'm trying to authenticate my app with oauth-phonegap, and that seems to work, but I need to send the code to my server. That's where I'm having problems. Here's the error:

root@example:~/example-api# node index
Express server listening on port 3000 in development mode
GET /oauth/token 200 22.302 ms - 26

req.session:  { cookie:
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  passport: {} }

code:  IM676Ffknwwzz6rEc6BOPNy5bcV

TypeError: Cannot read property 'google' of undefined
  at Object.a.auth (/root/example-api/node_modules/oauthio/js/lib/authentication.js:86:26)
  at Object.oauth.auth (/root/example-api/node_modules/oauthio/js/main.js:84:31)
  at module.exports (/root/example-api/app/server.js:83:11)
  at Layer.handle [as handle_request] (/root/example-api/node_modules/express/lib/router/layer.js:82:5)
  at next (/root/example-api/node_modules/express/lib/router/route.js:110:13)
  at Route.dispatch (/root/example-api/node_modules/express/lib/router/route.js:91:3)
  at Layer.handle [as handle_request] (/root/example-api/node_modules/express/lib/router/layer.js:82:5)
  at /root/example-api/node_modules/express/lib/router/index.js:267:22
  at Function.proto.process_params (/root/example-api/node_modules/express/lib/router/index.js:321:12)
  at next (/root/example-api/node_modules/express/lib/router/index.js:261:10)
  at serveStatic (/root/example-api/node_modules/express/node_modules/serve-static/index.js:59:14)
  at Layer.handle [as handle_request] (/root/example-api/node_modules/express/lib/router/layer.js:82:5)
  at trim_prefix (/root/example-api/node_modules/express/lib/router/index.js:302:13)
  at /root/example-api/node_modules/express/lib/router/index.js:270:7
  at Function.proto.process_params (/root/example-api/node_modules/express/lib/router/index.js:321:12)
  at next (/root/example-api/node_modules/express/lib/router/index.js:261:10)
  at /root/example-api/node_modules/express-flash/lib/express-flash.js:31:7
  at /root/example-api/node_modules/express-flash/node_modules/connect-flash/lib/flash.js:21:5
  at /root/example-api/node_modules/express-flash/lib/express-flash.js:22:5
  at Layer.handle [as handle_request] (/root/example-api/node_modules/express/lib/router/layer.js:82:5)
  at trim_prefix (/root/example-api/node_modules/express/lib/router/index.js:302:13)
  at /root/example-api/node_modules/express/lib/router/index.js:270:7
  at Function.proto.process_params (/root/example-api/node_modules/express/lib/router/index.js:321:12)
  at next (/root/example-api/node_modules/express/lib/router/index.js:261:10)
  at SessionStrategy.strategy.pass (/root/example-api/node_modules/passport/lib/middleware/authenticate.js:318:9)
  at SessionStrategy.authenticate (/root/example-api/node_modules/passport/lib/strategies/session.js:67:10)
  at attempt (/root/example-api/node_modules/passport/lib/middleware/authenticate.js:341:16)
  at authenticate (/root/example-api/node_modules/passport/lib/middleware/authenticate.js:342:7)
  at Layer.handle [as handle_request] (/root/example-api/node_modules/express/lib/router/layer.js:82:5)
  at trim_prefix (/root/example-api/node_modules/express/lib/router/index.js:302:13)
  at /root/example-api/node_modules/express/lib/router/index.js:270:7
  at Function.proto.process_params (/root/example-api/node_modules/express/lib/router/index.js:321:12)
  at next (/root/example-api/node_modules/express/lib/router/index.js:261:10)
  at initialize (/root/example-api/node_modules/passport/lib/middleware/initialize.js:62:5)
  at Layer.handle [as handle_request] (/root/example-api/node_modules/express/lib/router/layer.js:82:5)
  at trim_prefix (/root/example-api/node_modules/express/lib/router/index.js:302:13)
  at /root/example-api/node_modules/express/lib/router/index.js:270:7
  at Function.proto.process_params (/root/example-api/node_modules/express/lib/router/index.js:321:12)
  at next (/root/example-api/node_modules/express/lib/router/index.js:261:10)
  at session (/root/example-api/node_modules/express-session/index.js:386:7)
  at Layer.handle [as handle_request] (/root/example-api/node_modules/express/lib/router/layer.js:82:5)
  at trim_prefix (/root/example-api/node_modules/express/lib/router/index.js:302:13)
  at /root/example-api/node_modules/express/lib/router/index.js:270:7
  at Function.proto.process_params (/root/example-api/node_modules/express/lib/router/index.js:321:12)
  at next (/root/example-api/node_modules/express/lib/router/index.js:261:10)
  at cookieParser (/root/example-api/node_modules/cookie-parser/index.js:34:14)
  at Layer.handle [as handle_request] (/root/example-api/node_modules/express/lib/router/layer.js:82:5)
  at trim_prefix (/root/example-api/node_modules/express/lib/router/index.js:302:13)
  at /root/example-api/node_modules/express/lib/router/index.js:270:7
  at Function.proto.process_params (/root/example-api/node_modules/express/lib/router/index.js:321:12)
  at next (/root/example-api/node_modules/express/lib/router/index.js:261:10)
  at methodOverride (/root/example-api/node_modules/method-override/index.js:77:5)
  at Layer.handle [as handle_request] (/root/example-api/node_modules/express/lib/router/layer.js:82:5)
  at trim_prefix (/root/example-api/node_modules/express/lib/router/index.js:302:13)
  at /root/example-api/node_modules/express/lib/router/index.js:270:7
  at Function.proto.process_params (/root/example-api/node_modules/express/lib/router/index.js:321:12)
  at next (/root/example-api/node_modules/express/lib/router/index.js:261:10)
  at /root/example-api/node_modules/express-validator/lib/express_validator.js:233:12
  at Layer.handle [as handle_request] (/root/example-api/node_modules/express/lib/router/layer.js:82:5)
  at trim_prefix (/root/example-api/node_modules/express/lib/router/index.js:302:13)
  at /root/example-api/node_modules/express/lib/router/index.js:270:7
  at Function.proto.process_params (/root/example-api/node_modules/express/lib/router/index.js:321:12)
  at next (/root/example-api/node_modules/express/lib/router/index.js:261:10)
  at /root/example-api/node_modules/multer/index.js:218:19
  at Layer.handle [as handle_request] (/root/example-api/node_modules/express/lib/router/layer.js:82:5)
  at trim_prefix (/root/example-api/node_modules/express/lib/router/index.js:302:13)
  at /root/example-api/node_modules/express/lib/router/index.js:270:7
  at Function.proto.process_params (/root/example-api/node_modules/express/lib/router/index.js:321:12)
  at next (/root/example-api/node_modules/express/lib/router/index.js:261:10)
  at urlencodedParser (/root/example-api/node_modules/body-parser/lib/types/urlencoded.js:77:44)
  at Layer.handle [as handle_request] (/root/example-api/node_modules/express/lib/router/layer.js:82:5)
  at trim_prefix (/root/example-api/node_modules/express/lib/router/index.js:302:13)
  at /root/example-api/node_modules/express/lib/router/index.js:270:7
  at Function.proto.process_params (/root/example-api/node_modules/express/lib/router/index.js:321:12)
  at next (/root/example-api/node_modules/express/lib/router/index.js:261:10)
  at /root/example-api/node_modules/body-parser/lib/read.js:111:5
  at IncomingMessage.onEnd (/root/example-api/node_modules/body-parser/node_modules/raw-body/index.js:136:7)
  at IncomingMessage.g (events.js:180:16)
  at IncomingMessage.EventEmitter.emit (events.js:92:17)
  at _stream_readable.js:920:16
  at process._tickCallback (node.js:415:13)

POST /oauth/signin 500 40.794 ms - -

Here's the server code:

  var MongoStore, app, bodyParser, compress, connectAssets, cookieParser, errorHandler, express, expressValidator, flash, logger, methodOverride, mongoose, multer, oauth, passport, passportConf, path, secrets, session;

  express = require('express');
  cookieParser = require('cookie-parser');
  compress = require('compression');
  session = require('express-session');
  bodyParser = require('body-parser');
  logger = require('morgan');
  errorHandler = require('errorhandler');
  methodOverride = require('method-override');
  multer = require('multer');
  MongoStore = require('connect-mongo')(session);
  flash = require('express-flash');
  path = require('path');
  mongoose = require('mongoose');
  passport = require('passport');
  expressValidator = require('express-validator');
  connectAssets = require('connect-assets');
  oauth = require('oauthio');
  secrets = require('./config/secrets');
  passportConf = require('./config/passport');
  app = express();
  mongoose.connect(secrets.db);

  mongoose.connection.on('error', function() {
    console.error('MongoDB Connection Error. Please make sure that MongoDB is running.');
  });

  app.set('port', process.env.PORT || 3000);
  app.set('views', path.join(__dirname, 'views'));
  app.set('view engine', 'jade');

  app.use(compress());
  app.use(connectAssets({
    paths: [path.join(__dirname, 'public/css'),
    path.join(__dirname, 'public/js')]
  }));

  app.use(logger('dev'));
  app.use(bodyParser.json());

  app.use(bodyParser.urlencoded({
    extended: false
  }));

  app.use(multer({
    dest: path.join(__dirname, 'uploads')
  }));

  app.use(expressValidator());
  app.use(methodOverride());
  app.use(cookieParser('secret'));

  app.use(session({
    resave: true,
    saveUninitialized: true,
    secret: secrets.sessionSecret,
    store: new MongoStore({
      url: secrets.db,
      autoReconnect: true
    })
  }));

  app.use(passport.initialize());
  app.use(passport.session());
  app.use(flash());

  app.use(express["static"](path.join(__dirname, 'public'), {
    maxAge: 31557600000
  }));

  app.get('/oauth/token', function(req, res) {
    var token = oauth.generateStateToken(req.session);
    return res.send(token);
  });

  app.post("/oauth/signin", function(req, res) {
    var code = req.body.data;
    console.log("\n req.session: ", req.session + "\n");
    oauth.auth("google", req.session, console.log("code: ", req.body.data + "\n"), {
      code: code // right after this is where we have problems
    }).then(function(request_object) {
      debugger;
      return res.send(200, "The user is authenticated");
    }).fail(function(e) {
      debugger;
      console.log(e);
      return res.send(400, "Code is incorrect");
    });
    return res.redirect(req.session.returnTo || '/');
  });

  app.use(errorHandler());

  app.listen(app.get("port"), function() {
    console.log("Express server listening on port %d in %s mode", app.get("port"), app.get("env"));
  });

  module.exports = app;

And in case anyone cares, here's the client side controller:

  var app = angular.module('app');

  app.controller('LoginCtrl', function($scope, $state, UserService, $http, $cookies) {
    // initialize oauth with our app id: success
    OAuth.initialize('LONG_STRING');
    var token = null;
    // retrieve token from server: success
    $http.get('http://api.example.com/oauth/token').success(function(generatedToken, status) {
      return token = generatedToken;
    }).error(function(errorMessage, status) {
      return console.log("error at LoginCtrl initiation\n " + status + ": " + errorMessage);
    });

    // called when user clicks the google login button
    $scope.googleLogin = function() {
      return OAuth.popup('google', {
        cache: false,
        state: token
      }).done(function(result) {
        // we make it all the way here, but this is as far as our journey takes us
        return $http.post("http://api.example.com/oauth/signin", {
          data: result.code
        }).success(function(data, status) {
          debugger;
        }).error(function(data, status) {
          debugger;
        });
      }).fail(function(error) {
        return console.log('error: ', error);
      });
    };

I'm not really sure what the error means, and I was hoping someone could offer some guidance.

@mzarella Not sure if this can be the issue but:

https://github.com/oauth-io/sdk-node#auth-method

The auth method should be used as oauth.auth("google", req.session, {}).then(...);

it looks like you are inserting a console.log function where the options should be in the auth function.

@brutalhonesty I feel silly for causing another error when trying to debug the first error. I guess it's caused from trying to figure this out all morning and becoming careless / tired.

I inserted that console.log statement after receiving the original error text: 'Error: State is not matching' } which was and still is coming up when I execute oauth.auth("google", req.session, {code: code}). I guess this is no longer valid, and I'll carry the conversation to #8. Thanks @brutalhonesty