0

我在使用本地策略时遇到了 passport.js 问题。我有两个具体问题:

  1. 对于最基本的情况,我没有获得持久会话来使用示例代码(见下文)。
  2. 我想去无会话。对于最基本的情况,在登录时,我将传递为我提供会话令牌的用户名 + 密码,在常规请求中,我将使用此会话令牌与其他一些东西进行散列来进行身份验证。用护照轻松搞定吗?在这种情况下,护照似乎没有提供太多功能,而且我自己的解决方案更容易 - 只需使用标准检查登录/注销,然后使用一个中间件取消请求令牌以验证请求。容易俗气?

问题1:

使用库中的参考代码:

https://github.com/jaredhanson/passport-local/blob/master/examples/login/app.js

我执行了一系列命令来显示已注销与已登录:

A.查看/account,未登录

curl -v localhost:3000/account

正如预期的那样,我重定向到 /login

<p>Moved Temporarily. Redirecting to <a href="http://localhost:9292/login">http://localhost:3000/login</a></p>

B、登录

curl -v -d "username=bob&password=secret" http://127.0.0.1:3000/login

同样如预期的那样,我重定向到 /

<p>Moved Temporarily. Redirecting to <a href="http://127.0.0.1:3000/">http://127.0.0.1:3000/</a></p>

C.查看/account,登录

curl -v localhost:3000/account

我勒个去???

<p>Moved Temporarily. Redirecting to <a href="http://localhost:9292/login">http://localhost:3000/login</a></p>
4

2 回答 2

6

在 1 的情况下,会话支持需要在您的服务器端配置 cookie 并由您的用户代理使用。通常这是一个浏览器,它将在每个请求中传输 cookie,服务器使用它们来恢复您的登录状态。

但是,您使用的 curl 命令不会传输 cookie,因此每个请求对服务器来说都是“新的”,这就是为什么您每次都会看到重定向登录的原因。我怀疑如果您在浏览器中尝试相同的请求,这将按预期工作。

至于 2,我需要更多细节来提出一个好的解决方案。如果您使用 HTML 和 Web 浏览器访问您的网站,您最终将需要像会话这样的东西。您可以每次都在查询参数中传输此信息,而不是在 cookie 中,但您最终会重建 Express/Connect 开箱即用的许多内容。

在任何情况下,如果您选择走这条路,Passport 会提供一个干净的接口来实现您自己的身份验证策略。您只需解析相关凭据的请求并在数据库中查找用户。

API 客户端是不同的,我建议看看 Passport 的 OAuth 支持,它提供了简单的方法来验证与特定客户端关联的访问令牌。

于 2012-09-16T15:30:52.843 回答
2

问题不在于护照,该curl命令需要存储 cookie,因此-c应该-b使用参数来模拟浏览器行为。从 curl 联机帮助页:

curl -b cookies.txt -c cookies.txt www.example.com

该命令的作用是将 cookie 存储在 cookies.txt 中并发送从 cookies.txt 读取它们的 cookie - 这是 curl 模仿 netscape cookie-jar 文件格式进行写入和读取的方式。

至于你的问题本身,贾里德已经回答了!

于 2013-03-18T03:07:35.487 回答