關於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>