forked from hkpeterpeter/teamform-seed
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathapp.js
94 lines (88 loc) · 3.92 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
const fs = require('fs');
const path = require('path');
const firebase = require('firebase');
const express = require('express');
const compression = require('compression');
const bodyParser = require('body-parser');
const request = require('request');
const randomstring = require('randomstring');
const parseXML = require('xml2js').parseString;
const XMLprocessors = require('xml2js/lib/processors');
const CONFIG = require('./config.js');
const admin = require('firebase-admin');
let firebaseService = admin.initializeApp({
credential: admin.credential.cert(require('./firebase-service.json')),
databaseURL: CONFIG.FIREBASE_DATABASE
});
let firebaseClient = () => {
return firebase.initializeApp({
apiKey: CONFIG.FIREBASE_API_KEY,
databaseURL: CONFIG.FIREBASE_DATABASE
}, 'client');
};
let app = express();
app.use(compression());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: false
}));
app.use(express.static(path.join(__dirname, 'dist')));
app.post('/oauth', (req, res) => {
if (req.body.ticket && req.body.service_uri) {
new Promise((resolve, reject) => {
request.get({
url: 'https://cas.ust.hk/cas/serviceValidate?ticket=' + req.body.ticket + '&service=' + req.body.service_uri
}, (error, response, body) => {
if (error) {
return reject(error);
}
parseXML(body, {
trim: true,
normalize: true,
explicitArray: false,
tagNameProcessors: [XMLprocessors.normalize, XMLprocessors.stripPrefix]
}, (err, result) => {
if (err) {
return reject(err);
}
if (result.serviceresponse.authenticationfailure) {
return reject(new Error('CAS authentication failed (' + result.serviceresponse.authenticationfailure.$.code + ').'));
}
if (result.serviceresponse.authenticationsuccess) {
let itsc = result.serviceresponse.authenticationsuccess.user;
firebaseService.database().ref('users').orderByChild('itsc').startAt(itsc).endAt(itsc).once('value', (snap) => {
let user = snap.val();
if(!user) {
let client = firebaseClient();
client.auth().createUserWithEmailAndPassword(itsc+'@connect.ust.hk', randomstring.generate(12)).then((result) => {
client.auth().signOut();
firebaseService.database().ref('users/'+result.uid).update({itsc: itsc, email: itsc+'@connect.ust.hk', name: itsc, role: 'member', gender: 'M', createdAt: Date.now()});
firebaseService.auth().createCustomToken(result.uid).then((token) => {
return resolve({token: token});
})
}).catch((error) => {
return reject(error);
});
} else {
firebaseService.auth().createCustomToken(Object.keys(user)[0]).then((token) => {
return resolve({token: token});
});
}
});
} else {
return reject(new Error('CAS authentication failed.'));
}
});
});
}).then((result) => {
res.json(result);
}).catch((error) => {
res.status(401).json({
error: error
});
});
} else {
res.status(401).end();
}
});
app.listen(process.env.PORT || 3000);