2017-06-04 40 views
0

我正在使用Express和Passport登錄但出現問題:持久登錄會話不起作用Express,Passportjs持續登錄不起作用

如果我登錄req.isAuthenticated()它一直在false

我使用自定義回調Passportfetch撥打電話。從fetch收到的數據正在工作:{ success: true, user }

當我不使用自定義回調(見下文)它的工作。

作品

app.post('/login', passport.authenticate('local', { successRedirect: '/', 
                failureRedirect: '/login' })); 

不工作

app.js

app.use(morgan('tiny')) 
app.use(bodyParser.urlencoded({ extended: false })) 
app.use(bodyParser.json()) 
app.use(express.static(assetPath)) 
app.use(cookieParser()) 
app.use(
    session({ 
    secret: 'keyboard cat', 
    resave: false, 
    saveUninitialized: true, 
    cookie: { secure: true }, 
    }) 
) 
app.use(passport.initialize()) 
app.use(passport.session()) 

routes.js

router.post('/login', (req, res, next) => { 
    passport.authenticate('local', ({ user, err, message }) => { 
    if (err) { 
     return res.send({ user, err, message }) 
    } 

    if (!user) { 
     return res.send({ user, err, message }) 
    } 

    req.login(user, function(err) { 
     if (err) { 
     return next(err) 
     } 
     return res.send({ success: true, user }) 
    }) 
    })(req, res, next) 
}) 

客戶:

fetch(url, { 
     method: 'POST', 
     credentials: 'include', 
     body: JSON.stringify(values), 
     headers: { 'Content-Type': 'application/json' }, 
    }) 

回答

2

默認情況下,永久登錄存儲在會話,它採用了簽署cookie來確定未來的請求作爲同一會話的一部分。

此外默認情況下,fetch doesn't send cookies

您可以通過它們發送的cookie:

fetch(url, { 
    credentials: 'include' 
}); 

或者你可以使用一個更現代的機制,像JWTs認證。由你決定。

UPDATE

而且,你在你的會話,這是默認的,也設置secure:true意味着要求必須發生在HTTPS,否則餅乾將被清除掉。如果您不使用https,請設置secure:false。爲了獲得最佳結果,請使您可以更改生產或開發的配置設置,因爲您始終想要在生產中使用https。

+0

謝謝Paul,我添加了你的代碼,但仍然有問題。 :/ –

+0

我嘗試使用axios,但問題仍然存在... –

+0

更新了我關於您當前的代碼的其他內容。 – Paul