我正在使用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个问题:
答案 0 :(得分:1)
1)为什么推特认证需要会话支持?
requestTokenStore
才能在交换之前存储令牌。默认情况下,SessionRequestTokenStore
来自passport-oauth1
。2)我猜测只有我的后端和前端知道会话。 Twitter如何了解我的会话?
3)为什么Google,Facebook,Github不需要会话支持?
passport-oauth2
,不需要requestTokenStore
(会话)。答案 1 :(得分:1)
1。为什么Twitter身份验证需要会话支持?
使用OAuth 1.0a与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来验证要代表用户使用的应用程序。
答案 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)]