为什么passport-twitter需要会话支持

时间:2017-05-19 13:36:36

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

我正在使用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身份验证需要会话支持?
  2. 我猜测只有我的后端和前端知道会话。 Twitter如何了解我的会话?
  3. 为什么Google,Facebook,Github不需要会话支持?

3 个答案:

答案 0 :(得分:1)

1)为什么推特认证需要会话支持?

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

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

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

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

  • Google,Facebook,Github使用passport-oauth2,不需要requestTokenStore(会话)。

答案 1 :(得分:1)

1。为什么Twitter身份验证需要会话支持?

使用OAuth 1.0a与Twitter进行身份验证的过程如下:

Twitter/OAuth 1.0a authentication process

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

您会注意到有一个步骤,即服务器从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来验证要代表用户使用的应用程序。

答案 2 :(得分:0)

@ C0dekid。就我而言,它是:

USE [$(DatabaseName)]
GO

-- If the user exists, drop it first
IF EXISTS (select principal_id FROM sys.database_principals where [name] = '$(DatabaseUser)' AND type = 'U')
BEGIN
    DROP USER [$(DatabaseUser)]
END

-- Create it
CREATE USER [$(DatabaseUser)] FOR LOGIN [$(SqlLogin)]

-- And add it to the Role db_datareader
ALTER ROLE db_datareader ADD MEMBER [$(DatabaseUser)]