我正在开发一款Android应用,它使用Firebase和我自己的运行Django的服务器。我打算做的是,我想首先使用Android应用程序向django服务器验证用户,然后生成firebase文档中指定的自定义令牌。然后我想将生成的自定义令牌发送回android。
我的问题是如何将自定义令牌发送回android?我试图发送为JSON对象。但它说JWT不是JSON可序列化的。
我将android app中的用户名和密码作为json对象传递,并使用我的django服务器进行身份验证。
这是我的最小Django
代码:
import firebase_admin
from firebase_admin import credentials
from firebase_admin import auth
cred = credentials.Certificate("firebase-admin.json")
default_app = firebase_admin.initialize_app(cred)
def validateuser(request):
json_data=json.loads(request.body.decode('utf-8'))
try:
// I verify the username and password and extract the uid
uid = 'some-uid'
custom_token = auth.create_custom_token(uid)
result={'TAG_SUCCESS': 1, 'CUSTOM_TOKEN': custom_token }
except:
result={'TAG_SUCCESS': 0, 'CUSTOM_TOKEN': '0'}
return HttpResponse(json.dumps(result), content_type='application/json')
但它说自定义令牌不是JSON可序列化的。是不是这样做的方式?如何将自定义令牌发送回Android应用程序?
这就是错误:
uid:78b30d23-6238-4634-b2e4-73cc1f0f7486
custom_token:B' eyJraWQiOiAiZmFlNzA2MzZiY2UwZTk0Y2Y5YTM2OWRlNzc4ZDZlYWQ5NGMwM2MzYiIsICJhbGciOiAiUlMyNTYiLCAidHlwIjogIkpXVCJ9.eyJpc3MiOiAiZmlyZWJhc2UtYWRtaW5zZGstOXBtbjVAYnVzdHJhY2tlci0xZDE3OS5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsICJ1aWQiOiAiNzhiMzBkMjMtNjIzOC00NjM0LWIyZTQtNzNjYzFmMGY3NDg2IiwgImF1ZCI6ICJodHRwczovL2lkZW50aXR5dG9vbGtpdC5nb29nbGVhcGlzLmNvbS9nb29nbGUuaWRlbnRpdHkuaWRlbnRpdHl0b29sa2l0LnYxLklkZW50aXR5VG9vbGtpdCIsICJleHAiOiAxNTA4MDc2OTA4LCAiaWF0IjogMTUwODA3MzMwOCwgInN1YiI6ICJmaXJlYmFzZS1hZG1pbnNkay05cG1uNUBidXN0cmFja2VyLTFkMTc5LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0 = .jgexW_xR5FeZvuO5TPWO8EOBnRJ28ut9OR_OxeajE1_o4ns4fwd2pMXlK2GkM464P5Vi-IxheG-IIJcANxGSDeZgvgpkLfKkHMZeSaraqfEQGq6N7ipuD8o1T7zd5qm79twmFbrQZRB1y7g1-zcjL69x8KFsThWOTmo0TYj5l3zf8_2Cxbw2SGefMWkCwL0d1yQjcUqVyuSAP3-Sg8KrrqCcG4cjNOXKeWxwbUQO7DobOQlT5TfRApwWk8Td6uPjD7d6jqMo-HPKOis0vRoXMBzflZKj36-hIOFkygZNbDWLTsQzbb3HZg8dBabA5GTy - iQi038TRMIm2W0irr0ng =='
内部服务器错误:/ api / user / validateuser / Traceback(最新版本 最后打电话):文件 " /usr/local/lib/python3.5/dist-packages/django/core/handlers/exception.py" ;, 第41行,在内部 response = get_response(request)File" /usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py", 第249行,在_legacy_get_response中 response = self._get_response(request)File" /usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py", 第187行,在_get_response中 response = self.process_exception_by_middleware(e,request)File" /usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py", 第185行,在_get_response中 response = wrapped_callback(request,* callback_args,** callback_kwargs)File" /usr/local/lib/python3.5/dist-packages/django/views/decorators/csrf.py", 第58行,在wrapped_view中 return view_func(* args,** kwargs)File" /home/ubuntu/www/Tracker/user/api/views.py" ;,第251行,在 的ValidateUser 返回HttpResponse(json.dumps(result),content_type =' application / json')文件 " /usr/lib/python3.5/json/ init .py",第230行,转储 return _default_encoder.encode(obj)File" /usr/lib/python3.5/json/encoder.py" ;,第198行,编码 chunks = self.iterencode(o,_ one_shot = True)文件" /usr/lib/python3.5/json/encoder.py" ;,第256行,在iterencode中 return _iterencode(o,0)文件 " /usr/lib/python3.5/json/encoder.py" ;,第179行,默认
raise TypeError(repr(o) + " is not JSON serializable")
答案 0 :(得分:2)
我认为你使用的是python3版本。我发现了问题所在。
auth.create_custom_token(uid)方法返回字节文字,字节文字不是JSON可序列化的。这就是你得到错误的原因。您可以在jwt令牌的前面看到 b' 。
因此,您需要使用以下代码将字节文字转换为字符串。
custom_token = (auth.create_custom_token(uid)).decode()