4 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
這個(gè)問題似乎是一個(gè)競(jìng)爭(zhēng)條件,如果你碰巧同時(shí)收到兩個(gè)請(qǐng)求,在飛行中,當(dāng)一個(gè)請(qǐng)求完成時(shí),它會(huì)在另一個(gè)有機(jī)會(huì)完成之前清除會(huì)話 cookie。不管怎樣,您不是唯一遇到此問題的人。
不過,我認(rèn)為這不是庫(kù)本身的問題,我認(rèn)為問題更多在于會(huì)話庫(kù)。您可能想嘗試將/選項(xiàng)設(shè)置為express-session的庫(kù),并檢查您是否仍然看到相同的問題,例如saveUninitializedresavefalse
const session = require('express-session');
...
app.use(session({
saveUninitialized: false,
resave: false
});
cookie-session此庫(kù)與您使用的庫(kù)之間的唯一區(qū)別是express-session僅將會(huì)話 ID 存儲(chǔ)在 cookie 中,數(shù)據(jù)存儲(chǔ)在服務(wù)器端。如果您發(fā)現(xiàn)它有效,那么您可以考慮使用更具生產(chǎn)級(jí)的商店(默認(rèn)設(shè)置是使用內(nèi)存中的商店運(yùn)行)。
FWIW - 你只需要配置一次策略,看看它做了什么,如果它是問題的一部分我會(huì)感到驚訝但我會(huì)修復(fù)它以防萬一

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
我們遇到了類似的問題,但我們有更多的間歇性行為,我們?cè)?Safari 上登錄時(shí)出現(xiàn)錯(cuò)誤,但在 Chrome 上卻沒有。
據(jù)我了解,這是因?yàn)闀?huì)話 cookie 在我們第一次進(jìn)行身份驗(yàn)證時(shí)被設(shè)置,它存儲(chǔ)state
, code-verifier
(僅當(dāng)使用 PKCE 流時(shí))和 OIDC 客戶端驗(yàn)證身份驗(yàn)證所需的其他值。
但是,當(dāng) /callback URL 被命中時(shí),瀏覽器會(huì)將此會(huì)話 cookie 發(fā)送到服務(wù)器以完成身份驗(yàn)證。
每當(dāng)未發(fā)送此 cookie 時(shí),就會(huì)發(fā)生此錯(cuò)誤,因?yàn)榛卣{(diào)假定這是一個(gè)新請(qǐng)求并且它崩潰了......
對(duì)我們來說,這有兩種表現(xiàn)方式。
Cookie { 同一站點(diǎn):'Lax' 安全:true }
適用于 chrome,但這不適用于 safari
Cookie { 同一站點(diǎn):'無' 安全:true }
適用于 chrome 和 safari
這需要在 express-session 中間件上設(shè)置(抱歉,我不確定所需的語法)

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超8個(gè)贊
一種想法是,如果您決定啟用會(huì)話,那么您需要在 passport.session() 之前使用 express.session() 以確保以正確的順序恢復(fù)用戶的登錄會(huì)話。
看這篇文章

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊
使用瀑布異步功能可能對(duì)此有所幫助。只需將 app.get 路由功能替換為以下代碼即可。當(dāng)我們必須運(yùn)行依賴于前一個(gè)任務(wù)的輸出的任務(wù)時(shí),Waterfall 會(huì)很有幫助。
app.get('/redirect', async (req, res, next) => {
await passport.authenticate('oidc',
async.waterfall([
function (err,user) {
// print second log
console.log('2. ------------redirect Called!------------');
if (err) {
console.log(`Authentication failed: ${err}`);
return next(err);
}
if (!user) {
return res.send('no identity');
}
req.login(user, async (e) => {
if (e) {
console.log('not able to login', e);
return next(e);
}
try {
const url = await azpi.GetUsers(user.id_token);
// print last log
console.log('3. ------------user process finished successfully----');
return res.redirect(url);
} catch (er) {
res.send(er.message);
}
});
}
], function (err) {
if (err) return next(err); //here you can check error
})
);
});
添加回答
舉報(bào)