Skip to content
This repository was archived by the owner on Feb 25, 2019. It is now read-only.

Commit ec73dd6

Browse files
Merge pull request #245 from anvilresearch/vsimonian-saml-2.0
Implement SAML 2.0 protocol support
2 parents 28d9695 + 7c5419b commit ec73dd6

File tree

6 files changed

+108
-3
lines changed

6 files changed

+108
-3
lines changed

lib/authenticator.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ function dispatch (provider, req, res, next, options, callback) {
7878

7979
if (!callback && typeof options === 'function') {
8080
callback = options
81-
options = undefined
81+
options = {}
8282
}
8383

8484
var strategy = Object.create(baseStrategy)

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@
123123
"passport-ldapauth": "^0.3.0",
124124
"passport-local": "~1.0.0",
125125
"passport-openid": "^0.4.0",
126+
"passport-saml": "^0.13.0",
126127
"passport-strategy": "~1.0.0",
127128
"qs": "^5.0.0",
128129
"revalidator": "^0.3.1",

protocols/SAML2.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* Module dependencies
3+
*/
4+
5+
var fs = require('fs')
6+
var SAMLStrategy = require('passport-saml').Strategy
7+
var User = require('../models/User')
8+
9+
/**
10+
* Verifier
11+
*/
12+
13+
function verifier (provider, configuration) {
14+
return function (req, user, done) {
15+
user.id = user[provider.mapping.id]
16+
console.log(user, user.getAssertionXml())
17+
User.connect(req, null, user, done)
18+
}
19+
}
20+
21+
/**
22+
* Initialize
23+
*/
24+
25+
function initialize (provider, configuration) {
26+
configuration.passReqToCallback = true
27+
configuration.path = provider.callbackUrl
28+
configuration.callbackUrl = provider.callbackUrl
29+
30+
if (typeof configuration.cert === 'string') {
31+
try {
32+
configuration.cert = fs.readFileSync(configuration.cert, 'utf-8')
33+
} catch (err) {}
34+
}
35+
36+
return new SAMLStrategy(configuration, verifier(provider, configuration))
37+
}
38+
39+
/**
40+
* Exports
41+
*/
42+
43+
module.exports = {
44+
verifier: verifier,
45+
initialize: initialize
46+
}

providers/SAML2.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/**
2+
* SAML 2.0
3+
*/
4+
5+
module.exports = function (config) {
6+
return {
7+
id: 'SAML2',
8+
name: 'SAML2',
9+
templates: ['SAML2']
10+
}
11+
}

providers/templates/SAML2.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* Basic SAML 2.0 provider template
3+
*/
4+
5+
module.exports = function (config, templateConfig) {
6+
return {
7+
id: 'SAML2',
8+
protocol: 'SAML2',
9+
callbackUrl: config.issuer + '/connect/SAML2/callback',
10+
mapping: {
11+
id: 'uid',
12+
email: 'email',
13+
name: 'cn',
14+
givenName: 'givenName',
15+
familyName: 'sn',
16+
phoneNumber: 'telephoneNumber',
17+
address: function (info) {
18+
return {
19+
formatted: info.postalAddress,
20+
street_address: info.street,
21+
locality: info.l,
22+
region: info.st,
23+
postal_code: info.postalCode,
24+
country: info.co
25+
}
26+
}
27+
}
28+
}
29+
}

routes/connect.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,24 @@
44

55
var settings = require('../boot/settings')
66
var oidc = require('../oidc')
7+
var mailer = require('../boot/mailer').getMailer()
78
var authenticator = require('../lib/authenticator')
89
var qs = require('qs')
910
var NotFoundError = require('../errors/NotFoundError')
11+
var providers = require('../providers')
12+
13+
var providerInfo = {}
14+
var providerNames = Object.keys(providers)
15+
for (var i = 0; i < providerNames.length; i++) {
16+
providerInfo[providerNames[i]] = providers[providerNames[i]]
17+
}
18+
var visibleProviders = {}
19+
// Only render providers that are not marked as hidden
20+
Object.keys(settings.providers).forEach(function (providerID) {
21+
if (!settings.providers[providerID].hidden) {
22+
visibleProviders[providerID] = settings.providers[providerID]
23+
}
24+
})
1025

1126
/**
1227
* Third Party Provider Authorization Endpoints
@@ -59,8 +74,10 @@ module.exports = function (server) {
5974
res.render('signin', {
6075
params: qs.stringify(req.connectParams),
6176
request: req.body,
62-
providers: info.providers,
63-
error: info.message
77+
error: info.message,
78+
providers: visibleProviders,
79+
providerInfo: providerInfo,
80+
mailSupport: !!(mailer.transport)
6481
})
6582

6683
// login the user
@@ -88,6 +105,7 @@ module.exports = function (server) {
88105
}
89106

90107
server.get('/connect/:provider/callback', handler)
108+
server.post('/connect/:provider/callback', handler)
91109

92110
/**
93111
* Revoke Third Party Authorization

0 commit comments

Comments
 (0)