Cloudrail - 编码

在创建的文件夹中为您的服务器代码创建一个新文件,并添加以下内容以导入和设置 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登录流程.

登录服务并授予访问权限后,您将看到"欢迎新手!"如果你是第一次这样做,并且"连续访问时欢迎回来[你的名字]".

要将它集成到一个实际的网站,你可以,例如,包括服务提供商的在那里使用徽标并将徽标链接到相应的URL.

此外,伪数据库应替换为真实数据库.你可以去多达9个不同的供应商进行社交登录!