亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

具有 Express 會話問題的節點

具有 Express 會話問題的節點

阿晨1998 2022-12-22 09:42:19
我使用以下有效的代碼,但是在幾次成功調用(5-10) 之后,我們有時會收到內部服務器錯誤:req.session["oidc:accounts.rvm.com"] is undefined我已經嘗試了所有的latest開源版本。Error: did not find expected authorization request details in session, req.session["oidc:accounts.rvm.com"] is undefinedat /opt/node_app/app/node_modules/openid-client/lib/passport_strategy.js:125:13at OpenIDConnectStrategy.authenticate (/opt/node_app/app/node_modules/openid-client/lib/passport_strategy.js:173:5)at attempt (/opt/node_app/app/node_modules/passport/lib/middleware/authenticate.js:366:16)at authenticate (/opt/node_app/app/node_modules/passport/lib/middleware/authenticate.js:367:7)at /opt/node_app/app/src/logon.js:92:7 *******at Layer.handle [as handle_request] (/opt/node_app/app/node_modules/express/lib/router/layer.js:95:5)at next (/opt/node_app/app/node_modules/express/lib/router/route.js:137:13)at Route.dispatch (/opt/node_app/app/node_modules/express/lib/router/route.js:112:3)at Layer.handle [as handle_request] (/opt/node_app/app/node_modules/express/lib/router/layer.js:95:5)at /opt/node_app/app/node_modules/express/lib/router/index.js:281:22我的堆棧代碼是:at /opt/node_app/app/src/logon.js:92:7這是代碼的結尾:})(req, res, next);   // here is line 92 but not sure if it's related 這是完整的代碼(我通過了app它只是一個快速服務器):索引.jsconst express = require('express');const logon = require('./logon');const app = express();const port = process.env.PORT || 4000;logon(app)  .then(() => {    console.log('process started');  });app.use(express.json());app.listen(port,  () => console.log(`listening on port: ${port}`));有時當我調試時,我看到函數正在運行,GetUsers這是一個異步函數并停止在 中})(req, res, next);,可能是異步問題。我們想在 prod 中使用這段代碼,而不是以前的 Java 實現。如果我可以對 oidc 使用另一種技術,請告訴我。
查看完整描述

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 - 你只需要配置一次策略,看看它做了什么,如果它是問題的一部分我會感到驚訝但我會修復它以防萬一


查看完整回答
反對 回復 2022-12-22
?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

我們遇到了類似的問題,但我們有更多的間歇性行為,我們在 Safari 上登錄時出現錯誤,但在 Chrome 上卻沒有。

據我了解,這是因為會話 cookie 在我們第一次進行身份驗證時被設置,它存儲statecode-verifier(僅當使用 PKCE 流時)和 OIDC 客戶端驗證身份驗證所需的其他值。

但是,當 /callback URL 被命中時,瀏覽器會將此會話 cookie 發送到服務器以完成身份驗證。

每當未發送此 cookie 時,就會發生此錯誤,因為回調假定這是一個新請求并且它崩潰了......

對我們來說,這有兩種表現方式。

  1. Cookie { 同一站點:'Lax' 安全:true }

    適用于 chrome,但這不適用于 safari

  2. Cookie { 同一站點:'無' 安全:true }

    適用于 chrome 和 safari

這需要在 express-session 中間件上設置(抱歉,我不確定所需的語法)


查看完整回答
反對 回復 2022-12-22
?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

一種想法是,如果您決定啟用會話,那么您需要在 passport.session() 之前使用 express.session() 以確保以正確的順序恢復用戶的登錄會話。

看這篇文章


查看完整回答
反對 回復 2022-12-22
?
波斯汪

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

            })   

        );

    });


查看完整回答
反對 回復 2022-12-22
  • 4 回答
  • 0 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號