📅  最后修改于: 2020-10-30 14:13:05             🧑  作者: Mango
在创建的文件夹中为服务器代码创建一个新文件,并添加以下内容以导入和设置Express和CloudRail-
javascript
const express = require("express");
const cloudrail = require("cloudrail-si");
const app = express();
cloudrail.Settings.setKey("[CloudRail license key]");
现在,我们继续编写一个函数,该函数将实例化我们要用于社交登录的服务-
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;
}
我们需要一种跟踪用户身份的方法。通常这是在数据库中完成的,但是为了使本教程简短,我们将使用一个充当伪数据库的对象。
它的所有数据都保留在内存中,因此在服务器重新启动时会丢失-
javascript
const users = {
records: {}
};
users.find = (id) ⇒ {
return users.records[id];
};
users.save = (id, data) ⇒ {
users.records[id] = data;
};
之后,我们注册将处理社交登录流程开始的服务器端点-
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();
});
我们启动社交登录所使用的服务将重定向到我们的服务器,我们需要处理此重定向。
在获得用户的唯一标识符之后,我们检查我们是否曾经见过该用户。如果是,那么我们向他打招呼。如果没有,我们从社交网络获取名称并保存一个新用户-
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!");
});
}
});
});
最后,我们让服务器监听端口12345-
javascript
app.listen(12345);
现在,我们可以启动该应用程序,并在本地浏览器中对其进行测试。
如果导航到http:// localhost:12345 / auth / start / facebook ,则将启动Facebook登录流程。
如果导航到http:// localhost:12345 / auth / start / twitter ,则将启动Twitter登录流程。
使用该服务登录并授予访问权限后,您将看到“ Welcome greenhorn!”。如果您是首次这样做,并在连续访问中“欢迎回来[您的名字]”。
要将其集成到实际网站中,例如,您可以在其中包含服务提供商的徽标,并使徽标链接到相应的URL。
此外,应将伪数据库替换为真实数据库。然后,您可以进行多达9个不同提供商的社交登录!