artsy-passport
Version:
Wires up the common auth handlers for Artsy's [Ezel](ezeljs.com)-based apps using [passport](http://passportjs.org/).
162 lines (151 loc) • 5.93 kB
JavaScript
// Generated by CoffeeScript 1.11.1
(function() {
var _, artsyXapp, onAccessToken, opts, request;
_ = require('underscore');
request = require('superagent');
opts = require('../options');
artsyXapp = require('artsy-xapp');
this.local = function(req, username, password, done) {
return request.post(opts.ARTSY_URL + "/oauth2/access_token").set({
'User-Agent': req.get('user-agent')
}).query({
client_id: opts.ARTSY_ID,
client_secret: opts.ARTSY_SECRET,
grant_type: 'credentials',
email: username,
password: password
}).end(onAccessToken(req, done));
};
this.linkedin = function(req, token, tokenSecret, profile, done) {
var ref, ref1;
req.socialProfileEmail = profile != null ? (ref = profile.emails) != null ? (ref1 = ref[0]) != null ? ref1.value : void 0 : void 0 : void 0;
if (req.user) {
return request.post(opts.ARTSY_URL + "/api/v1/me/authentications/linkedin").set({
'User-Agent': req.get('user-agent')
}).send({
oauth_token: token,
oauth_token_secret: tokenSecret,
access_token: req.user.get('accessToken')
}).end(function(err, res) {
return done(err, req.user);
});
} else {
return request.post(opts.ARTSY_URL + "/oauth2/access_token").set({
'User-Agent': req.get('user-agent')
}).query({
client_id: opts.ARTSY_ID,
client_secret: opts.ARTSY_SECRET,
grant_type: 'oauth_token',
oauth_token: token,
oauth_token_secret: tokenSecret,
oauth_provider: 'linkedin'
}).end(onAccessToken(req, done, {
oauth_token: token,
oauth_token_secret: tokenSecret,
provider: 'linkedin'
}));
}
};
this.facebook = function(req, token, refreshToken, profile, done) {
var ref, ref1;
req.socialProfileEmail = profile != null ? (ref = profile.emails) != null ? (ref1 = ref[0]) != null ? ref1.value : void 0 : void 0 : void 0;
if (req.user) {
return request.post(opts.ARTSY_URL + "/api/v1/me/authentications/facebook").set({
'User-Agent': req.get('user-agent')
}).send({
oauth_token: token,
access_token: req.user.get('accessToken')
}).end(function(err, res) {
return done(err, req.user);
});
} else {
return request.post(opts.ARTSY_URL + "/oauth2/access_token").set({
'User-Agent': req.get('user-agent')
}).query({
client_id: opts.ARTSY_ID,
client_secret: opts.ARTSY_SECRET,
grant_type: 'oauth_token',
oauth_token: token,
oauth_provider: 'facebook'
}).end(onAccessToken(req, done, {
oauth_token: token,
provider: 'facebook',
name: profile != null ? profile.displayName : void 0
}));
}
};
this.twitter = function(req, token, tokenSecret, profile, done) {
if (req.user) {
return request.post(opts.ARTSY_URL + "/api/v1/me/authentications/twitter").set({
'User-Agent': req.get('user-agent')
}).send({
oauth_token: token,
oauth_token_secret: tokenSecret,
access_token: req.user.get('accessToken')
}).end(function(err, res) {
return done(err, req.user);
});
} else {
return request.post(opts.ARTSY_URL + "/oauth2/access_token").set({
'User-Agent': req.get('user-agent')
}).query({
client_id: opts.ARTSY_ID,
client_secret: opts.ARTSY_SECRET,
grant_type: 'oauth_token',
oauth_token: token,
oauth_token_secret: tokenSecret,
oauth_provider: 'twitter'
}).end(onAccessToken(req, done, {
oauth_token: token,
oauth_token_secret: tokenSecret,
provider: 'twitter',
email: opts.twitterSignupTempEmail(token, tokenSecret, profile),
name: profile != null ? profile.displayName : void 0
}));
}
};
onAccessToken = function(req, done, params) {
return function(err, res) {
var msg, ref, ref1;
if (err && !(res != null ? res.body : void 0) || !err && (res != null ? res.status : void 0) > 400) {
err = new Error("Gravity returned a generic " + res.status + " html page");
}
if (!err && ((res != null ? res.body.access_token : void 0) == null)) {
err = new Error("Gravity returned no access token and no error");
}
if (err != null) {
err.message = msg = (res != null ? (ref = res.body) != null ? ref.error_description : void 0 : void 0) || (res != null ? (ref1 = res.body) != null ? ref1.error : void 0 : void 0) || (res != null ? res.text : void 0) || err.stack || err.toString();
}
if (!err) {
return done(null, new opts.CurrentUser({
accessToken: res.body.access_token
}));
} else if ((params != null ? params.provider : void 0) === 'twitter' && (msg.match('no account linked') != null)) {
err = new Error("No Twitter account found, please sign up");
return done(err);
} else if (msg.match('no account linked') != null) {
req.artsyPassportSignedUp = true;
return request.post(opts.ARTSY_URL + '/api/v1/user').send(params).set({
'User-Agent': req.get('user-agent')
}).set({
'X-Xapp-Token': artsyXapp.token
}).end(function(err) {
if (err) {
return done(err);
}
return request.post(opts.ARTSY_URL + "/oauth2/access_token").set({
'User-Agent': req.get('user-agent')
}).query(_.extend(params, {
client_id: opts.ARTSY_ID,
client_secret: opts.ARTSY_SECRET,
grant_type: 'oauth_token',
oauth_provider: params.provider
})).end(onAccessToken(req, done, params));
});
} else {
console.warn("Error requesting an access token from Artsy '" + msg + "'");
return done(err);
}
};
};
}).call(this);