Cloudrail - Codificação
Crie um novo arquivo para o seu código de servidor na pasta criada e adicione o seguinte para importar e configurar Express e CloudRail -
javascript
const express = require("express");
const cloudrail = require("cloudrail-si");
const app = express();
cloudrail.Settings.setKey("[CloudRail license key]");
Agora, continuamos escrevendo uma função que irá instanciar os serviços que queremos usar para login 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;
}
Precisamos de uma maneira de rastrear as identidades dos usuários. Isso normalmente é feito em um banco de dados, mas para manter este tutorial curto, usaremos um objeto que atua como umpseudo-database.
Todos os seus dados são mantidos na memória e, portanto, perdidos quando o servidor é reiniciado -
javascript
const users = {
records: {}
};
users.find = (id) ⇒ {
return users.records[id];
};
users.save = (id, data) ⇒ {
users.records[id] = data;
};
Depois, registramos o endpoint do servidor que tratará do início do fluxo de login 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();
});
O serviço com o qual iniciamos o login social irá redirecionar para o nosso servidor e precisamos lidar com esse redirecionamento.
Depois de obter um identificador exclusivo para o usuário, verificamos se já vimos esse usuário antes. Se sim, então o saudamos com seu nome. Caso contrário, obtemos o nome da rede social e salvamos um novo usuário -
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!");
});
}
});
});
Finalmente, temos o servidor escutando na porta 12345 -
javascript
app.listen(12345);
Agora podemos iniciar o aplicativo e testá-lo em nosso navegador local.
Se você navegar para http://localhost:12345/auth/start/facebook você iniciará o fluxo de login do Facebook.
Se você navegar para http://localhost:12345/auth/start/twitter você iniciará o fluxo de login do Twitter.
Depois de fazer login com o serviço e conceder acesso, você verá "Bem-vindo novato!" se você fizer isso pela primeira vez e "Bem-vindo de volta [seu nome]" em visitas consecutivas.
Para integrá-lo em um site real, você deve, por exemplo, incluir os logotipos do provedor de serviços e criar um link para os logotipos nos respectivos URLs.
Além disso, o pseudo-banco de dados deve ser substituído por um real. E pronto, login social para até 9 provedores diferentes!