天天看點

使用session機制有助于防止越權操作的産生_使用者通路鑒權機制總結

1、基于 session 的鑒權機制

傳統的通路鑒權機制,使用者登入完成後,使用者資訊存放于服務端的 session 中,用戶端 cookie 中存儲 session id,每次請求會帶上 cookie,進而服務端可以通過 session id 擷取服務端 session 的使用者資訊,進而進行驗證。

這個模式問題在于伺服器是叢集或者跨域的服務導向架構,就需要 session 資料共享,每台伺服器都要能夠讀取 session。

解決方式有集中話管理 session 資料,如持久話 session 資料或者 redis 緩存 session 資料。各服務都從持久話服務或 redis 緩存中擷取 session。

當然你也可以通過将 session 資料加密然後都存儲在 cookie 中(用戶端),每次請求過來時,解密這個請求帶過來的 cookie 資料,擷取到具體的 session 資料,這樣可以解決服務叢集 session 無法

共享的問題,但無法解決跨域的問題。flask session 預設就是采用這種方式,session 資訊加密存儲在用戶端 cookie 中。

session 這種機制不完全适用于使用 api 調用的應用的 api 服務鑒權。

2、基于 token 的鑒權機制

token 機制,本質即是将原先 cookie 存放 session id,服務端根據每次請求擷取的 cookie 中 session id,找到服務端中存儲的對應 session 資訊的方式,改為 http 請求需要手動傳輸 token (正确登入後給予的令牌),服務端根據 token 擷取使用者的資訊,完成鑒權。

這種方式适用一切應用,且通過集中話管理 token 與使用者關聯資料,可以很好解決跨域及使用者資料叢集無法共享的問題,當然你可以将使用者資料加密成 token 字元串,這樣相當于使用者資料就存放在用戶端就不需要服務端集中話管理 token 與使用者關聯資料了。這也就引伸到下面的 JWT 了。

3、json web token

JWT 是一種開放标準,定義了一種資料格式,以及這個資料格式的産生方式,可以借助該資料方式在各服務間安全地傳輸資訊。

JWT 對象資料結構
使用session機制有助于防止越權操作的産生_使用者通路鑒權機制總結

HEADER、PAYLOAD 存儲的都是 JSON 對象,這裡已使用 Base64URL 加密成了一串字元。SIGNATURE 是使用 HEADER 中指明的算法将 HEADER.PAYLOAD 加密成的一串字元,用于防資料篡改。

什麼時候使用 JWT ? 授權

:這是使用 JWT 的最常見方案。一旦使用者登入,每個後續請求将包括JWT,進而允許使用者通路該令牌允許的路由,服務和資源。單一登入是當今廣泛使用JWT的一項功能,因為它的開銷很小并且可以在不同的域中輕松使用。

資訊交換

:JSON Web 令牌是在各方之間安全地傳輸資訊的好方法。因為可以對JWT進行簽名(例如,使用公鑰/私鑰對),是以您可以确定發件人是他們所說的人。此外,由于簽名是使用标頭和有效負載計算的,是以您還可以驗證内容是否遭到篡改。(郵件驗證、短信驗證)

特點

1、token 中可以存放一些有用資訊,因而有效使用可以減少伺服器查詢資料庫的次數。

2、token 預設是不加密的(PAYLOAD 存放資料隻經過 Base64URL 加密可以很容易解密回來),因而不能在 token 中存放秘密資訊。擷取 token 就可以擷取該令牌的所有權限(token 包含認證資訊),為了防止洩露造成的影響,token 的有效期應該設定較短。對于重要權限需要使用者二次認證。

3、為防止盜用,建議傳輸使用 https。

4、OAuth 2.0 什麼是 OAuth ?

OAuth(開放授權)是一個開放标準協定,允許使用者授權第三方移動應用通路他們存儲在另外的服務提供者上的資訊,而不需要将使用者名和密碼提供給第三方移動應用或分享他們資料的所有内容。

OAuth 流程包含角色

使用者:有權通路授權服務,擷取屬于自己的資源

應用:第三方應用,需要通路授權服務擷取使用者的資源,但本身不具有通路授權服務中資源的權限

授權服務:存儲使用者資源的服務

基于微信授權登入了解 OAuth 2.0 ?
使用session機制有助于防止越權操作的産生_使用者通路鑒權機制總結

1. 第三方發起微信授權登入請求,微信使用者允許授權第三方應用後,微信會拉起應用或重定向到第三方網站,并且帶上授權臨時票據code參數;

2. 通過code參數加上AppID和AppSecret等,通過API換取access_token;

3. 通過access_token進行接口調用,擷取使用者基本資料資源或幫助使用者實作基本操作。

執行個體:京東微信登入授權通路連結

1、第三方發起微信授權登入請求

https://open.weixin.qq.com/connect/qrconnect?appid=wx827225356b689e24&state=03272285F78EC3A6C1A1610A510D2DD117CF983D01AC812E5368A4BEC4DBB0EDD1D1829176BE3D270F675172471A1735&redirect_uri=https%3A%2F%2Fqq.jd.com%2Fnew%2Fwx%2Fcallback.action%3Fview%3Dnull%26uuid%3Dd9440d7102974f2a86a9322633a25131&response_type=code&scope=snsapi_login#wechat_redirect

appid,微信使用者允許授權的第三方應用;redirect_url, 微信重定向的第三方網站連結,一般是一個自動送出表單頁面。

2、授權操作完成,回跳至指定第三方網站連結即 redirect_url 位址

https://qq.jd.com/new/wx/callback.action?view=null&uuid=d9440d7102974f2a86a9322633a25131&code=code&state=state

這是一個自動表單送出頁面;通過 code、appid、secret 等通過 api 請求擷取 access token;state 是應用方提供的一個字段,微信原樣傳回給第三方應用,這個參數的作用是防止 csrf(跨站請求僞造攻擊),也可在服務中将應用通路的曆史資訊與該關鍵字對應,這樣登入完成後就可以準确回跳使用者未登入前的具體通路位址。

3、通過 access token 擷取基本資料資源

參考

1、https://jwt.io/introduction/

2、 http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

3、https://oauth.net/2/

4、 https://wiki.open.qq.com/wiki/%E3%80%90QQ%E7%99%BB%E5%BD%95%E3%80%91%E7%BD%91%E7%AB%99%E6%8E%A5%E5%85%A5

繼續閱讀