国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JWT驗(yàn)證

894974231 / 2105人閱讀

摘要:是目前最流行的跨域身份驗(yàn)證解決方案。由于是對(duì)稱加密算法,所以可以輕松解密因此我們?cè)谪?fù)載部分不要將私密信息放置在里面,只需要把能驗(yàn)證唯一的標(biāo)識(shí)信息添加就可以了。加密算法,必須設(shè)置為一個(gè),或。驗(yàn)證標(biāo)頭同時(shí)也驗(yàn)證,一般不用本文參考

JWT(Json Web Token):是目前最流行的跨域身份驗(yàn)證解決方案。
此前我們使用的身份驗(yàn)證方式都是基于Session:

這種方式并沒(méi)有什么不妥,但其實(shí)這里有三個(gè)缺點(diǎn):

Session一般存儲(chǔ)在redis中,而redis數(shù)據(jù)保存在內(nèi)存中,隨著用戶的增多,內(nèi)存消耗太大。

擴(kuò)展性不好,用戶每次驗(yàn)證都需要請(qǐng)求session服務(wù)器,增大了負(fù)載均衡能力,應(yīng)用擴(kuò)展受限。

因?yàn)槭腔赾ookie來(lái)進(jìn)行用戶識(shí)別的, cookie如果被截獲,用戶就會(huì)很容易受到跨站請(qǐng)求偽造的攻擊。

所以,我們需要一種既能實(shí)現(xiàn)相同要求并且還要比session存儲(chǔ)更有效的身份驗(yàn)證方式。


JWT通過(guò)一種加密的方式,將加密后的數(shù)據(jù)保存返回給用戶本地進(jìn)行保存,我們稱為token數(shù)據(jù)。其數(shù)據(jù)由三部分組成:

1、header聲明類型和加密的算法:

{
  "typ": "JWT",    #固定值
  "alg": "HS256"    #加密算法
}

2、payload負(fù)載
這是有效信息的存放地方,其分為三部分:標(biāo)準(zhǔn)中注冊(cè)的聲明、公共聲明、私有聲明(用戶信息)
標(biāo)準(zhǔn)中的注冊(cè)聲明(有需要在使用,不強(qiáng)制使用):
iss: jwt簽發(fā)者
sub: jwt所面向的用戶
aud: 接收jwt的一方
exp: jwt的過(guò)期時(shí)間,這個(gè)過(guò)期時(shí)間必須要大于簽發(fā)時(shí)間
nbf: 定義在什么時(shí)間之前,該jwt都是不可用的.
iat: jwt的簽發(fā)時(shí)間
jti: jwt的唯一身份標(biāo)識(shí),主要用來(lái)作為一次性token,從而回避重放攻擊。
公共聲明:公共的聲明可以添加任何的信息,一般添加用戶的相關(guān)信息或其他業(yè)務(wù)需要的必要信息.
私有聲明:

{
  "name": "jim",
  "id": "111111",
  "admin": true
}

3、signature簽名
需要base64加密后的header和base64加密后的payload使用.連接組成的字符串,然后通過(guò)header中聲明的加密方式進(jìn)行加鹽secret組合加密,然后就構(gòu)成了jwt的第三部分。由于base64是對(duì)稱加密算法,所以可以輕松解密:因此我們?cè)谪?fù)載部分不要將私密信息放置在里面,只需要把能驗(yàn)證唯一的標(biāo)識(shí)信息添加就可以了。
有關(guān)base64,請(qǐng)參考:https://www.liaoxuefeng.com/w...
由于目前在學(xué)習(xí)DRF,所以我介紹一下怎樣在DRF項(xiàng)目中使用JWT進(jìn)行身份驗(yàn)證:
安裝djangorestframework-jwt:

pip install djangorestframework-jwt

添加jwt認(rèn)證類:

REST_FRAMEWORK = {
    "DEFAULT_PERMISSION_CLASSES": (
        "rest_framework.permissions.IsAuthenticated",
    ),
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "rest_framework_jwt.authentication.JSONWebTokenAuthentication",
        "rest_framework.authentication.SessionAuthentication",
        "rest_framework.authentication.BasicAuthentication",
    ),
}

添加jwt路由用于生成token:

from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    url(r"^自己的路由/", obtain_jwt_token),
]

然后我們就可以通過(guò)自己添加的路由并通過(guò)post添加username和password來(lái)獲取到token了,在進(jìn)行訪問(wèn)頁(yè)面的時(shí)候我們只需要在請(qǐng)求頭中添加一個(gè):Authorization: JWT ,就可以得到驗(yàn)證了。
當(dāng)然我們可能不止只需要token數(shù)據(jù),還需要用戶的ID,昵稱等信息,那么我們就需要手動(dòng)生成token數(shù)據(jù)。

from rest_framework_jwt.settings import api_settings
    
    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
    
    payload = jwt_payload_handler(user)    #這里的用戶對(duì)象就是在登錄視圖中獲取到的user
    token = jwt_encode_handler(payload)

當(dāng)然我們前面已經(jīng)說(shuō)明payload中最好不要存儲(chǔ)私密信息,所以我們?cè)谔幚韚ser前需要將不需要的字段刪除:

del user.set_password("")    #當(dāng)然這樣做肯定不科學(xué),但是我們由于這里沒(méi)有場(chǎng)景,所以我先這樣做,有需要的同學(xué)可以私聊我。

然后我們可以將返回到前端的數(shù)據(jù)進(jìn)行保存,方便下次訪問(wèn)攜帶:
前端響應(yīng)中使用的代碼格式
關(guān)于session和local存儲(chǔ):https://www.cnblogs.com/st-le...

sessionStorage.變量名 = 變量值   // 保存數(shù)據(jù)
sessionStorage.變量名  // 讀取數(shù)據(jù)
sessionStorage.clear()  // 清除所有sessionStorage保存的數(shù)據(jù)

localStorage.變量名 = 變量值   // 保存數(shù)據(jù)
localStorage.變量名  // 讀取數(shù)據(jù)
localStorage.clear()  // 清除所有l(wèi)ocalStorage保存的數(shù)據(jù)

最后利用localStorage與sessionStorage讀取數(shù)據(jù)的方式在需要后端驗(yàn)證的地方添加token數(shù)據(jù)。
所有配置參考:

JWT_AUTH = {
    "JWT_ENCODE_HANDLER":
    "rest_framework_jwt.utils.jwt_encode_handler",    #加密處理函數(shù)

    "JWT_DECODE_HANDLER":
    "rest_framework_jwt.utils.jwt_decode_handler",    #解密處理函數(shù)

    "JWT_PAYLOAD_HANDLER":
    "rest_framework_jwt.utils.jwt_payload_handler",    #指定自定義函數(shù)以生成令牌有效內(nèi)容

    "JWT_PAYLOAD_GET_USER_ID_HANDLER":
    "rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler",    #如果您的存儲(chǔ)username方式與默認(rèn)的有效負(fù)載處理程序不同,請(qǐng)實(shí)現(xiàn)此功能以u(píng)sername從有效負(fù)載中獲取

    "JWT_RESPONSE_PAYLOAD_HANDLER":        #負(fù)責(zé)控制登錄或刷新后返回的響應(yīng)數(shù)據(jù)。覆蓋以返回自定義響應(yīng)
    "rest_framework_jwt.utils.jwt_response_payload_handler",

    "JWT_SECRET_KEY": settings.SECRET_KEY,    #使用系統(tǒng)全局的SECRET_KEY
    "JWT_GET_USER_SECRET_KEY": None,    #這是JWT_SECRET_KEY的更強(qiáng)大版本。它是根據(jù)用戶定義的,因此如果令牌被泄露,可以由所有者輕松更改。更改此值將使給定用戶的所有令牌都無(wú)法使用。值應(yīng)該是一個(gè)函數(shù),接受用戶作為唯一參數(shù)并返回它的密鑰。
    "JWT_PUBLIC_KEY": None,
    "JWT_PRIVATE_KEY": None,
    "JWT_ALGORITHM": "HS256",    #加密算法,必須設(shè)置為一個(gè)RS256,RS384或RS512。
    "JWT_VERIFY": True,
    "JWT_VERIFY_EXPIRATION": True,
    "JWT_LEEWAY": 0,
    "JWT_EXPIRATION_DELTA": datetime.timedelta(seconds=300),    #設(shè)置有效期
    "JWT_AUDIENCE": None,
    "JWT_ISSUER": None,    #這是一個(gè)字符串,將根據(jù)iss令牌字段進(jìn)行檢查。默認(rèn)是None(不要檢查issJWT)
    "JWT_ALLOW_REFRESH": False,
    "JWT_REFRESH_EXPIRATION_DELTA": datetime.timedelta(days=7),    #設(shè)置令牌刷新時(shí)間,默認(rèn)為datetime.timedelta(days=7)(7天)

    "JWT_AUTH_HEADER_PREFIX": "JWT",    #您可以修改需要與令牌一起發(fā)送的Authorization標(biāo)頭值前綴。默認(rèn)值為JWT,用于令牌和授權(quán)標(biāo)頭的另一個(gè)常見(jiàn)值是Bearer。

    "JWT_AUTH_COOKIE": None,    #驗(yàn)證Authorization標(biāo)頭同時(shí)也驗(yàn)證cookie,一般不用

}

本文參考:https://lion1ou.win/2017/01/18/

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43092.html

相關(guān)文章

  • JWT驗(yàn)證

    摘要:是目前最流行的跨域身份驗(yàn)證解決方案。由于是對(duì)稱加密算法,所以可以輕松解密因此我們?cè)谪?fù)載部分不要將私密信息放置在里面,只需要把能驗(yàn)證唯一的標(biāo)識(shí)信息添加就可以了。加密算法,必須設(shè)置為一個(gè),或。驗(yàn)證標(biāo)頭同時(shí)也驗(yàn)證,一般不用本文參考 JWT(Json Web Token):是目前最流行的跨域身份驗(yàn)證解決方案。此前我們使用的身份驗(yàn)證方式都是基于Session:showImg(https://se...

    honhon 評(píng)論0 收藏0
  • JWT驗(yàn)證

    摘要:是目前最流行的跨域身份驗(yàn)證解決方案。由于是對(duì)稱加密算法,所以可以輕松解密因此我們?cè)谪?fù)載部分不要將私密信息放置在里面,只需要把能驗(yàn)證唯一的標(biāo)識(shí)信息添加就可以了。加密算法,必須設(shè)置為一個(gè),或。驗(yàn)證標(biāo)頭同時(shí)也驗(yàn)證,一般不用本文參考 JWT(Json Web Token):是目前最流行的跨域身份驗(yàn)證解決方案。此前我們使用的身份驗(yàn)證方式都是基于Session:showImg(https://se...

    cfanr 評(píng)論0 收藏0
  • php 后端實(shí)現(xiàn)JWT認(rèn)證方法

    摘要:基于的身份驗(yàn)證可以替代傳統(tǒng)的身份驗(yàn)證方法。例如可自定義示例如下該的簽發(fā)者簽發(fā)時(shí)間過(guò)期時(shí)間該時(shí)間之前不接收處理該面向的用戶該唯一標(biāo)識(shí)部分對(duì)應(yīng)的簽名為最終得到的的為說(shuō)明對(duì)和進(jìn)行編碼后進(jìn)行拼接。 JWT是什么 JWT是json web token縮寫(xiě)。它將用戶信息加密到token里,服務(wù)器不保存任何用戶信息。服務(wù)器通過(guò)使用保存的密鑰驗(yàn)證token的正確性,只要正確即通過(guò)驗(yàn)證。基于token的...

    hiyang 評(píng)論0 收藏0
  • 如何在SpringBoot中集成JWT(JSON Web Token)鑒權(quán)

    摘要:在使用非對(duì)稱加密算法進(jìn)行簽名的時(shí)候,還可以用于驗(yàn)證的發(fā)件人是否與中申明的發(fā)件人是同一個(gè)人。如果沒(méi)有用非對(duì)稱加密算法的話,把復(fù)制之后直接可以去官網(wǎng)在線解析。 這篇博客主要是簡(jiǎn)單介紹了一下什么是JWT,以及如何在Spring Boot項(xiàng)目中使用JWT(JSON Web Token)。 1.關(guān)于JWT 1.1 什么是JWT 老生常談的開(kāi)頭,我們要用這樣一種工具,首先得知道以下幾個(gè)問(wèn)題。 這...

    yeyan1996 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<