Skip to content

Commit 1c19264

Browse files
committed
feat(auth): add OIDC database handler and endpoint
1 parent d157d96 commit 1c19264

File tree

6 files changed

+141
-5
lines changed

6 files changed

+141
-5
lines changed

package-lock.json

Lines changed: 79 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
"passport": "^0.7.0",
6464
"passport-activedirectory": "^1.0.4",
6565
"passport-local": "^1.0.0",
66+
"passport-openidconnect": "^0.1.2",
6667
"perfect-scrollbar": "^1.5.5",
6768
"prop-types": "15.8.1",
6869
"react": "^16.13.1",

src/db/file/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ module.exports.canUserCancelPush = pushes.canUserCancelPush;
1212
module.exports.canUserApproveRejectPush = pushes.canUserApproveRejectPush;
1313

1414
module.exports.findUser = users.findUser;
15+
module.exports.findUserByOIDC = users.findUserByOIDC;
1516
module.exports.getUsers = users.getUsers;
1617
module.exports.createUser = users.createUser;
1718
module.exports.deleteUser = users.deleteUser;

src/db/file/users.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,22 @@ exports.findUser = function (username) {
2222
});
2323
};
2424

25+
exports.findUserByOIDC = function (oidcId) {
26+
return new Promise((resolve, reject) => {
27+
db.findOne({ oidcId: oidcId }, (err, doc) => {
28+
if (err) {
29+
reject(err);
30+
} else {
31+
if (!doc) {
32+
resolve(null);
33+
} else {
34+
resolve(doc);
35+
}
36+
}
37+
});
38+
});
39+
};
40+
2541
exports.createUser = function (data) {
2642
return new Promise((resolve, reject) => {
2743
db.insert(data, (err) => {

src/db/index.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,30 @@ if (config.getDatabase().type === 'mongo') {
77
sink = require('../db/file');
88
}
99

10-
module.exports.createUser = async (username, password, email, gitAccount, admin = false) => {
10+
module.exports.createUser = async (
11+
username,
12+
password,
13+
email,
14+
gitAccount,
15+
admin = false,
16+
oidcId = null,
17+
) => {
1118
console.log(
1219
`creating user
1320
user=${username},
1421
gitAccount=${gitAccount}
1522
email=${email},
16-
admin=${admin}`,
23+
admin=${admin}
24+
oidcId=${oidcId}`,
1725
);
1826

1927
const data = {
2028
username: username,
21-
password: await bcrypt.hash(password, 10),
29+
password: oidcId ? null : await bcrypt.hash(password, 10),
2230
gitAccount: gitAccount,
2331
email: email,
2432
admin: admin,
33+
oidcId: oidcId,
2534
};
2635

2736
if (username === undefined || username === null || username === '') {
@@ -56,6 +65,7 @@ module.exports.getPushes = sink.getPushes;
5665
module.exports.writeAudit = sink.writeAudit;
5766
module.exports.getPush = sink.getPush;
5867
module.exports.findUser = sink.findUser;
68+
module.exports.findUserByOIDC = sink.findUserByOIDC;
5969
module.exports.getUsers = sink.getUsers;
6070
module.exports.deleteUser = sink.deleteUser;
6171
module.exports.updateUser = sink.updateUser;

src/service/routes/auth.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ const router = new express.Router();
33
const passport = require('../passport').getPassport();
44
const db = require('../../db');
55
const passportType = passport.type;
6+
const { GIT_PROXY_UI_HOST: uiHost = 'http://localhost', NODE_ENV } = process.env;
7+
8+
// TODO: Refactor this through proper .env loading. This handles redirects in dev.
9+
let uiPort = 3000;
10+
if (NODE_ENV === 'production') {
11+
uiPort = process.env.GIT_PROXY_UI_PORT;
12+
}
613

714
router.get('/', (req, res) => {
815
res.status(200).json({
@@ -41,6 +48,30 @@ router.post('/login', passport.authenticate(passportType), async (req, res) => {
4148
}
4249
});
4350

51+
router.get('/oidc', passport.authenticate(passportType));
52+
53+
router.get('/oidc/callback', (req, res, next) => {
54+
passport.authenticate(passportType, (err, user, info) => {
55+
console.log('authenticate callback executed');
56+
if (err) {
57+
console.error('Authentication error:', err);
58+
return res.status(401).end();
59+
}
60+
if (!user) {
61+
console.error('No user found:', info);
62+
return res.status(401).end();
63+
}
64+
req.logIn(user, (err) => {
65+
if (err) {
66+
console.error('Login error:', err);
67+
return res.status(401).end();
68+
}
69+
console.log('Logged in successfully. User:', user);
70+
return res.redirect(`${uiHost}:${uiPort}/admin/profile`);
71+
});
72+
})(req, res, next);
73+
});
74+
4475
// when login is successful, retrieve user info
4576
router.get('/success', (req, res) => {
4677
console.log('authenticated' + JSON.stringify(req.user));

0 commit comments

Comments
 (0)