Django中的JWT身份驗(yàn)證的實(shí)現(xiàn)
1.驗(yàn)證:身份驗(yàn)證是驗(yàn)證個(gè)人或設(shè)備標(biāo)識(shí)的過程。身份驗(yàn)證過程之一是登錄過程。注冊網(wǎng)站后,您的信息(ID,密碼,名稱,電子郵件等)將存儲(chǔ)在其數(shù)據(jù)庫中。之后,您無需創(chuàng)建帳戶即可提供信息。相反,您只需要提供用戶名和密碼來驗(yàn)證您的身份,網(wǎng)站就會(huì)自動(dòng)知道您正在訪問。
2.授權(quán):授權(quán)是用于確定用戶特權(quán)或訪問級別的安全機(jī)制。在許多社區(qū)網(wǎng)站上,只有上傳帖子和管理員的人才能刪除它。當(dāng)其他人嘗試刪除帖子時(shí),網(wǎng)站應(yīng)該拋出錯(cuò)誤(但是在許多情況下,他們甚至看不到刪除按鈕)。因此,對于每個(gè)請求,用戶都需要證明自己具有權(quán)限。
2.什么是JWTJSON Web令牌(JWT)是一種開放標(biāo)準(zhǔn)(RFC 7519),它定義了一種緊湊且自包含的方式,用于在各方之間安全地將信息作為JSON對象進(jìn)行傳輸。您可以使用JWT對請求進(jìn)行身份驗(yàn)證和授權(quán)。
JWT由三個(gè)串聯(lián)的Base64url編碼的字符串(標(biāo)頭,有效負(fù)載和簽名)組成,并用點(diǎn)號(hào)(,)分隔。標(biāo)頭包含有關(guān)令牌和加密算法類型的元數(shù)據(jù)。簽名用于驗(yàn)證令牌的可信度。有效負(fù)載包含用于身份驗(yàn)證和授權(quán)的所有必要數(shù)據(jù)。
3.存儲(chǔ)JWT當(dāng)用戶登錄時(shí),服務(wù)器將創(chuàng)建JWT并將其發(fā)送到客戶端。然后,客戶端將其存儲(chǔ)到會(huì)話存儲(chǔ)或本地存儲(chǔ)。每次客戶端向服務(wù)器端發(fā)送需要身份驗(yàn)證或授權(quán)的請求時(shí),都會(huì)在授權(quán)標(biāo)頭上發(fā)送JWT。易受XSS(跨站點(diǎn)腳本)攻擊:會(huì)話和本地存儲(chǔ)可通過JavaScript訪問。惡意第三方可以將其JS注入網(wǎng)站,從而可以向API發(fā)出請求。
服務(wù)器將JWT存儲(chǔ)在Cookie中,并使用存儲(chǔ)在Cookie中的JWT驗(yàn)證用戶。Cookies容易受到CSRF的攻擊,因?yàn)樗鼈冸S每個(gè)請求一起發(fā)送。因此,惡意的第三方可以輕松地提出意想不到的請求。
4.Django中的JWT# settings.pySECRET_KEY = ’abcde1234’,JWT_ALGORITHM = ’HS256’
# user/views.pyimport jsonfrom datetime import datetime, timdeltafrom django.conf import settingsfrom django.http import JsonResponsefrom django.views import Viewimport bcryptimport jwtfrom .models import Userfrom token_utils import user_tokenclass UserSignInView(View): def post(self, request):try: data = json.loads(request.body) username = data[’username’] pw_input = data[’password’] user = User.objects.filter(username=username).first() if user is None:return JsonResponse({'message': 'INVALID_USERNAME'}, status=401) if bcrypt.checkpw(pw_input.encode(’utf-8’), user.password.encode(’utf-8’)):key = settings.SECRET_KEYalgorithm = settings.JWT_ALGORITHMtoken = jwt.encode( {’iss’: ’me’,’id’: user.id,’exp’: datetime.utcnow() + timedelta(days=14) }, key, algorithm=algorithm).decode(’utf-8’)response = JsonResponse( {’message’: ’SUCCESS’ }, status=200)# 當(dāng)使用本地/會(huì)話存儲(chǔ)而不是Cookie時(shí),只需在JsonResponse中發(fā)送令牌if data.get(’remember_me’) is not None: max_age = 14*24*60*60 # 14 days expires = datetime.strftime(datetime.utcnow() + timedelta(seconds=max_age),'%Y-%m-%d %H:%M:%S' ) response.set_cookie(’token’,token,max_age=max_age,expires=expires,httponly=True ) return response return JsonResponse({'message': 'WRONG_PASSWORD'}, status=401)except KeyError as e: return JsonResponse({’message’: f’KEY_ERROR: {e}’}, status=400)except ValueError as e: return JsonResponse({’message’: f’VALUE_ERROR: {e}’}, status=400)
# token_utils.pyimport jsonfrom django.conf import settingsfrom django.http import JsonResponseimport jwtfrom user.models import Userdef user_token(func): def wrapper(self, request, *args, **kwargs):try: token = request.COOKIES.get(’token’) # token = request.headers.get(’token’) key = settings.SECRET_KEY algorithm = settings.JWT_ALGORITHM if token is None:return JsonResponse({'message': 'INVALID_TOKEN'}, status=401) decode = jwt.decode(token, key, algorithm=algorithm) request.user = User.objects.get(id=decode[’id’])except jwt.ExpiredSignatureError: return JsonResponse({'message': 'EXPIRED_TOKEN'}, status=400)return func(self, request, *args, **kwargs) return wrapper
到此這篇關(guān)于Django中的JWT身份驗(yàn)證的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Django JWT身份驗(yàn)證內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. ASP使用MySQL數(shù)據(jù)庫的方法2. ASP中解決“對象關(guān)閉時(shí),不允許操作。”的詭異問題……3. 解決ASP中http狀態(tài)跳轉(zhuǎn)返回錯(cuò)誤頁的問題4. xml中的空格之完全解說5. WMLScript的語法基礎(chǔ)6. msxml3.dll 錯(cuò)誤 800c0019 系統(tǒng)錯(cuò)誤:-2146697191解決方法7. XML入門的常見問題(四)8. ASP中if語句、select 、while循環(huán)的使用方法9. html小技巧之td,div標(biāo)簽里內(nèi)容不換行10. ASP動(dòng)態(tài)網(wǎng)頁制作技術(shù)經(jīng)驗(yàn)分享
