python3使用saml2.0協議接入SSO
阿新 • • 發佈:2018-11-19
SAML(Security Assertion Markup Language)是一個 XML 框架,也就是一組協議,可以用來傳輸安全宣告。比如,兩臺遠端機器之間要通訊,為了保證安全,我們可以採用加密等措施,也可以採用 SAML 來傳輸,傳輸的資料以 XML 形式,符合 SAML 規範,這樣我們就可以不要求兩臺機器採用什麼樣的系統,只要求能理解 SAML 規範即可。
其核心是: IDP和SP通過使用者的瀏覽器的重定向訪問來實現交換資料。
SP向IDP發出SAML身份認證請求訊息,來請求IDP鑑別使用者身份;IDP向用戶索要使用者名稱和口令,並驗證其是否正確,如果驗證無誤,則向SP返回SAML身份認證應答,表示該使用者已經登入成功了,此外應答中裡還包括一些額外的資訊,來卻確保應答被篡改和偽造。
本人在網上找了一張圖片,感覺比較好的說明了saml2.0的SSO認證的過程:
本人是python研發工程師,所以以python3為例,說明我是如何接入我們公司的SSO的。
本人使用的是python3-saml庫
1.準備所需要的json資料
req = { "idp": { "entityId": data["sso"]["login-url"], "singleSignOnService": { "url": data["sso"]["login-url"] }, "singleLogoutService": { "url": "{0}?service={1}".format( data["sso"]["logout-url"], url) } }, "sp": { "entityId": url, "singleSignOnService": { "url": data["sso"]["login-url"] }, "assertionConsumerService": { "url": url }, "singleLogoutService": { "url": "{0}?service={1}".format( data["sso"]["logout-url"], url) }, "NameIDFormat": "urn:oasis:names:tc:SAML:2.0:assertion" } }
將登入認證伺服器的請求地址寫到idp和sp的singleSignOnService,將登入後跳轉的地址寫到sp的entityId和assertionConsumerService,將登出認證伺服器的地址和登入後要跳轉的地址寫到sp和idp的singleLogoutService
2.使用python3-saml庫
以django為例演示登入
def login(request): one_login = OneLogin_Saml2_Settings(req) login = OneLogin_Saml2_Authn_Request(one_login) result = quote(login.get_request()) return HttpResponseRedirect(result)
之後跳轉至SSO的統一登入介面,然後輸入使用者名稱和密碼進行驗證。校驗通過後,登入認證伺服器會發送POST請求將使用者名稱等資訊通過base64加密的方式傳給你,你解析做處理。
以django為例演示登出
def logout(reqeust):
one_login = OneLogin_Saml2_Settings(req)
logout_request = OneLogin_Saml2_Logout_Request(one_login)
parameters = {'SAMLRequest': logout_request.get_request()}
uri = logout_url + '?service={}'.format(domain + address)
logout_url = OneLogin_Saml2_Utils.redirect(uri, parameters, True)
return HttpResponseRedirect(logout_url)
之後跳回SSO統一登入介面。