chen-facebook
Version:
facebook for Chen Framework
87 lines • 3.5 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments)).next());
});
};
const web_1 = require('chen/web');
const core_1 = require('chen/core');
const api_1 = require('./api');
const querystring = require('querystring');
/**
* FacebookLogin class
*/
class FacebookLogin {
/**
* FacebookLogin constructor
* @param {Facebook} private fb
* @param {WebContext} private context
* @param {string} private redirectUri
*/
constructor(fb, context, redirectUri) {
this.fb = fb;
this.context = context;
let credentials = this.fb.getCredentials();
this.redirectUri = redirectUri || credentials.redirectUri;
}
/**
* Login
* @param {string} redirectUri
* @return {RedirectResponse}
*/
login() {
let credentials = this.fb.getCredentials();
let params = {
client_id: credentials.appId,
redirect_uri: this.redirectUri,
scope: credentials.scope || [],
state: Math.random().toString(36).substring(2)
};
this.context.request.session.set(this.fb.getSessionKey('state'), params.state);
return this.context.response.redirect(`https://www.facebook.com/dialog/oauth?${querystring.stringify(params)}`);
}
/**
* Create access token from redirect
* @return {string}
*/
createAccessToken() {
return __awaiter(this, void 0, void 0, function* () {
if (!(this.context instanceof web_1.Context))
return null;
let token = null;
let request = this.context.request;
let session = request.session;
let stateKey = this.fb.getSessionKey('state');
let credentials = this.fb.getCredentials();
if ((request.input.has('code') && request.input.has('state') && session.has(stateKey))
&& session.flash(stateKey) == request.input.get('state')) {
let params = {
code: request.input.get('code'),
client_id: credentials.appId,
client_secret: credentials.appSecret,
redirect_uri: this.redirectUri
};
let res = yield (new web_1.HttpClient()).get(`${api_1.FacebookApi.BASE_URL}oauth/access_token?${querystring.stringify(params)}`);
if (res.body) {
let body;
try {
body = JSON.parse(res.body);
}
catch (e) {
body = querystring.parse(res.body);
}
if (body.error) {
throw new core_1.Exception(`facebook: ${body.error.message}`);
}
token = body.access_token;
}
}
return token;
});
}
}
exports.FacebookLogin = FacebookLogin;
//# sourceMappingURL=auth.js.map