如何实现访问令牌,以便我可以绕过登录页面(sailsjs)



我有一个 SailsJS 网站,我通过用户需要填写电子邮件和密码的表单实现了身份验证。 复制自 活动Overloard 2.0示例代码

登录

login: function(req, res) {
console.log("Login hehe!!");
// Try to look up user using the provided email address
User.findOne({
email: req.param('email')
}, function foundUser(err, user) {
if (err) return res.negotiate(err);
if (!user) return res.notFound();
console.log("found email");
// Compare password attempt from the form params to the encrypted password
// from the database (`user.password`)
require('machinepack-passwords').checkPassword({
passwordAttempt: req.param('password'),
encryptedPassword: user.encryptedPassword
}).exec({
error: function(err) {
console.log("There was an error with password");
return res.negotiate(err);
},
// If the password from the form params doesn't checkout w/ the encrypted
// password from the database...
incorrect: function() {
console.log("Password doesn't checkout w/ the encrypted");
return res.notFound();
},
success: function() {
console.log("Good password");
var now = new Date();
User.update(user.id, { online: true, lastLoggedIn: now }, function() {
// Store user id in the user session
req.session.me = user.id;
User.publishUpdate(user.id, {
online: true,
id: user.id,
name: user.name,
lastLoggedIn: now,
action: ' has logged in.'
});
// All done- let the client know that everything worked.
return res.ok();
});
}
});
});

我的页面受登录保护

myPage: function(req, res) {
if (!req.session.me) {
return res.view('login'); // not authenticated will take you to the login page
}
// It's authenticated, it runs the code below
// DO SOMETHING

现在是一个非常特殊的用例,我需要在没有用户交互的情况下打开我的页面(它不能通过表单),但我仍然需要它受到保护。我需要传递某种访问令牌。

我知道将"访问令牌"作为查询参数传递很可能不是一个好主意,不是吗?

事实上,我不知道如何解决我的问题并允许通过表单的用户交互访问 myPage,而不是基于会话的身份验证......

在我看来,我需要首先以编程方式获取令牌,然后打开浏览到我的页面......我敢打赌,有一些最佳实践可以解决我的问题。

有什么指示吗?也许有人可以填补知识空白。

实际上,在node.js/express中,您有多种选择,用于无密码或无形登录.js因此是sails.js,因为sails建立在两者之上。

您如何处理解决方案实际上取决于您的应用程序/应用程序的规模和使用。例如;是使用相同的登录凭据访问多个应用程序还是单个 Web 应用程序,该应用程序是否仅在内部网中可用或在整个 WWW 中可用。

无论上述方案如何,用户始终需要一些初始设置,无论是使用标识提供者进行初始注册还是使用应用程序进行初始注册。注册表格不会完全消失,而是成为一次性事件。

因此,让我们看一些选项以及如何将它们引入 express/sails 应用程序中,我将从最基本的开始,然后降低难度。

选项 1:利用帆会话存储。从您的代码中,您已经开始执行此操作。逻辑的工作原理如下:

您的用户首次注册或登录。在此阶段,将用户会话设置为要进行身份验证。

// Store user id in the user session
req.session.me = user.id;
req.session.authenticated;

您可以在所有需要身份验证的页面上设置策略。幸运的是,sails 通过在文件夹 api/policy 中创建会话身份验证策略,已经在这里完成了一些繁重的工作。要使用它们,请打开配置/策略.js文件并将此策略添加到受保护的页面

'my_app' : {
'route_to_protect' : 'sessionAuth'
},

最后,您需要使此会话cookie持续很长时间,以执行此打开的配置/会话.js并编辑cookie maxAge以满足您的需求。例如,如果要强制用户每 365 天登录一次,则可以执行以下操作:

// milliseconds * seconds * minutes * hours * days
cookie: {
maxAge: 1000 * 60 * 60 * 24 * 365
},

此选项的缺点是,如果应用程序重新启动并且所有用户都必须重新登录,您的会话将丢失。

选项 2:使用简单的第三方库,如无密码。无密码为快速 Web 应用程序提供基于令牌的身份验证,并且 sails 建立在快速...

无密码的一般要点是当用户注册时,您通过电子邮件向他们提供指向您的应用程序的链接,这将登录他们并进而设置会话。Passwordless使用mongo作为会话存储,因此您可以安装mongo或使用mLab之类的东西,这是一个Mongo数据库即服务提供商。要完整地了解使用无密码,请在此处查看他们的入门页面。

现在,使用功能更强大的选项。

选项 3:如果您正在开发面向公众的应用程序,使用 Passport.js 带帆是一个不错的选择。

Passport 是 Node.js 的身份验证中间件。Passport非常灵活和模块化,可以不显眼地放入任何基于Express的Web应用程序中。一套全面的策略支持使用用户名和密码、Facebook、Twitter 等进行身份验证。

Passport 适用于 Sails,就像适用于 Express 一样。

已经有一大堆关于在以太中设置护照的指南。但是这里提供了一个很好的分步,也是帆在这里官方文档中引用的那个。

Passport 本质上是一个身份验证中间件。它允许用户基于此身份验证标识自己,您可以在应用程序中开发正确的授权功能。

选项 4:使用 SAML 或 OAuth。从开发和实施的角度来看,这些是迄今为止所提供的选项中最大的任务。

SAML 和 OAuth 是授权中间件,它指的是确定允许谁执行什么操作的规则。两者都具有非常相似的设置,并使用身份提供程序 (IdP) 和服务提供商 (SP),其中 IdP 表示对流中的用户进行身份验证的联机服务,SP 表示依赖于受信任 IdP 进行身份验证和授权的应用程序。

我更熟悉 SAML,所以接下来是参考在项目中实现 SAML 时的注意事项。

您首先需要向 IdP 注册您的应用程序 (SP)。关于IdP,您选择的是基于应用程序的规模和要求,有免费的在线IdP,如ZXIDP和SSOCircle,或者如果您的应用程序需要专用的IdP,您可以查看OpenSSO之类的东西。您也可以考虑使用 saml-idp 包创建自己的 Node.js IdP。

将 SAML 集成到帆应用程序中并不太困难。使用 saml2-js 包。

全部配置后,逻辑的工作方式如下。

  1. 用户打开他们的网络浏览器并转到您的网址。

  2. 要对用户进行身份验证,您的网址会构造一个 SAML Authnrequest,对其进行签名、加密和编码。

  3. 然后,您的 url 会将用户的重定向到 IdP 进行身份验证。

  4. IdP
  5. 验证请求,在第一次注册/登录时,IdP 将要求用户输入他们的用户名和密码,之后它将使用会话,除了浏览器地址栏中的地址更改外,用户不会看到太多。

  6. 如果用户成功通过身份验证,IdP 将生成一个 SAML 令牌,其中包含有关用户的信息(用户名等),并使用此令牌将其重定向回您的 URL。

  7. 最后,您的 url 会验证 SAML 令牌,提取有关用户的身份信息(包括授权)并将其登录。

最新更新