* KarlJakober-master: Add profile information and owned games to Steam template Steam API template display achievements Steam API code refactoring, added ownedGames API call removes steam auth, sets up steam api requests in async Adds Steam auth and API Conflicts: views/api/index.jade # # It looks like you may be committing a merge. # If this is not correct, please remove the file # .git/MERGE_HEAD # and try again. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # All conflicts fixed but you are still merging. # (use "git commit" to conclude merge) # # Changes to be committed: # # modified: README.md # modified: app.js # modified: config/passport.js # modified: config/secrets.js # modified: controllers/api.js # modified: models/User.js # new file: views/api/steam.jade # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: config/passport.js # modified: config/secrets.js # modified: models/User.js # modified: views/api/index.jade #
255 lines
9.8 KiB
JavaScript
Executable File
255 lines
9.8 KiB
JavaScript
Executable File
var passport = require('passport');
|
||
var LocalStrategy = require('passport-local').Strategy;
|
||
var OAuthStrategy = require('passport-oauth').OAuthStrategy;
|
||
var OAuth2Strategy = require('passport-oauth').OAuth2Strategy;
|
||
var FacebookStrategy = require('passport-facebook').Strategy;
|
||
var TwitterStrategy = require('passport-twitter').Strategy;
|
||
var GitHubStrategy = require('passport-github').Strategy;
|
||
var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
|
||
var User = require('../models/User');
|
||
var secrets = require('./secrets');
|
||
var _ = require('underscore');
|
||
|
||
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 LocalStrategy({ usernameField: 'email' }, function(email, password, done) {
|
||
User.findOne({ email: email }, function(err, user) {
|
||
if (!user) return done(null, false, { message: 'Email ' + email + ' not found'});
|
||
user.comparePassword(password, function(err, isMatch) {
|
||
if (isMatch) {
|
||
return done(null, user);
|
||
} else {
|
||
return done(null, false, { message: 'Invalid email or password.' });
|
||
}
|
||
});
|
||
});
|
||
}));
|
||
|
||
/**
|
||
* Sign in with Facebook.
|
||
*/
|
||
|
||
passport.use(new FacebookStrategy(secrets.facebook, function(req, accessToken, refreshToken, profile, done) {
|
||
if (req.user) {
|
||
User.findOne({ $or: [{ facebook: profile.id }, { email: profile.email }] }, function(err, existingUser) {
|
||
if (existingUser) {
|
||
req.flash('errors', { msg: 'There is already a Facebook account that belongs to you. Sign in with that account or delete it, then link it with your current account.' });
|
||
done(err);
|
||
} else {
|
||
User.findById(req.user.id, function(err, user) {
|
||
user.facebook = profile.id;
|
||
user.tokens.push({ kind: 'facebook', accessToken: accessToken });
|
||
user.profile.name = user.profile.name || profile.displayName;
|
||
user.profile.gender = user.profile.gender || profile._json.gender;
|
||
user.profile.picture = user.profile.picture || 'https://graph.facebook.com/' + profile.id + '/picture?type=large';
|
||
user.save(function(err) {
|
||
req.flash('info', { msg: 'Facebook account has been linked.' });
|
||
done(err, user);
|
||
});
|
||
});
|
||
}
|
||
});
|
||
} else {
|
||
User.findOne({ facebook: profile.id }, function(err, existingUser) {
|
||
console.log(profile)
|
||
if (existingUser) return done(null, existingUser);
|
||
var user = new User();
|
||
user.email = profile._json.email;
|
||
user.facebook = profile.id;
|
||
user.tokens.push({ kind: 'facebook', accessToken: accessToken });
|
||
user.profile.name = profile.displayName;
|
||
user.profile.gender = profile._json.gender;
|
||
user.profile.picture = 'https://graph.facebook.com/' + profile.id + '/picture?type=large';
|
||
user.profile.location = (profile._json.location) ? profile._json.location.name : '';
|
||
user.save(function(err) {
|
||
done(err, user);
|
||
});
|
||
});
|
||
}
|
||
}));
|
||
|
||
/**
|
||
* Sign in with GitHub.
|
||
*/
|
||
|
||
passport.use(new GitHubStrategy(secrets.github, function(req, accessToken, refreshToken, profile, done) {
|
||
if (req.user) {
|
||
User.findOne({ $or: [{ github: profile.id }, { email: profile.email }] }, function(err, existingUser) {
|
||
if (existingUser) {
|
||
req.flash('errors', { msg: 'There is already a GitHub account that belongs to you. Sign in with that account or delete it, then link it with your current account.' });
|
||
done(err);
|
||
} else {
|
||
User.findById(req.user.id, function(err, user) {
|
||
user.github = profile.id;
|
||
user.tokens.push({ kind: 'github', accessToken: accessToken });
|
||
user.profile.name = user.profile.name || profile.displayName;
|
||
user.profile.picture = user.profile.picture || profile._json.avatar_url;
|
||
user.profile.location = user.profile.location || profile._json.location;
|
||
user.profile.website = user.profile.website || profile._json.blog;
|
||
user.save(function(err) {
|
||
req.flash('info', { msg: 'GitHub account has been linked.' });
|
||
done(err, user);
|
||
});
|
||
});
|
||
}
|
||
});
|
||
} else {
|
||
User.findOne({ github: profile.id }, function(err, existingUser) {
|
||
if (existingUser) return done(null, existingUser);
|
||
var user = new User();
|
||
user.email = profile._json.email;
|
||
user.github = profile.id;
|
||
user.tokens.push({ kind: 'github', accessToken: accessToken });
|
||
user.profile.name = profile.displayName;
|
||
user.profile.picture = profile._json.avatar_url;
|
||
user.profile.location = profile._json.location;
|
||
user.profile.website = profile._json.blog;
|
||
user.save(function(err) {
|
||
done(err, user);
|
||
});
|
||
});
|
||
}
|
||
}));
|
||
|
||
/**
|
||
* Sign in with Twitter.
|
||
*/
|
||
|
||
passport.use(new TwitterStrategy(secrets.twitter, function(req, accessToken, tokenSecret, profile, done) {
|
||
if (req.user) {
|
||
User.findOne({ twitter: profile.id }, function(err, existingUser) {
|
||
if (existingUser) {
|
||
req.flash('errors', { msg: 'There is already a Twitter account that belongs to you. Sign in with that account or delete it, then link it with your current account.' });
|
||
done(err);
|
||
} else {
|
||
User.findById(req.user.id, function(err, user) {
|
||
user.twitter = profile.id;
|
||
user.tokens.push({ kind: 'twitter', accessToken: accessToken, tokenSecret: tokenSecret });
|
||
user.profile.name = user.profile.name || profile.displayName;
|
||
user.profile.location = user.profile.location || profile._json.location;
|
||
user.profile.picture = user.profile.picture || profile._json.profile_image_url;
|
||
user.save(function(err) {
|
||
req.flash('info', { msg: 'Twitter account has been linked.' });
|
||
done(err, user);
|
||
});
|
||
});
|
||
}
|
||
});
|
||
|
||
} else {
|
||
User.findOne({ twitter: profile.id }, function(err, existingUser) {
|
||
if (existingUser) return done(null, existingUser);
|
||
var user = new User();
|
||
// Twitter will not provide an email address. Period.
|
||
// But a person’s twitter username is guaranteed to be unique
|
||
// so we can "fake" a twitter email address as follows:
|
||
user.email = profile.username + "@twitter.com";
|
||
user.twitter = profile.id;
|
||
user.tokens.push({ kind: 'twitter', accessToken: accessToken, tokenSecret: tokenSecret });
|
||
user.profile.name = profile.displayName;
|
||
user.profile.location = profile._json.location;
|
||
user.profile.picture = profile._json.profile_image_url;
|
||
user.save(function(err) {
|
||
done(err, user);
|
||
});
|
||
});
|
||
}
|
||
}));
|
||
|
||
/**
|
||
* Sign in with Google.
|
||
*/
|
||
|
||
passport.use(new GoogleStrategy(secrets.google, function(req, accessToken, refreshToken, profile, done) {
|
||
if (req.user) {
|
||
User.findOne({ $or: [{ google: profile.id }, { email: profile.email }] }, function(err, existingUser) {
|
||
if (existingUser) {
|
||
req.flash('errors', { msg: 'There is already a Google account that belongs to you. Sign in with that account or delete it, then link it with your current account.' });
|
||
done(err);
|
||
} else {
|
||
User.findById(req.user.id, function(err, user) {
|
||
user.google = profile.id;
|
||
user.tokens.push({ kind: 'google', accessToken: accessToken });
|
||
user.profile.name = user.profile.name || profile.displayName;
|
||
user.profile.gender = user.profile.gender || profile._json.gender;
|
||
user.profile.picture = user.profile.picture || profile._json.picture;
|
||
user.save(function(err) {
|
||
req.flash('info', { msg: 'Google account has been linked.' });
|
||
done(err, user);
|
||
});
|
||
});
|
||
}
|
||
});
|
||
} else {
|
||
User.findOne({ google: profile.id }, function(err, existingUser) {
|
||
if (existingUser) return done(null, existingUser);
|
||
var user = new User();
|
||
user.email = profile._json.email;
|
||
user.google = profile.id;
|
||
user.tokens.push({ kind: 'google', accessToken: accessToken });
|
||
user.profile.name = profile.displayName;
|
||
user.profile.gender = profile._json.gender;
|
||
user.profile.picture = profile._json.picture;
|
||
user.save(function(err) {
|
||
done(err, user);
|
||
});
|
||
});
|
||
}
|
||
}));
|
||
|
||
passport.use('tumblr', new OAuthStrategy({
|
||
requestTokenURL: 'http://www.tumblr.com/oauth/request_token',
|
||
accessTokenURL: 'http://www.tumblr.com/oauth/access_token',
|
||
userAuthorizationURL: 'http://www.tumblr.com/oauth/authorize',
|
||
consumerKey: secrets.tumblr.consumerKey,
|
||
consumerSecret: secrets.tumblr.consumerSecret,
|
||
callbackURL: secrets.tumblr.callbackURL,
|
||
passReqToCallback: true
|
||
},
|
||
function (req, token, tokenSecret, profile, done) {
|
||
User.findById(req.user._id, function(err, user) {
|
||
user.tokens.push({ kind: 'tumblr', accessToken: token, tokenSecret: tokenSecret });
|
||
user.save(function(err) {
|
||
done(err, user);
|
||
});
|
||
});
|
||
}
|
||
));
|
||
|
||
passport.use('foursquare', new OAuth2Strategy({
|
||
authorizationURL: 'https://foursquare.com/oauth2/authorize',
|
||
tokenURL: 'https://foursquare.com/oauth2/access_token',
|
||
clientID: secrets.foursquare.clientId,
|
||
clientSecret: secrets.foursquare.clientSecret,
|
||
callbackURL: secrets.foursquare.redirectUrl,
|
||
passReqToCallback: true
|
||
},
|
||
function (req, accessToken, refreshToken, profile, done) {
|
||
User.findById(req.user._id, function(err, user) {
|
||
user.tokens.push({ kind: 'foursquare', accessToken: accessToken });
|
||
user.save(function(err) {
|
||
done(err, user);
|
||
});
|
||
});
|
||
}
|
||
));
|
||
|
||
exports.isAuthenticated = function(req, res, next) {
|
||
if (req.isAuthenticated()) return next();
|
||
res.redirect('/login');
|
||
};
|
||
|
||
exports.isAuthorized = function(req, res, next) {
|
||
var provider = req.path.split('/').slice(-1)[0];
|
||
if (_.findWhere(req.user.tokens, { kind: provider })) next();
|
||
else res.redirect('/auth/' + provider);
|
||
};
|