我正在使用passport在facebook,google,github,twitter身份验证上工作。 facebook,google,github的身份验证正在执行tutorial的编写方式。只有Twitter回复我的消息:
500 Internal Server Error: OAuth authentication requires session support. Did you forget to use express-session middleware?
然后我添加了快速会话中间件(见下文),我的问题已经消失。
import * as expressSession from "express-session";
app.use(expressSession({
secret: strategyOptions.session.secret,
resave: false,
saveUninitialized: true
}));
所以我有3个问题:
1)为什么twitter身份验证需要会话支持?
requestTokenStore
在交换之前存储令牌。默认情况下,它是来自SessionRequestTokenStore
的passport-oauth1
。2)我猜测只有我的后端和前端知道会话。 Twitter如何了解我的会话?
3)为什么Google,Facebook,Github不需要会话支持?
passport-oauth2
,它不需要requestTokenStore
(会话)。1.为什么twitter身份验证需要会话支持?
使用OAuth 1.0a使用Twitter进行身份验证的工作方式如下:
您会注意到服务器从Twitter获取请求令牌的步骤,然后将用户发送到Twitter进行授权。当用户重定向回站点时,服务器将交换请求令牌和访问令牌的验证令牌。但是,当用户将用户重定向回网站时,Twitter不会提供请求令牌。因此,服务器需要一种方法来在第一次获取时保存请求令牌,以便在重定向用户时可以检索它。会话用于保存请求令牌。
我猜测只有我的后端和前端知道会话。 Twitter如何了解我的会话?
你是对的,Twitter对你的会话一无所知。会话基本上是存储在用户浏览器中的cookie中的ID,以及与服务器上的该ID相关联的一组数据。因此,用户在发出请求时发送会话ID(与所有请求一起发送cookie),并且该ID用于在服务器上查找数据。
基于(1)的答案,当用户从Twitter重定向回站点时,会话ID用于检索请求令牌。 Twitter不知道(或关心)该请求令牌的存储方式。你可能会以另一种方式存储它,Twitter也不会知道它的区别。
3.为什么Google,Facebook,Github不需要会话支持?
谷歌,Facebook和Github可能使用OAuth 2而不是OAuth 1.0a。 OAuth 2的工作方式不同,因此不需要存储请求令牌。 Twitter实际上是supports OAuth 2。但是,它仅用于应用程序身份验证,而不用于应用程序用户身份验证。因此,您可以使用OAuth 2对您的应用程序进行身份验证,并将API用作您的应用程序。但您无法使用OAuth 2代表用户查询API。换句话说,Twitter不允许您使用OAuth 2来验证您的应用程序是否代表用户使用。
@ C0dekid。在我的情况下它是:
export const strategyOptions = {
...,
session: { secret: process.env.SESSION_SECRET || 'SESSION redux-serviceauth-example' },
...};