1. 程式人生 > >python3使用saml2.0協議接入SSO

python3使用saml2.0協議接入SSO

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統一登入介面。