Passport本地策略和cURL

2024-02-28

我想使用 CURL 测试我的 node.js + Express + Passport.js 测试应用程序(RESTful)。我的代码:

var express = require('express');
var routes = require('./routes');
var http = require('http');
var path = require('path');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

// Define the strategy to be used by PassportJS
passport.use(new LocalStrategy(
    function(username, password, done) {
        if (username === "admin" && password === "admin") // stupid example
            return done(null, {name: "admin"});

        return done(null, false, { message: 'Incorrect username.' });
    }
));

// Serialized and deserialized methods when got from session
passport.serializeUser(function(user, done) {
    done(null, user);
});

passport.deserializeUser(function(user, done) {
    done(null, user);
});

// Define a middleware function to be used for every secured routes
var auth = function(req, res, next){
    if (!req.isAuthenticated())
        res.send(401);
    else
        next();
};

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
    app.use(express.errorHandler());
}

app.get('/test', auth, function(req, res){
    res.send([{name: "user1"}, {name: "user2"}]);
});

app.post('/login', passport.authenticate('local'), function(req, res) {
    res.send(req.user);
});

使用curl 调用/test 和

curl "http://localhost:3000/test"

返回“未经授权”(到目前为止这是正确的)。

使用curl 调用/login (POST) 和

curl --data "username=admin&password=admin" http://localhost:3000/login

作品。但在下一次请求时,我的登录信息被“忘记”了。 这是因为curl无法处理会话吗?有什么解决方法吗? 对于 RESTful 应用程序,我的过程是否正确?


首先,使curl当您登录时保存cookie

curl --cookie-jar jarfile --data "username=admin&password=admin" http://localhost:3000/login

访问时读取存储的cookie/test:

curl --cookie jarfile "http://localhost:3000/test"

在我的机器(Ubuntu 12.04)上运行 Node.js v0.10.26 和 Express 3.5.0 之前,需要对应用程序本身进行一些修改。我生成了一个新的 Express 应用程序express --sessions nodetest并编辑了代码app.js如下所示。一旦我安装了依赖项,我就运行了该应用程序,它可以与curl命令。

app.js

var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

var app = express();

// Define the strategy to be used by PassportJS
passport.use(new LocalStrategy(
    function(username, password, done) {
        if (username === "admin" && password === "admin") // stupid example
            return done(null, {name: "admin"});

        return done(null, false, { message: 'Incorrect username.' });
    }
));

// Serialized and deserialized methods when got from session
passport.serializeUser(function(user, done) {
    done(null, user);
});

passport.deserializeUser(function(user, done) {
    done(null, user);
});

// Define a middleware function to be used for every secured routes
var auth = function(req, res, next){
    if (!req.isAuthenticated())
        res.send(401);
    else
        next();
};

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(express.cookieParser('your secret here'));
app.use(express.session());
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
    app.use(express.errorHandler());
}

app.get('/test', auth, function(req, res){
    res.send([{name: "user1"}, {name: "user2"}]);
});

app.post('/login', passport.authenticate('local'), function(req, res) {
    res.send(req.user);
});

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

卷曲脚本

#!/bin/sh
# curl-login.sh
rm jarfile
echo --- login
curl --cookie-jar jarfile --data "username=admin&password=admin" http://localhost:3000/login
echo --- test
curl --cookie jarfile "http://localhost:3000/test"

带有curl输出的控制台日志

$ node app &
$ sh curl-login.sh
--- login
POST /login 200 2ms - 21b
{
  "name": "admin"
}--- test
GET /test 200 1ms - 60b
[
  {
    "name": "user1"
  },
  {
    "name": "user2"
  }
]

注意使用

app.use(express.cookieParser('your secret here'));
app.use(express.session());

in app.js。会议did not无需上述两行即可工作。

您问题中的代码还缺少创建 HTTP 服务器的部分,但我认为这只是一个复制粘贴问题;我指的是

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Passport本地策略和cURL 的相关文章

  • 在文件之间共享 mqtt 客户端对象

    我这样连接到 MQTT mqtt js const mqtt require mqtt var options needed options var client mqtt connect mqtt someURL options clie
  • 如何获取nodejs程序中的nodejs版本?

    In a Node js 的调试器 https github com rocky trepanjs 有一个命令显示V8版本和调试器包版本 如何获取nodejs版本 我想我基本上可以运行命令node version or nodejs ver
  • 使用socket.io进行用户身份验证

    我已经红色了这个教程 http howtonode org socket io auth http howtonode org socket io auth 它展示了如何使用express和socket io对用户进行身份验证 但是有没有一
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke
  • 对于实时网站使用 Node.js 或 Ringojs 安全吗?

    正如标题中所述 我想知道使用实际的 omg 平台 即 Node js 和 Ringo js 的实际版本 之一来开发网站是否安全 另外 我想知道他们是否支持cookie sessions以及他们如何处理多字段帖子 PHP中的fieldname
  • HTML 格式的 Google Apps 脚本

    是否可以在我的 HTML 中使用 google apps 脚本 我希望能够从外部框架 例如 Node js 以纯 Javascript 形式从表单写入电子表格 https developers google com apps script
  • Bot Framework Node.js 发送给特定用户的临时消息

    我已经盯着这个问题好几个小时了 找不到解决方案 即使根据所有建议 它应该很容易 https learn microsoft com en us bot framework nodejs bot builder nodejs proactiv
  • npmjs.org - 找不到自述文件

    我是 npm 包的主要作者scramjet 一个月以来 我遇到了关于可视性的问题README md在 npmjs 中 The npm 中的超燃冲压发动机包 https www npmjs com package scramjet shows
  • 使用 React.js + Express.js 发送电子邮件

    我在 ES6 中使用 React js 构建了一个 Web 应用程序 我目前想要创建一个基本的 联系我们 页面并想要发送电子邮件 我是 React 新手 刚刚发现我实际上无法使用 React 本身发送电子邮件 我正在遵循教程nodemail
  • 如何在Electron WebView中连接到代理?

    因为我可以通过连接到免费代理服务器 或付费 目前用作电子 JS 解决方案作为桌面应用程序 代理列表服务器示例 http proxylist hidemyass com http proxylist hidemyass com 您可以使用 s
  • 如何解决 Socket.io 404(未找到)错误?

    我正在使用 Socket io 和 Express 在我的项目中 我有一个登录页面和一个主页 当我成功登录时 我导航到 localhost 3000 home 并收到以下错误 GET http localhost 3000 socket i
  • libxmljs 的替代品 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 目标 使用 Node js 访问网页 使用 xpath 语法操作 DOM 并打印新的 DOM libxm
  • NestJS e2e 测试模拟会话装饰器

    我正在尝试使用 supertest 编写一个 e2e 测试 其中我的控制器实际上使用了 Session 装饰师 然而 我不想承担使用数据库连接等启动会话的全部负担 因此测试中的我的应用程序实际上并未初始化会话 相反 我想首先模拟掉装饰器提供
  • 卷曲选项 -:未知

    我运行此命令在 ubuntu 18 04 上安装更新版本的 nodejs curl sL https deb nodesource com setup 12 x sudo E bash 我收到错误 curl 选项 未知 我在多个系统上尝试过
  • 如何使用Create React App安装React

    嗨 我对反应真的很陌生 我不知道如何实际安装它 也不知道我需要做什么才能在其中编写代码 我下载了node js并且安装了v12 18 3以及NPM 6 14 6 但是每次我尝试在许多网站上提到的create react app安装方法中输入
  • 根据特定字符获取整个字符串或子字符串

    我有一个包含 MIME 类型的字符串 例如application json 现在我想将其与实际的 HTTP 标头进行比较 在本例中content type 如果标头包含 MIME 类型 那么就很简单 if mimeType contentT
  • 在 Node.js 中,setTimeout() 会阻止事件循环吗?

    如果我有一个简单的 setTimeout 函数 并将其设置为 10 秒 整个服务器在那10秒内就死机了 这是真的 这就是我听到的 答案是no 你的链接是什么Node js 如何重新创建 setTimeout 函数而不阻塞事件循环 https
  • 使用 KeystoneJs 的 Mongoose 二级种群 [重复]

    这个问题在这里已经有答案了 我需要用 Mongoose Keystone 填充两层 但遇到了障碍 我有 3 个模型 地区 国家和城市 地区包含国家 国家包含城市 我的模型 型号区域 var Region new keystone List
  • 如何仅在 NextJS 站点构建期间使用 getInitialProps?

    当使用 NextJS 构建静态站点时 我想要getInitialProps方法仅在构建步骤期间触发 而不是在客户端上触发 在构建步骤中 NextJS 运行getInitialProps 方法 https nextjs org docs fe
  • 如何检查请求是否通过 Express 中的 https 发送

    我想强制某些路线始终在我的 Express 应用程序中使用安全连接 我如何检查以确保它使用 https 我在 heroku 上使用搭载 ssl 进行部署 我也在 Heroku 上部署 当他们使用 nginx 进行反向代理时 他们添加了一堆标

随机推荐

  • Postgres 中的多语句查询

    我希望向 Postgres 数据库发送多个读取查询 以减少需要前往令人痛苦的远程数据库的次数 有什么东西在libpq支持这种行为 是的 您可以使用异步处理函数 http www postgresql org docs current sta
  • 更改为 .gitattributes 后 Git 重新签出文件

    我有一个存储库 其中包含一个错误地以 LF 行结尾提交的文件 但它需要有 CRLF 行结尾 为了解决这个问题 我添加了一个 gitattributes 文件以在签出时强制执行正确的行结尾 这似乎解决了签出新存储库时的问题 但现有的签出拒绝更
  • 使用 webpack 在 Laravel 5 中将插件安装到 CKEditor 5

    我在将插件安装到集成到 Laravel 5 6 的 CKEditor 时遇到了一个小问题 根据 CKEditor 文档的集成指南 我能够添加 ckeditor ckeditor5 build classic https www npmjs
  • WordPress wp_enqueue_script 不工作

    我正在开发一个主题并尝试让 wp enqueue script 工作 奇怪的是 什么也没有出现 它没有任何作用 这是我的设置 在functions php中我有 function named scripts global named opt
  • VBA创建对象

    自 1 月 10 日起 我就被困在这条代码线上 我在一封电子邮件中收到了它 我发现我必须学习课程模块 所以我做了 现在又回来询问新的基础 代码行是 严重警告 您必须转到 VBE 中的 工具 gt 参考 并激活Microsoft WinHTT
  • SSIS 顺序处理

    我在同一数据流任务中有 5 个独立的数据流 每个数据流都有源和目的地 我怎样才能让它们按顺序运行 它们似乎并行运行 我可能会在不同的数据流任务中执行此操作 但我怎样才能在单个数据流任务中做到这一点 同一任务中不要有独立的数据流 我知道导入
  • 如何使用 scanf() 获取任意数量的整数? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 该程序采用任意数量的整数作为输入 并
  • Swift 中采用类型名称的通用函数

    在 C 中 可以通过指定类型来调用泛型方法 public T f
  • iOS 8 今天的小部件在一段时间后停止工作

    我为德国冰球联赛 DEL 制作了一个今日小部件 我正在从我们的服务器加载下一个游戏并在 tableView 中显示它们 加载过程在建议的方法 widgetPerformUpdateWithCompletionHandler 中启动 最初我在
  • 读取 utf-8 编码文件时,Path.read_text(pathlib)出现意外结果

    今天我了解到open filename read 我们不能指望绑定到隐藏文件对象的资源会立即返回 尽管我在我的系统上观察到了这一点 看接受的答案 https stackoverflow com a 7409814 2932052问题的读取整
  • 无法自动装配字段

    我在用着Hibernate 4 Spring MVC 4当我开始时Apache Tomcat Server 8我收到这个错误 Error creating bean with name welcome Injection of autowi
  • 如何将 netcat 中的 tcp 数据放入变量中?

    我已经用通常的方式设置了服务器nc lk
  • 如何在 jQuery 中向数组添加项目?

    var list getJSON json js function data each data function i item console log item text list push item text console log l
  • 如何在本机反应中同步两个滚动视图?

    我的要求是创建一个具有固定标题和第一列的表格 表格数据将在水平和垂直方向上滚动 for this I have used 3 scrollviews following gif will make it clear 第一个滚动视图是标题名称
  • Laravel Blade @foreach 不工作

    我正在学习 Laravel 4 到目前为止一切顺利 但由于某些奇怪的原因 blade 的 foreach 似乎不适用于简单的查询 我的代码是 Route Route get users function users User all ret
  • 如何在大小写敏感模式下在 gfortran 中编译?

    是否可以编译 fortran 90 95 代码gfortran with 区分大小写 我搜索了手册 但找不到任何可以给 gfortran 的标志或选项以使其区分大小写 我希望大写和小写的变量不同 那么 有可能吗 没有这样的标志或选项 当然
  • Oozie shell 操作未作为提交用户运行

    我编写了一个 Oozie 工作流程 它运行 BASH shell 脚本来执行一些配置单元查询并对结果执行一些操作 该脚本运行但在访问某些 HDFS 数据时抛出权限错误 提交 Oozie 工作流的用户具有权限 但脚本以纱线用户身份运行 是否可
  • Javascript V8 Torque Engine 错误加载二进制数据

    我们使用 opentype js 加载字体文件 并在我们的代码 V8 引擎或 Chromium 中发现了一个错误 该错误返回以下结果 DataView getInt16 as 65536低于或高于应有的水平 这种情况很少发生 0 25 但对
  • 'touchstart' 事件是否有相当于 e.PageX 位置的点击事件?

    我正在尝试使用 jQuery 获取与 live 功能一起使用的 touchstart 事件的 X 位置 I e box live touchstart function e var xPos e PageX 现在 这确实适用于 点击 事件
  • Passport本地策略和cURL

    我想使用 CURL 测试我的 node js Express Passport js 测试应用程序 RESTful 我的代码 var express require express var routes require routes var