dajngo_itsdjangerous_itsdangerous.exc.BadSignature: Signature b"XXXXX'" does not match

問題描述:

編寫註冊頁面時,在用戶註冊郵箱中點擊鏈接進行註冊確認,但是在郵箱超鏈接點擊後報錯,如下:

itsdangerous.exc.BadSignature: Signature b"GGwbVva0BvK3k9FYiUMgLgInM_WPtv4fG2asDCfibgquMXt3ISNUgXMKMKoS6uWHMSAZLifPd7kqEwcNrT0iIA'" does not match

加密代碼

from itsdangerous import TimedJSONWebSignatureSerializer as  Serializer
serializer = Serializer(settings.SECRET_KEY, 3600)
info = {"confirm": user.id}
# 轉換成bytes 二進制數據,
token = serializer.dumps(info)
Traceback (most recent call last):
  File "F:\django_learn_project5\dailyfresh\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "F:\django_learn_project5\dailyfresh\venv\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "F:\django_learn_project5\dailyfresh\venv\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "F:\django_learn_project5\dailyfresh\venv\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "F:\django_learn_project5\dailyfresh\venv\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "F:\django_learn_project5\dailyfresh\apps\user\views.py", line 115, in get
    info = serializer.loads(token)
  File "F:\django_learn_project5\dailyfresh\venv\lib\site-packages\itsdangerous\jws.py", line 187, in loads
    self, s, salt, return_header=True
  File "F:\django_learn_project5\dailyfresh\venv\lib\site-packages\itsdangerous\jws.py", line 143, in loads
    self.make_signer(salt, self.algorithm).unsign(want_bytes(s)),
  File "F:\django_learn_project5\dailyfresh\venv\lib\site-packages\itsdangerous\signer.py", line 169, in unsign
    raise BadSignature("Signature %r does not match" % sig, payload=value)
itsdangerous.exc.BadSignature: Signature b"GGwbVva0BvK3k9FYiUMgLgInM_WPtv4fG2asDCfibgquMXt3ISNUgXMKMKoS6uWHMSAZLifPd7kqEwcNrT0iIA'" does not match

原因分析:

代碼中 serializer.dumps(info)函數生成bytes類型數據,所以不能黨走str類型進行處理,dumps源代碼如下

    def dumps(self, obj, salt=None, header_fields=None):
        """Like :meth:`.Serializer.dumps` but creates a JSON Web
        Signature. It also allows for specifying additional fields to be
        included in the JWS header.
        """
        header = self.make_header(header_fields)
        signer = self.make_signer(salt, self.algorithm)
        return signer.sign(self.dump_payload(header, obj))

signer.sign源代碼如下

    def sign(self, value):
        """Signs the given string."""
        return want_bytes(value) + want_bytes(self.sep) + self.get_signature(value)

 解決方案:

將bytes類型結果轉爲utf8類型

serializer = Serializer(settings.SECRET_KEY, 3600)
info = {"confirm": user.id}
# 轉換成bytes 二進制數據,
token = serializer.dumps(info)
token = token.decode()

 

字節串(bytes)和字符串(string)的對比:

  • 字符串由若干個字符組成,以字符爲單位進行操作;字節串由若干個字節組成,以字節爲單位進行操作。
  • 字節串和字符串除了操作的數據單元不同之外,它們支持的所有方法都基本相同。
  • 字節串和字符串都是不可變序列,不能隨意增加和刪除數據。


bytes 只負責以字節序列的形式(二進制形式)來存儲數據,至於這些數據到底表示什麼內容(字符串、數字、圖片、音頻等),完全由程序的解析方式決定。如果採用合適的字符編碼方式(字符集),字節串可以恢復成字符串;反之亦然,字符串也可以轉換成字節串。

說白了,bytes 只是簡單地記錄內存中的原始數據,至於如何使用這些數據,bytes 並不在意,你想怎麼使用就怎麼使用,bytes 並不約束你的行爲。

bytes 類型的數據非常適合在互聯網上傳輸,可以用於網絡通信編程;bytes 也可以用來存儲圖片、音頻、視頻等二進制格式的文件。

參考:http://c.biancheng.net/view/2175.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章