Giter Site home page Giter Site logo

spid-passport's Introduction

⚠️ Questo repository non è più mantenuto, si consiglia di usare spid-express ⚠️

spid-passport

Provider di autenticazione Passport per SPID

Questo modulo consente di autenticare gli utenti tramite SPID (Servizio Publico di Identità Digitale) nelle applicazioni Nodejs che fanno uso di Passport.

Installazione

$ npm install spid-passport

Utilizzo

Configurazione

Sono necessari i parametri di configurazione del Service Provider e dei diversi Identity Provider; nello specifico il costruttore prende in input due oggetti e una callback di verifica. Le opzioni possibili sono tutte quelle messe a disposizione dalla libreria passport-saml, con l'unica differenza che i parametri relativi agli Identity Provider sono ripetuti per ciascun Identity Provider supportato da SPID. I parametri obbligatori sono:

Service Provider:
  • (String) issuer - Id dell'entita che fornisce il servizio, può essere qualsiasi cosa, tipicamente è la URL del Service Provider
  • (String) privateCert - Chiave privata del Service Provider (Formato PEM)
  • (String) path - Endpoint sul quale ricevere la response dall'identity provider; viene combinata con le informazioni dell'host per costruire una url completa
  • (Number) attributeConsumingServiceIndex - Indice posizionale sul metadata che identifica il set di attributi richiesti all'Identity Provider
  • (String) identifierFormat - Formato dell'identificativo dell'utente, per SPID va valorizzato a urn:oasis:names:tc:SAML:2.0:nameid-format:transient
  • (String) authnContext - Livello SPID richiesto (a scelta tra: https://www.spid.gov.it/SpidL1, https://www.spid.gov.it/SpidL2, https://www.spid.gov.it/SpidL3)
Identity Provider
  • (String) entryPoint - Endpoint per effettuare il login, verrà effettuato un redirect verso questa URL
  • (String) cert - Certificato dell'Identity Provider (Formato PEM)

Esempio di utilizzo con express e spid-test-env

const fs = require('fs')
const express = require('express')
const app = express()
const bodyParser = require('body-parser')
const passport = require('passport')
const SpidStrategy = require('passport-spid')


app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.json())

// init passport
app.use(passport.initialize())

let spidStrategy = new SpidStrategy({
  sp: {
    callbackUrl: "https://example.com/acs",
    issuer: "https://example.com",
    privateCert: fs.readFileSync("./certs/key.pem", "utf-8"),
    decryptionPvk: fs.readFileSync("./certs/key.pem", "utf-8"),
    attributeConsumingServiceIndex: 1,
    identifierFormat: "urn:oasis:names:tc:SAML:2.0:nameid-format:transient",
    authnContext: "https://www.spid.gov.it/SpidL1"
    attributes: {
      name: "Required attributes",
      attributes: ["fiscalNumber", "name", "familyName", "email"]
    },
    organization: {
      name: "Organization name",
      displayName: "Organization display name",
      URL: "https://example.com"
    }
  },
  idp: {
    test: {
      entryPoint: "https://spid-testenv-identityserver:9443/samlsso",
      cert: "MIICNTCCAZ6gAwIBAgIES343gjANBgkqhkiG9w0BAQUFADBVMQswCQYD..."
    },
    idp2: {
      entryPoint: "https://...",
      cert: "..."
    }
  }
}, function(profile, done){

  // Find or create user
  console.log(profile)
  done(null, profile);
})

passport.use(spidStrategy)

app.get("/login", passport.authenticate('spid'))

app.post("/acs",
  passport.authenticate('spid', {session: false}),
  function(req, res){
    console.log(req.user)
    res.send(`Hello ${req.user.name_id}`)
  })

// Create xml metadata
app.get("/metadata", spidStrategy.generateServiceProviderMetadata())


app.listen(3000);

spid-passport's People

Contributors

alranel avatar bfabio avatar cicciodifranco avatar gunzip avatar libremente avatar lussoluca avatar vertighel avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

spid-passport's Issues

Sviluppo authentication provider per Passport

Esiste già un provider per SAML: https://github.com/bergie/passport-saml

Un provider SPID per Passport dovrebbe basarsi su passport-saml se possibile (senza fork, ma usandolo come dipendenza), fornendolo preconfigurato per SPID e inoltre facilitando l'integrazione del bottone di login nella posizione desiderata

Esiste anche un ottimo modulo per Node che non usa Passport: https://github.com/Clever/saml2
Domanda: conviene fare (anche?) un'implementazione di SPID per Node senza Passport?

Forzare SHA-256

Questo modulo usa SHA-1 per firmare le AuthnRequest, perché è il default di passport-saml, a meno che l'utente non specifichi espressamente un altro valore signatureAlgorithm (come ad esempio qui).

Dal momento che SPID richiede SHA-256, sarebbe opportuno che spid-passport lo imponga automaticamente.

WIP: spid-node

In relazione alla issue #1 e alla challenge di Hack.Developers.Italia, abbiamo iniziato lo sviluppo di un modulo node.js indipendente dal middleware di autorizzazione.

Il progetto si basa su samlify e offrirà una comoda API per creare nuove login request e fare il parsing delle risposte dei dati, fornendo una configurazione preimpostata per gli Identity Provider accreditati.

E' un WIP, non ancora utilizzabile:
https://github.com/Roma-JS/spid-node

Discussione: repository mantenuta?

Salve @alranel

(Taggo lei perchè ha creato #1)

Riferendomi sia alle issues sia alle discussioni su https://forum.italia.it questa repo sembra abbandonata. Allo stato attuale non funziona, le dipendenze sono da aggiornare, non è nemmeno realmente pubblicata ( #6 ) e ci sono svariati fork a loro volta non più mantenuti.

Siccome ho dedicato un paio di pomeriggi a cercare di sistemare alcuni dei problemi per poi arrendermi, vorrei chiedere riguardo al futuro di questa libreria.

Magari sarebbe meglio archiviarla come già avvenuto per una delle librerie in PHP.

Error: Missing decryptionCert while generating metadata for decrypting service provider

Hi, I tried to run it. I used example at bottom of readme, but it responds to me this error... How can I resolve? Thanks

Salve, ho provato a fare la run, utilizzando l'esempio sopra. Purtroppo mi risponde quest'errore... Come posso risolverlo? Grazie

C:\nodejs\node_modules>node login.js
C:\nodejs\node_modules\spid-passport\index.js:161
      throw new Error(
      ^

Error: Missing decryptionCert while generating metadata for decrypting service provider
    at SpidStrategy.generateServiceProviderMetadata (C:\nodejs\node_modules\spid-passport\index.js:161:13)
    at Object.<anonymous> (C:\nodejs\node_modules\login.js:66:35)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)

C:\nodejs\node_modules>

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.