4 回答

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

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

TA貢獻1811條經驗 獲得超4個贊
使用瀑布異步功能可能對此有所幫助。只需將 app.get 路由功能替換為以下代碼即可。當我們必須運行依賴于前一個任務的輸出的任務時,Waterfall 會很有幫助。
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
})
);
});
添加回答
舉報