Search code examples
pythonpython-3.xjwtodoo

How to decode string JWT token using python?


I am trying to decode SSO JWT token in my python 3.8 (odoo framework)

I am using starndard python jwt library to do this:

import jwt

def _auth_oauth_get_tokens_implicit_flow(self, params):
    print("-----------------------")
    print(params)
    print("----------------------")
    token_data = params.get('response_type').split('?token_data=')[1]
    decoded_data = jwt.decode(jwt=token_data, key='secret', algorithms=["HS256"])
    print(decoded_data)

applying this business logic it gives a following tracekback.

-----------------------
{'response_type': 'code?token_data=eyJhY2Nlc3NfdG9rZW4iOiJzRXQ1ZUxjTnFiUTdSOU9wYXI1Sm1ONVZWalk0ZlRLUVE4dEt0bGdhbklaIiwiZXhwaXJlc19pbiI6MzYwMCwiaWRfdG9rZW4iOiJleUpoYkdjaU9pSlNVekkxTmlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKMWMyVnlTV1FpT2pRME5URXNJbVZ0WVdsc0lqb2lWa3N4TmsxQldVRkhSVTVEV1VCNWIzQnRZV2xzTG1OdmJTSXNJbTVoYldVaU9pSldTekUyVFVGWklFRkhSVTVEV1NJc0luVnpaWEpVZVhCbElqb3lMQ0p5YjJ4bFNXUWlPaklzSW1WdVlXSnNaV1F5Wm1FaU9pSXdJaXdpZG1WeWFXWnBaV1F5Wm1FaU9uUnlkV1VzSW5SdmEyVnVJam9pY0hVME56VmtjbUowY0RFMk9EYzBPVE0xTlRBNU5UbHBkRzU2TUhGd05tNTBOVzFpZFd0bGVXNTJiWEUwZHpSa09XUnFJaXdpWVdkbGJtTjVJanB1ZFd4c0xDSjBjbUZrWlhKUVpYSnpiMjRpT201MWJHd3NJbk5sYzNOcGIyNUpaQ0k2TVRBM05URXNJblJwYldWNmIyNWxJam9pUVhOcFlTOURZV3hqZFhSMFlTSXNJbkJvYjI1bFEyOWtaU0k2T1RFc0luQm9iMjVsSWpvaU9UZ3hNekE1T0RFek1TSXNJbWxoZENJNk1UWTROelE1TXpVMU1Dd2laWGh3SWpveE56SXpPVFE1TXpVMU1IMC5EaWZkam96TzZJUGpnT1dacDhYeVA3TnZLV1BMRXg1VHpRWkptbEFiWEZtdUhKd2dvQjhaOUg4TkZ5SXJ4UVhSN2hvY0VGZ2JPRGVxR0RITUQtODROS0d5WmFQLTdFb3lDVk9fMzVIMjYtRHVNWWs5ZVhadUtHUVhXemMtNEpmelYwRnAzY2JkeDRiQ3hKVlltZC0zZXN4cnRrYm1TRkw2bkhXcGd4cmEwREVidUN1aEFDcnlyeWNSdzU2Rm1mVlNEb3JJU0tOY1JKeF9aSUlPTDVJNlBKWWxfek5ONWIteVNieDFxeTktSF8zdUtYblBBeG42UlhjNFYtZ1BiaUhsU0JVUFNjN19Kb0I3dXhUT2hOenYtTnZrVnhqTzI0ZW5YVkg0Z1NpMDBVdnFFSTBDZ2lfMzVMVkZ6b1dZMXRCLXo2UTN0YlE1Q015NlJJelZEaFg4alEiLCJzY29wZSI6Im9wZW5pZCIsInRva2VuX3R5cGUiOiJCZWFyZXIifQ=='}
----------------------
2023-06-23 04:12:31,015 77080 ERROR dev_v6 odoo.http: Exception during request handling. 
Traceback (most recent call last):
  File "/opt/odoo16/odoo-venv/lib/python3.8/site-packages/jwt/api_jws.py", line 250, in _load
    signing_input, crypto_segment = jwt.rsplit(b".", 1)
ValueError: not enough values to unpack (expected 2, got 1)


File "/opt/odoo16/odoo-venv/lib/python3.8/site-packages/jwt/api_jws.py", line 253, in _load
    raise DecodeError("Not enough segments") from err
jwt.exceptions.DecodeError: Not enough segments

anyone can please help me to decode this JWT token. Thanks in advance


Solution

  • So It was required to add neccessary padding to string and I could fix the issue with this code:

    @staticmethod
    def pad_base64(data):
        """Makes sure base64 data is padded"""
        missing_padding = len(data) % 4
        if missing_padding != 0:
            data += '=' * (4 - missing_padding)
        return data
    
    def _auth_oauth_get_tokens_implicit_flow(self, oauth_provider, params):
        token_data = params.get('response_type').split('?token_data=')[1]
        printable_jwt = base64.urlsafe_b64decode(self.pad_base64(token_data)).decode('utf-8')
        jwt_data = json.loads(printable_jwt)
        return jwt_data.get("access_token"), jwt_data.get("id_token")