【问题标题】:Why passport-twitter requires session support为什么护照推特需要会话支持
【发布时间】:2017-10-19 16:08:58
【问题描述】:

我正在使用passport 进行 facebook、google、github、twitter 身份验证。 facebook、google、github 的身份验证正在执行tutorial 中的编写方式。只有推特回复我消息:

500 Internal Server Error: OAuth authentication requires session support. Did you forget to use express-session middleware?

然后我添加了 express-session 中间件(如下所示),我的问题就解决了。

import * as expressSession from "express-session";

app.use(expressSession({
    secret: strategyOptions.session.secret,
    resave: false,
    saveUninitialized: true
}));

所以我有 3 个问题:

  1. 为什么 twitter 身份验证需要会话支持?
  2. 我猜只有我的后端和前端知道会话。 Twitter 如何知道我的会话?
  3. 为什么 Google、Facebook、Github 不需要会话支持?

【问题讨论】:

  • 3) Google、FB、GH 是不同的社区。他们对 API 有其他要求。
  • @BogdanSurai 我也遇到了同样的问题。你能告诉我 strategyOptions.session.secret 中包含什么
  • @C0dekid 我在下面为你写了一条评论。

标签: session authentication twitter passport.js express-session


【解决方案1】:

1) 为什么 twitter 身份验证需要会话支持?

  • twitter 身份验证需要requestTokenStore 在交换之前存储令牌。默认情况下,它是来自passport-oauth1SessionRequestTokenStore

2) 我猜只有我的后端和前端知道会话。 Twitter 如何知道我的会话?

  • twitter 身份验证是在您的后端运行的中间件,因此它知道您的会话。

3) 为什么 Google、Facebook、Github 不需要会话支持?

  • Google、Facebook、Github 使用 passport-oauth2,而无需 requestTokenStore(会话)。

【讨论】:

    【解决方案2】:

    1.为什么 twitter 身份验证需要会话支持?

    使用 OAuth 1.0a 通过 Twitter 进行身份验证的工作方式如下:

    (来自https://medium.com/@robince885/how-to-do-twitter-authentication-with-react-and-restful-api-e525f30c62bb

    您会注意到有一个步骤,服务器从 Twitter 获取请求令牌,然后将用户发送到 Twitter 进行授权。当用户被重定向回站点时,服务器会将请求令牌和验证令牌交换为访问令牌。但是当 Twitter 将用户重定向回站点时,它不会提供请求令牌。所以服务器需要一种方法在第一次获取请求令牌时保存它,以便在用户被重定向回来时可以检索到它。会话用于保存请求令牌。

    2。我猜只有我的后端和前端知道会话。 Twitter 如何知道我的会话?

    您说得对,Twitter 对您的会话一无所知。会话基本上是存储在用户浏览器中的 cookie 中的 ID,也是与服务器上该 ID 关联的一组数据。因此,用户在发出请求时会发送会话 ID(cookie 随所有请求一起发送),该 ID 用于在服务器上查找数据。

    基于 (1) 的答案,当用户从 Twitter 重定向回网站时,会话 ID 用于检索请求令牌。 Twitter 不知道(或关心)该请求令牌是如何存储的。您可能会以另一种方式存储它,而 Twitter 不会知道其中的区别。

    3.为什么 Google、Facebook、Github 不需要会话支持?

    Google、Facebook 和 Github 可能会使用 OAuth 2 而不是 OAuth 1.0a。 OAuth 2 的工作方式不同,因此不需要存储请求令牌。 Twitter实际上supports OAuth 2。但是,它用于仅应用程序身份验证而不是应用程序用户身份验证。因此,您可以使用 OAuth 2 来验证您的应用程序,并将 API 用作您的应用程序。但是您不能使用 OAuth 2代表用户查询 API。换句话说,Twitter 不允许您使用 OAuth 2 来验证您的应用程序以代表用户使用。

    【讨论】:

    • 这仍然准确吗? twitter 已经迁移到 oAuth 2.0 了吗? 2020 年
    【解决方案3】:

    @C0dekid。就我而言,它是:

    export const strategyOptions = {
      ...,
      session: { secret: process.env.SESSION_SECRET || 'SESSION redux-serviceauth-example' },
    ...};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-04
      • 2016-07-28
      • 2023-03-11
      • 2014-04-13
      • 2015-07-25
      • 1970-01-01
      • 2013-02-18
      相关资源
      最近更新 更多