Skip to content
GitLab
    • Explore Projects Groups Snippets
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Sign in
  • S Spacedeck-open-SAML
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Locked Files
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Service Desk
    • Milestones
    • Requirements
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
    • Test Cases
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Code review
    • Insights
    • Issue
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • Wolfgang Knopki
  • Spacedeck-open-SAML
  • Merge requests
  • !1
An error occurred while fetching the assigned milestone of the selected merge_request.

Saml integration

  • Review changes

  • Download
  • Email patches
  • Plain diff
Merged Wolfgang Knopki requested to merge saml-integration into mnt 4 years ago
  • Overview 0
  • Commits 3
  • Pipelines 1
  • Changes 5

Implemented Authentication using saml only.

  • Wolfgang Knopki @knopkiwg mentioned in commit fff0340f 4 years ago

    mentioned in commit fff0340f

  • Wolfgang Knopki @knopkiwg merged 4 years ago

    merged

  • Loading
  • You're only seeing other activity in the feed. To add a comment, switch to one of the following options.
Please register or sign in to reply
Compare
  • mnt (base)

and
  • latest version
    9d956240
    3 commits, 4 years ago

5 files
+ 172
- 7

    Preferences

    File browser
    Compare changes
con‎fig‎
defaul‎t.json‎ +5 -1
rou‎tes‎
a‎pi‎
sessi‎ons.js‎ +1 -0
roo‎t.js‎ +155 -4
packag‎e.json‎ +3 -0
spaced‎eck.js‎ +8 -2
config/default.json
+ 5
- 1
  • View file @ 9d956240

  • Edit in single-file editor

  • Open in Web IDE


@@ -29,5 +29,9 @@
@@ -29,5 +29,9 @@
"mail_smtp_secure": true,
"mail_smtp_secure": true,
"mail_smtp_require_tls": true,
"mail_smtp_require_tls": true,
"mail_smtp_user": "your.smtp.user",
"mail_smtp_user": "your.smtp.user",
"mail_smtp_pass": "your.secret.smtp.password"
"mail_smtp_pass": "your.secret.smtp.password",
 
 
"path" : "http://localhost:9666/saml/SSO",
 
"entryPoint" : "https://m4lab.hft-stuttgart.de/idp/saml2/idp/SSOService.php",
 
"issuer" : "spacedeck.m4lab.hft-stuttgart.de"
}
}
routes/api/sessions.js
+ 1
- 0
  • View file @ 9d956240

  • Edit in single-file editor

  • Open in Web IDE


@@ -57,6 +57,7 @@ router.post('/', function(req, res) {
@@ -57,6 +57,7 @@ router.post('/', function(req, res) {
});
});
});
});
 
router.delete('/current', function(req, res, next) {
router.delete('/current', function(req, res, next) {
if (req.user) {
if (req.user) {
var token = req.cookies['sdsession'];
var token = req.cookies['sdsession'];
routes/root.js
+ 155
- 4
  • View file @ 9d956240

  • Edit in single-file editor

  • Open in Web IDE


@@ -9,11 +9,155 @@ const router = express.Router();
@@ -9,11 +9,155 @@ const router = express.Router();
const mailer = require('../helpers/mailer');
const mailer = require('../helpers/mailer');
const _ = require('underscore');
const _ = require('underscore');
 
const fs = require('fs')
 
const SamlStrategy = require('passport-saml').Strategy
 
const passport = require('passport')
 
const Saml2js = require('saml2js');
 
const db = require('../models/db');
const db = require('../models/db');
const Sequelize = require('sequelize');
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
const Op = Sequelize.Op;
const uuidv4 = require('uuid/v4');
const uuidv4 = require('uuid/v4');
 
 
// =========== PASSPORT =======
 
passport.serializeUser(function (user, done) {
 
done(null, user);
 
});
 
 
passport.deserializeUser(function (user, done) {
 
done(null, user);
 
});
 
 
var samlStrategy = new SamlStrategy({
 
// URL that goes from the Identity Provider -> Service Provider
 
callbackUrl: config.path,
 
 
entryPoint: config.entryPoint,
 
issuer: config.issuer,
 
identifierFormat: null,
 
 
validateInResponseTo: false,
 
disableRequestedAuthnContext: true
 
},
 
function (profile, done) {
 
return done(null, {
 
id: profile.nameID,
 
idFormat: profile.nameIDFormat,
 
email: profile.email,
 
firstName: profile.givenName,
 
lastName: profile.sn
 
});
 
});
 
 
passport.use(samlStrategy);
 
 
// to generate Service Provider's XML metadata
 
router.get('/saml/metadata',
 
function(req, res) {
 
res.type('application/xml');
 
var spMetadata = samlStrategy.generateServiceProviderMetadata(fs.readFileSync('/cert/certificate.pem', 'utf8'));
 
res.status(200).send(spMetadata);
 
}
 
);
 
 
router.post('/saml/SSO', passport.authenticate('saml', { failureRedirect: '/login', failureFlash: true}), function(req, res){
 
const xmlResponse = req.body.SAMLResponse;
 
const parser = new Saml2js(xmlResponse);
 
const response = parser.toObject();
 
const email = response["mail"];
 
console.log(parser.toJSON());
 
console.log("Nickname "+ response["givenName"])
 
const nickname = response["givenName"];
 
//check, if user exists, if not create.
 
db.User.findAll({where: {email: email}})
 
.then(users => {
 
if (users.length == 0) {
 
crypto.randomBytes(16, function(ex, buf) {
 
var token = buf.toString('hex');
 
 
var u = {
 
_id: uuidv4(),
 
email: email,
 
account_type: "email",
 
nickname: nickname,
 
password_hash: "00000",
 
prefs_language: req.i18n.locale,
 
confirmation_token: token
 
};
 
 
db.User.create(u)
 
.error(err => {
 
res.sendStatus(400);
 
})
 
.then(u => {
 
var homeFolder = {
 
_id: uuidv4(),
 
name: req.i18n.__("home"),
 
space_type: "folder",
 
creator_id: u._id
 
};
 
db.Space.create(homeFolder)
 
.error(err => {
 
res.sendStatus(400);
 
})
 
.then(homeFolder => {
 
u.home_folder_id = homeFolder._id;
 
u.save()
 
.then(() => {
 
// home folder created,
 
// auto accept pending invites
 
db.Membership.update({
 
"state": "active"
 
}, {
 
where: {
 
"email_invited": u.email,
 
"state": "pending"
 
}
 
});
 
res.status(201).json({});
 
})
 
.error(err => {
 
res.status(400).json(err);
 
});
 
})
 
});
 
});
 
}
 
}).then(user =>{
 
db.User.findOne({where: {email: email}})
 
.error(err => {
 
res.sendStatus(404);
 
})
 
.then(user => {
 
crypto.randomBytes(48, function(ex, buf) {
 
var token = buf.toString('hex');
 
 
var session = {
 
user_id: user._id,
 
token: token,
 
ip: req.ip,
 
device: "web",
 
created_at: new Date(),
 
url : "/"
 
};
 
 
db.Session.create(session)
 
.error(err => {
 
console.error("Error creating Session:",err);
 
res.redirect(500, "/");
 
})
 
.then(() => {
 
var domain = (process.env.NODE_ENV == "production") ? new URL(config.get('endpoint')).hostname : req.headers.hostname;
 
console.log("session set successfully");
 
res.cookie('sdsession', token, { domain: domain, httpOnly: true });
 
res.redirect(302, "/")
 
});
 
});
 
});
 
});
 
});
 
router.get('/', (req, res) => {
router.get('/', (req, res) => {
res.render('index', { config:config, user:req.user });
res.render('index', { config:config, user:req.user });
});
});
@@ -90,9 +234,16 @@ router.get('/account', (req, res) => {
@@ -90,9 +234,16 @@ router.get('/account', (req, res) => {
res.render('spacedeck');
res.render('spacedeck');
});
});
router.get('/login', (req, res) => {
router.get('/login', passport.authenticate('saml',
res.render('spacedeck', { config:config, user:req.user });
{
});
successRedirect: '/',
 
failureRedirect: '/login'
 
})
 
);
 
 
 
// res.render('spacedeck', { config:config, user:req.user });
 
//});
router.get('/logout', (req, res) => {
router.get('/logout', (req, res) => {
res.render('spacedeck', { config:config, user:req.user });
res.render('spacedeck', { config:config, user:req.user });
@@ -134,4 +285,4 @@ router.get('/spaces/:id', (req, res) => {
@@ -134,4 +285,4 @@ router.get('/spaces/:id', (req, res) => {
res.render('spacedeck', { config:config, user:req.user });
res.render('spacedeck', { config:config, user:req.user });
});
});
module.exports = router;
module.exports = {router: router, passport:passport};
package.json
+ 3
- 0
  • View file @ 9d956240

  • Edit in single-file editor

  • Open in Web IDE


@@ -34,9 +34,12 @@
@@ -34,9 +34,12 @@
"node-phantom-simple": "2.2.4",
"node-phantom-simple": "2.2.4",
"node-server-screenshot": "^0.2.1",
"node-server-screenshot": "^0.2.1",
"nodemailer": "^4.6.7",
"nodemailer": "^4.6.7",
 
"passport": "^0.4.1",
 
"passport-saml": "^1.3.5",
"phantomjs-prebuilt": "^2.1.16",
"phantomjs-prebuilt": "^2.1.16",
"read-chunk": "^2.1.0",
"read-chunk": "^2.1.0",
"request": "^2.88.0",
"request": "^2.88.0",
 
"saml2js": "^0.1.2",
"sanitize-html": "^1.11.1",
"sanitize-html": "^1.11.1",
"sequelize": "^4.37.6",
"sequelize": "^4.37.6",
"serve-favicon": "~2.4.2",
"serve-favicon": "~2.4.2",
spacedeck.js
+ 8
- 2
  • View file @ 9d956240

  • Edit in single-file editor

  • Open in Web IDE


@@ -22,7 +22,6 @@ const helmet = require('helmet');
@@ -22,7 +22,6 @@ const helmet = require('helmet');
const express = require('express');
const express = require('express');
const app = express();
const app = express();
const serveStatic = require('serve-static');
const serveStatic = require('serve-static');
const isProduction = app.get('env') === 'production';
const isProduction = app.get('env') === 'production';
// workaround for libssl_conf.so error triggered by phantomjs
// workaround for libssl_conf.so error triggered by phantomjs
@@ -92,7 +91,7 @@ spaceRouter.use('/:id', require('./routes/api/space_exports'));
@@ -92,7 +91,7 @@ spaceRouter.use('/:id', require('./routes/api/space_exports'));
app.use('/api/sessions', require('./routes/api/sessions'));
app.use('/api/sessions', require('./routes/api/sessions'));
//app.use('/api/webgrabber', require('./routes/api/webgrabber'));
//app.use('/api/webgrabber', require('./routes/api/webgrabber'));
app.use('/', require('./routes/root'));
if (config.get('storage_local_path')) {
if (config.get('storage_local_path')) {
app.use('/storage', serveStatic(config.get('storage_local_path')+"/"+config.get('storage_bucket'), {
app.use('/storage', serveStatic(config.get('storage_local_path')+"/"+config.get('storage_bucket'), {
@@ -108,6 +107,13 @@ if (app.get('env') == 'development') {
@@ -108,6 +107,13 @@ if (app.get('env') == 'development') {
app.use(require('./middlewares/500'));
app.use(require('./middlewares/500'));
}
}
 
const root = require('./routes/root');
 
 
const passport = root.passport;
 
app.use(passport.initialize());
 
app.use(passport.session());
 
app.use('/', root.router);
 
module.exports = app;
module.exports = app;
// CONNECT TO DATABASE
// CONNECT TO DATABASE
Assignee
Wolfgang Knopki's avatar
Wolfgang Knopki
Assign to
0 Reviewers
None
Request review from
Labels
0
None
0
None
    Assign labels
  • Manage project labels

Milestone
No milestone
None
None
Time tracking
No estimate or time spent
Lock merge request
Unlocked
0
0 participants
Reference:
Source branch: saml-integration

Menu

Explore Projects Groups Snippets

Dies ist die Gitlab-Instanz des Transferportals der Hochschule für Technik Stuttgart. Hier geht es zurück zum Portal