關於flask實現一個sso單點登錄demo


關於flask實現一個sso單點登錄demo

  • 網上有太多SSO單點登錄原理,又是cookie,session之類的。看的越多,頭就越大。簡單利用flask實現一個單點登錄。

  • 場景:我們有一個A網站還有一個B網站,我們在登錄A網站,那么訪問B網站也同時登錄。沒必要再去重新登錄B,我們通過Iframe實現。

  • 從A ----> B 傳遞 可以通過 postMessage解決跨域、跨窗口消息傳遞

  • 這里:開8000端口代表A, 7000端口代表B

  • 后台代碼:

    from flask import Flask,render_template
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        return render_template("index.html")
    
    if __name__ == '__main__':
        app.run(host="127.0.0.1", port=8000)# A
        app.run(host="127.0.0.1", port=7000)# B
    
  • 前台代碼

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>這是demo1的html頁面</title>
    </head>
    <body>
    <p>
        <button onclick="login();" id="login">同步登錄</button>
        <p id="loginOut" style="display: none;">該用戶已經登錄
            <button onclick="localStorage.clear();" id="login">注銷</button>
        </p>
    </p>
    <iframe src="http://127.0.0.1:7000/" style="height: 0px;width: 0px;display: none;"></iframe>
    </body>
    <script>
        // 用於顯示同步登陸
        var authToken=localStorage.getItem('authToken')
        if(authToken){
            document.getElementById('login').style.display='none';
            document.getElementById('loginOut').style.display='block';
        }
    
        // 同步登陸
        function login(){
            // 這里data 相當於訪問后台接口並獲取token
            let data=JSON.stringify({
                token:'這是一個token',
            })
            // data傳入iframe
            document.getElementsByTagName('iframe')[0].contentWindow.postMessage(data,'*');
        }
    
        // 監聽:有消息的話,會把token存入 瀏覽器中
        window.addEventListener('message',function(e){
            console.log(e.data)
            if(e.source!=window.parent) return;
            localStorage.setItem("authToken",e.data);
        },false);
    </script>
    </html>
    
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM