Skip to content

Commit 9682827

Browse files
author
Cole Johnson
committedNov 24, 2016
Facebook login works
1 parent da7e703 commit 9682827

16 files changed

+213
-17429
lines changed
 

‎.env

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
FACEBOOK_CLIENT_ID=1752159591713874
2+
FACEBOOK_CLIENT_SECRET=60bc805973bfdf0d25b40fa9091234b8
3+
FACEBOOK_CALLBACK_URL=http://127.0.0.1:8080/auth/facebook?cb

‎app.js

+14-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ var express = require('express');
22
var bodyParser = require('body-parser');
33
var mongoose = require('mongoose');
44
var logger = require('morgan');
5+
var session = require('express-session');
6+
var config = require('./config');
7+
var multer = require('multer');
8+
var cookie = require('cookie-parser');
9+
var passport = require('passport');
510
var app = express();
611

712
app.use(express.static(__dirname + '/public'));
@@ -10,8 +15,16 @@ app.use(express.static(__dirname + '/public'));
1015
// this will let us get the data from a POST
1116
app.use(bodyParser.urlencoded({ extended: true }));
1217
app.use(bodyParser.json());
18+
multer();
1319
app.use(logger('dev'));
14-
20+
app.use(session({
21+
secret: config.secret,
22+
resave: true,
23+
saveUninitialized: true
24+
}));
25+
app.use(cookie());
26+
app.use(passport.initialize());
27+
app.use(passport.session());
1528
mongoose.connect('mongodb://localhost:27017/seevee');
1629

1730
var port = process.env.PORT || 8080; // set our port

‎app/models/user.js

+6-5
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,17 @@ var UserSchema = new Schema({
55
firstName: String,
66
lastName: String,
77
email: String,
8-
98
facebook: {
109
id : String,
1110
token : String,
1211
name : String,
1312
email : String
14-
}
15-
13+
},
1614
google: {
1715
id : String,
1816
token : String,
1917
email : String
20-
}
21-
18+
},
2219
addressLine1: String,
2320
addressLine2: String,
2421
city: String,
@@ -30,4 +27,8 @@ var UserSchema = new Schema({
3027

3128
}, {collection: 'user'});
3229

30+
function findUserByFacebookId(facebookId) {
31+
return UserModel.findOne({'facebook.id': facebookId});
32+
}
33+
3334
module.exports = mongoose.model('User', UserSchema);

‎app/routes/.Rhistory

Whitespace-only changes.

‎app/routes/auth.js

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
var router = require('express').Router();
2+
var config = require('./config');
3+
var passport = require('passport');
4+
var FacebookStrategy = require('passport-facebook');
5+
var User = require('../models/user');
6+
7+
router.get('/facebook', passport.authenticate('facebook', { scope : 'email' }));
8+
router.get('/facebook/callback/',
9+
passport.authenticate('facebook', {
10+
successRedirect: '/#/',
11+
failureRedirect: '/#/login'
12+
}));
13+
14+
var facebookConfig = {
15+
clientID : 1752159591713874,
16+
clientSecret : '60bc805973bfdf0d25b40fa9091234b8',
17+
callbackURL : 'http://localhost:8080/api/auth/facebook/callback'
18+
};
19+
20+
passport.use(new FacebookStrategy(facebookConfig, facebookStrategy));
21+
passport.serializeUser(serializeUser);
22+
passport.deserializeUser(deserializeUser);
23+
24+
// Facebook
25+
function facebookStrategy(token, refreshToken, profile, done) {
26+
console.log(profile);
27+
User.findOne({'facebook.id': profile.id}).then(
28+
function(user) {
29+
if(user) {
30+
return done(null, user);
31+
} else {
32+
var names = profile.displayName.split(" ");
33+
var newFacebookUser = {
34+
lastName: names[1],
35+
firstName: names[0],
36+
email: profile.emails ? profile.emails[0].value:"",
37+
facebook: {
38+
id: profile.id,
39+
token: token
40+
}
41+
};
42+
return User.create(newFacebookUser);
43+
}
44+
},
45+
function(err) {
46+
if (err) { return done(err); }
47+
}).then(
48+
function(user){
49+
return done(null, user);
50+
},
51+
function(err){
52+
if (err) { return done(err); }
53+
}
54+
);
55+
}
56+
57+
58+
// Serialize User
59+
function serializeUser(user, done) {
60+
done(null, user);
61+
}
62+
63+
// Deserialize User
64+
function deserializeUser(user, done) {
65+
User.findById(user._id, function(err, user) {
66+
if(err) {
67+
done(err, null);
68+
} else {
69+
done(null, user);
70+
}
71+
});
72+
}
73+
74+
module.exports = router;

‎app/routes/config.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
module.exports = {
22
'facebookAuth' : {
3-
'fbAppID' = '1752159591713874',
4-
'fbAppSecret' = '60bc805973bfdf0d25b40fa9091234b8',
5-
'fbAppCallback' = 'http://localhost:3000/auth/facebook/callback';
3+
'fbAppID' : 1752159591713874,
4+
'fbAppSecret' : '60bc805973bfdf0d25b40fa9091234b8',
5+
'fbAppCallback' : 'http://localhost:8080/api/auth/facebook/callback'
66
}
7-
}
7+
};

‎app/routes/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
var router = require('express').Router();
22
router.use('/accomplishment', require('./accomplishment'));
3+
router.use('/auth', require('./auth'));
34
router.use('/renderResume', require('./renderResume'));
45
router.use('/resumeItem', require('./resumeItem'));
56
router.use('/resumeTemplate', require('./resumeTemplate'));

‎app/routes/user.js

+9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
var router = require('express').Router();
22
var User = require('../models/user');
33

4+
router.get('/loggedin',function(req, res) {
5+
res.send(req.isAuthenticated() ? req.user : '0');
6+
});
7+
48
// Creates New User
59
router.post('/', function(req, res){
610
var user = new User();
@@ -87,4 +91,9 @@ router.delete('/:user_id', function(req, res) {
8791
});
8892
});
8993

94+
router.post('/logout', function(req, res) {
95+
req.logOut();
96+
res.sendStatus(200);
97+
});
98+
9099
module.exports = router;

‎config.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
var config = {
2-
"fbAppID" = 1752159591713874,
3-
"fbAppSecret" = 60bc805973bfdf0d25b40fa9091234b8
2+
"secret": "This is secret",
3+
"fbAppID" : 1752159591713874,
4+
"fbAppSecret" : "60bc805973bfdf0d25b40fa9091234b8"
45
};
56
module.exports = config;

‎npm-debug.log

-17,403
This file was deleted.

‎package.json

+5
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,17 @@
77
},
88
"dependencies": {
99
"body-parser": "~1.15.2",
10+
"cookie-parser": "^1.4.3",
1011
"debug": "~2.2.0",
1112
"express": "~4.14.0",
13+
"express-session": "^1.14.2",
1214
"html-pdf": "^2.1.0",
1315
"moment": "^2.16.0",
1416
"mongoose": "^4.6.6",
1517
"morgan": "^1.7.0",
18+
"multer": "^1.2.0",
19+
"passport": "^0.3.2",
20+
"passport-facebook": "^2.1.1",
1621
"pug": "^2.0.0-beta6"
1722
}
1823
}

‎public/js/app.js

+63-6
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,82 @@
11
var seevee = angular.module('seevee', ['ngRoute', 'ngSanitize']);
22

3-
seevee.config(function($routeProvider) {
3+
seevee.config(function($routeProvider, $httpProvider) {
44
$routeProvider
55
.when("/", {
66
templateUrl: '../partials/partials.accomplishment.html',
7-
controller: 'accomplishmentController'
7+
controller: 'accomplishmentController',
8+
resolve: {
9+
loggedin: checkLoggedin
10+
}
811
})
912
.when("/info", {
1013
templateUrl: '../partials/partials.info.html',
11-
controller: 'infoController'
14+
controller: 'infoController',
15+
resolve: {
16+
loggedin: checkLoggedin
17+
}
1218
})
1319
.when("/resumes", {
1420
templateUrl: '../partials/partials.resume.html',
15-
controller: 'resumeController'
21+
controller: 'resumeController',
22+
resolve: {
23+
loggedin: checkLoggedin
24+
}
1625
})
1726
.when("/login", {
1827
templateUrl: '../partials/partials.login.html',
19-
controller: 'loginController'
28+
controller: 'loginController',
29+
controllerAs: 'model'
2030
})
2131
.when("/account", {
2232
templateUrl: '../partials/partials.account.html',
23-
controller: 'accountController'
33+
controller: 'accountController',
34+
resolve: {
35+
loggedin: checkLoggedin
36+
}
37+
})
38+
.otherwise({
39+
redirectTo: '/'
2440
});
2541
});
42+
43+
var checkCurrentUser = function($q, $timeout, $http, $location, $rootScope) {
44+
var deferred = $q.defer();
45+
46+
$http.get('/api/user/loggedin').success(function(user)
47+
{
48+
$rootScope.errorMessage = null;
49+
// User is Authenticated
50+
if (user !== '0')
51+
{
52+
$rootScope.currentUser = user;
53+
}
54+
deferred.resolve();
55+
});
56+
57+
return deferred.promise;
58+
};
59+
60+
var checkLoggedin = function($q, $timeout, $http, $location, $rootScope) {
61+
var deferred = $q.defer();
62+
63+
$http.get('/api/user/loggedin').success(function(user)
64+
{
65+
$rootScope.errorMessage = null;
66+
// User is Authenticated
67+
if (user !== '0')
68+
{
69+
$rootScope.currentUser = user;
70+
deferred.resolve();
71+
}
72+
// User is Not Authenticated
73+
else
74+
{
75+
$rootScope.errorMessage = 'You need to log in.';
76+
deferred.reject();
77+
$location.url('/login');
78+
}
79+
});
80+
81+
return deferred.promise;
82+
};

‎public/js/controllers/controllers.header.js

+14-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
seevee.controller("headerCtrl", ['$scope', '$location', '$window',
2-
function($scope, $location, $window) {
1+
seevee.controller("headerCtrl", ['$scope', '$location', '$window', '$http',
2+
function($scope, $location, $window, $http) {
33
$scope.path = $location.$$path;
44
assignClasses();
55

@@ -9,6 +9,11 @@ seevee.controller("headerCtrl", ['$scope', '$location', '$window',
99
$location.path(location);
1010
};
1111

12+
$scope.logout = function() {
13+
$http.post("/api/user/logout");
14+
$location.url('/login');
15+
};
16+
1217
function assignClasses() {
1318
if($scope.path == '/') {
1419
$scope.accomplishmentClass = 'nav-selected';
@@ -61,5 +66,12 @@ seevee.controller("headerCtrl", ['$scope', '$location', '$window',
6166
$("#account-nav-button").mouseleave(function(){
6267
$("#account-nav-label").hide();
6368
});
69+
70+
$("#log-out-nav-button").mouseenter(function(){
71+
$("#log-out-nav-label").show();
72+
});
73+
$("#log-out-nav-button").mouseleave(function(){
74+
$("#log-out-nav-label").hide();
75+
});
6476
}
6577
]);

‎public/js/controllers/controllers.resume.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
seevee.controller("resumeController", ['$scope', '$location', '$http', '$sce', '$q', '$interpolate',
2-
function($scope, $location, $http, $sce, $interpolate, $q) {
1+
seevee.controller("resumeController", //['$scope', '$rootScope', '$location', '$http', '$sce', '$q', '$interpolate',
2+
function($scope, $location, $http, $sce, $interpolate, $q, $rootScope) {
33
$scope.items = {};
44
$scope.templates = {};
55

66
// Temporary data for testing resumes
7-
$scope.firstName = "John";
8-
$scope.lastName = "Appleseed";
7+
$scope.firstName = $rootScope.currentUser.firstName;
8+
$scope.lastName = $rootScope.currentUser.lastName;
99

1010
// Gets all the resume data
1111
$scope.getItems = function() {
@@ -47,4 +47,4 @@ seevee.controller("resumeController", ['$scope', '$location', '$http', '$sce', '
4747
$scope.getItems();
4848

4949
}
50-
]);
50+
);

‎public/partials/partials.login.html

+5-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,5 @@
1-
{{title}}
1+
<a href="api/auth/facebook"
2+
class="btn btn-primary btn-block">
3+
<span class="fa fa-facebook"></span>
4+
Facebook
5+
</a>

‎public/partials/partials.nav.html

+7
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,11 @@
3030
<div class="nav-label small-caps-light" id="account-nav-label">
3131
Account
3232
</div>
33+
34+
<div class="nav-button" ng-click="logout()" id="log-out-nav-button">
35+
<i class="fa fa-sign-out fa-lg" aria-hidden="true"></i>
36+
</div>
37+
<div class="nav-label small-caps-light" id="log-out-nav-label">
38+
Signout
39+
</div>
3340
</div>

0 commit comments

Comments
 (0)
Please sign in to comment.