Cloudrail - Codifica
Crea un nuovo file per il codice del tuo server nella cartella creata e aggiungi quanto segue per importare e configurare Express e CloudRail -
javascript
const express = require("express");
const cloudrail = require("cloudrail-si");
const app = express();
cloudrail.Settings.setKey("[CloudRail license key]");
Ora continuiamo scrivendo una funzione che istanzerà i servizi che vogliamo utilizzare per l'accesso social -
javascript
function makeService(name, redirectReceiver) {
let service;
switch (name) {
case "twitter":
service = new cloudrail.services.Twitter(
redirectReceiver,
"[Twitter Client ID]",
"[Twitter Client Secret]",
"http://localhost:12345/auth/redirect/twitter"
);
break;
case "facebook":
service = new cloudrail.services.Facebook(
redirectReceiver,
"[Facebook Client ID]",
"[Facebook Client Secret]",
"http://localhost:12345/auth/redirect/facebook",
"state"
);
break;
// More services from the Profile interface can be added here,
//the services above are just examples
default: throw new Error("Unrecognized service");
}
return service;
}
Abbiamo bisogno di un modo per tenere traccia delle identità degli utenti. Questo viene normalmente fatto in un database ma per mantenere questo tutorial breve, useremo un oggetto che funge da filepseudo-database.
Tutti i suoi dati vengono conservati in memoria e vengono quindi persi al riavvio del server -
javascript
const users = {
records: {}
};
users.find = (id) ⇒ {
return users.records[id];
};
users.save = (id, data) ⇒ {
users.records[id] = data;
};
Successivamente, registriamo l'endpoint del server che gestirà l'inizio del flusso di accesso social -
javascript
app.get("/auth/start/:serviceName", (req, res) ⇒ {
let serviceName = req.params["serviceName"];
let redirectReceiver = (url, state, callback) ⇒ {
res.redirect(url);
};
let service = makeService(serviceName, redirectReceiver);
service.login();
});
Il servizio con cui abbiamo avviato il social login reindirizzerà al nostro server e dobbiamo gestire questo reindirizzamento.
Dopo aver ottenuto un identificatore univoco per l'utente, controlliamo se abbiamo già visto questo utente. Se sì, lo salutiamo con il suo nome. In caso contrario, otteniamo il nome dal social network e salviamo un nuovo utente -
javascript
app.get("/auth/redirect/:serviceName", (req, res) ⇒ {
let serviceName = req.params["serviceName"];
let redirectReceiver = (url, state, callback) ⇒ {
callback(undefined, "http://bla.com" + req.url);
// The callback expects a complete URL but only the query matters
};
let service = makeService(serviceName, redirectReceiver);
service.getIdentifier((err, identifier) ⇒ {
if (err) res.status(500).send(err);
let user = users.find(identifier);
if (user) {
res.send("Welcome back " + user.name);
} else {
service.getFullName((err, name) ⇒ {
if (err) res.status(500).send(err);
users.save(identifier, {
name: name
});
res.send("Welcome greenhorn!");
});
}
});
});
Infine, abbiamo il server in ascolto sulla porta 12345 -
javascript
app.listen(12345);
Ora possiamo avviare l'applicazione e testarla nel nostro browser locale.
Se navighi verso http://localhost:12345/auth/start/facebook inizierai il flusso di accesso a Facebook.
Se navighi verso http://localhost:12345/auth/start/twitter inizierai il flusso di accesso a Twitter.
Dopo aver effettuato l'accesso con il servizio e aver concesso l'accesso, vedrai "Benvenuto novellino!" se lo fai per la prima volta e "Bentornato [il tuo nome]" in visite consecutive.
Per integrarlo in un sito Web reale, ad esempio, includeresti i loghi del fornitore di servizi lì e faresti che i loghi rimandassero ai rispettivi URL.
Inoltre, lo pseudo-database dovrebbe essere sostituito con uno reale. Ed ecco fatto, accesso social per un massimo di 9 provider diversi!