22

就在昨天在 Heroku 上,我开始在快速登录 Twitter 时遇到此错误

Error: failed to find request token in session
    at Strategy.<anonymous> (/app/node_modules/passport-twitter/node_modules/passport-oauth/lib/passport-oauth/strategies/oauth.js:120:54)
    at Strategy.authenticate (/app/node_modules/passport-twitter/lib/passport-twitter/strategy.js:82:40)
    at Passport.authenticate (/app/node_modules/passport/lib/passport/middleware/authenticate.js:153:14)
    at callbacks (/app/node_modules/express/lib/router/index.js:272:11)
    at param (/app/node_modules/express/lib/router/index.js:246:11)
    at pass (/app/node_modules/express/lib/router/index.js:253:5)
    at Router._dispatch (/app/node_modules/express/lib/router/index.js:280:4)
    at Object.handle (/app/node_modules/express/lib/router/index.js:45:10)
    at Context.next (/app/node_modules/express/node_modules/connect/lib/http.js:204:15)
    at Context.<anonymous> (/app/node_modules/passport/lib/passport/context/http/actions.js:64:8)

有什么建议吗?

4

12 回答 12

22

YUHU 我解决了。问题是有时我的网站有 www 有时没有,所以显然会话存在问题。

于 2012-07-03T08:47:35.150 回答
13

我在使用 Node.js、Express 和 Passport 时也遇到了这个错误,尽管我的修复与上面描述的不同。

我从“快速会话”文档中复制并粘贴了以下代码......

app.use(session({ secret: 'keyboard cat', key: 'sid', cookie: { secure: true }}))

安全:真实位指示 express-session 使用“https”,我在我的开发环境中没有设置。一旦我删除它,错误就消失了。

于 2014-05-12T13:24:21.547 回答
5

这是一个很晚的答案,但我只是想出了另一个可能发生这种情况的原因。当制作express-session的人说 MemoryStore 不是用于生产时,他们是认真的。

如果您使用集群(pm2 或永久或在 Heroku 上运行),那么基于内存的 cookie 存储有其自身的一系列问题。您经常会丢失 cookie 或损坏它们(因为服务器端有两个或多个单独的进程,不共享公共内存)。

如果你想用集群运行你的 Node 应用程序,你需要使用 Redis 或一些数据库支持的 cookie 存储

于 2017-04-04T23:21:02.630 回答
4

在 Twitter 应用设置中,确保以下字段具有这些值:

网址: http: //127.0.0.1 :3000

回调地址: http: //127.0.0.1 :3000/auth/twitter/callback

**我正在使用端口号 3000。您可以将其更改为您正在使用的任何端口。

现在,在浏览器中导航到http://127.0.0.1:3000 。这应该可以解决您的问题。

于 2015-07-30T06:01:29.697 回答
3

这完全是随机的,而且我是 Node 新手……所以请随意使用盐。

实际上,我今晚看到了这个错误和一个非常相似的堆栈跟踪。原来,我刚刚将我的身份验证回调路由更改为如下所示:

app.use('/auth/twitter/callback', twitterCallback);

看看我是如何在use那里使用而不是get?一旦我把它改回来,我就不再收到这个错误了。

不过,我的堆栈跟踪看起来有点不同:

DEBUG: Error: failed to find request token in session
     at Strategy.<anonymous> (/Users/drhayes/src/incursion/node_modules/passport-twitter/node_modules/passport-oauth/lib/passport-oauth/strategies/oauth.js:122:54)  
     at Strategy.authenticate (/Users/drhayes/src/incursion/node_modules/passport-twitter/lib/passport-twitter/strategy.js:82:40)  
     at Passport.authenticate (/Users/drhayes/src/incursion/node_modules/passport/lib/passport/middleware/authenticate.js:153:14)  
     at Object.handle (native)  
     at next (/Users/drhayes/src/incursion/node_modules/express/node_modules/connect/lib/http.js:204:15)  
     at /Users/drhayes/src/incursion/node_modules/passport/lib/passport/middleware/authenticate.js:99:9  
     at /Users/drhayes/src/incursion/node_modules/passport/lib/passport/http/request.js:46:7  
     at pass (/Users/drhayes/src/incursion/node_modules/passport/lib/passport/index.js:229:30)  
     at /Users/drhayes/src/incursion/node_modules/passport/lib/passport/index.js:237:36  
     at /Users/drhayes/src/incursion/routes/auth.coffee:42:14  

您的来源最近是否发生了变化?您部署的 slug 中是否存在修订问题?

于 2012-06-21T06:36:19.350 回答
2

就我而言,这是由于反向代理和安全 cookie。设置app.set('trust proxy', 1)解决了这个问题。

https://github.com/expressjs/session/issues/281#issuecomment-191327863

于 2017-08-17T08:53:25.203 回答
2

我有同样的问题,解决方案是,使用http://127.0.0.1:3000/而不是http://localhost:3000获取站点,当请求发生时一切正常。

于 2018-10-19T18:23:25.670 回答
1

Twitter 不接受 localhost 所以我被迫使用以下设置:

https://apps.twitter.com/app/ ....

website = http://127.0.0.1:3000
callback url: http://localhost:3000/login/twitter/callback

护照上:

'callbackURL'       : 'http://localhost:3000/login/twitter/callback'

注意:twitter 回调 url 使用 127.0.0.1 和 localhost

于 2017-02-01T20:24:26.023 回答
1

我使用了 passport-flickr 并通过将127.0.0.1更改为localhost解决了同样的问题

passport.use(new FlickrStrategy({
    ...
    callbackURL: "http://localhost:3000/auth/flickr/callback"
  },
于 2017-07-04T12:35:25.750 回答
0

我有一次,我通过更改回调 URL 来修复它

127.0.0.1

本地主机

于 2016-02-06T23:56:52.177 回答
0

sameSite似乎是另一个罪魁祸首。从

const SESSION_OPTIONS = {
  ...
  cookie: {
    sameSite: true,
  },
};

const SESSION_OPTIONS = {
  ...
  cookie: {
    sameSite: app.get('env') === 'production' ? true : false,
  },
};

为我做了伎俩。

于 2019-06-03T18:55:20.420 回答
0

对我来说相同的症状(没有请求令牌),但在这里尝试其他解决方案没有帮助(secure: false, localhostvs127.0.0.1等)

原来问题是由于使用cookie-session. 就我而言,我为该expires选项传递了一个数字,但该选项需要一个日期。改为使用maxAge,它需要一个数字。

于 2019-11-05T21:22:46.680 回答