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