如何使用Firebase Auth

时间:2017-10-15 13:57:46

标签: android python json django firebase-authentication

我正在开发一款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")

1 个答案:

答案 0 :(得分:2)

我认为你使用的是python3版本。我发现了问题所在。

auth.create_custom_token(uid)方法返回字节文字,字节文字不是JSON可序列化的。这就是你得到错误的原因。您可以在jwt令牌的前面看到 b'

因此,您需要使用以下代码将字节文字转换为字符串。

custom_token = (auth.create_custom_token(uid)).decode()