如何使用 Firebase Auth 将令牌发送回 android

Posted

技术标签:

【中文标题】如何使用 Firebase Auth 将令牌发送回 android【英文标题】:How to send back the tokens to android using Firebase Auth 【发布时间】:2018-03-27 02:52:31 【问题描述】:

我正在开发一个使用 Firebase 和我自己的运行 Django 的服务器的 android 应用程序。我打算做的是,我想首先使用 android 应用程序向 django 服务器验证用户身份,然后生成 firebase 文档中指定的自定义令牌。然后我想将生成的自定义令牌发送回 android。

我的问题是如何将该自定义令牌发送回 android?我试图作为 JSON 对象发送。但它说 JWT 不是 JSON 可序列化的。

我将 android 应用程序的用户名和密码作为 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 ==' P>

内部服务器错误:/api/user/validateuser/ Traceback(最近 最后调用):文件 “/usr/local/lib/python3.5/dist-packages/django/core/handlers/exception.py”, 第 41 行,在内部 response = get_response(request) 文件“/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py”, 第 249 行,在 _legacy_get_response response = self._get_response(request) 文件 "/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py", 第 187 行,在 _get_response response = self.process_exception_by_middleware(e, request) 文件 "/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py", 第 185 行,在 _get_response 中 response = Wrapped_callback(request, *callback_args, **callback_kwargs) 文件 "/usr/local/lib/python3.5/dist-packages/django/views/decorators/csrf.py", 第 58 行,在 Wrapped_view 中 返回 view_func(*args, **kwargs) 文件“/home/ubuntu/www/Tracker/user/api/views.py”,第 251 行,在 验证用户 返回 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", line 198, in encode chunks = self.iterencode(o, _one_shot=True) 文件“/usr/lib/python3.5/json/encoder.py”,第 256 行,在 iterencode 返回 _iterencode(o, 0) 文件 “/usr/lib/python3.5/json/encoder.py”,第 179 行,默认

raise TypeError(repr(o) + " is not JSON serializable")

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

AttributeError: 'str' 对象没有属性 'decode'

以上是关于如何使用 Firebase Auth 将令牌发送回 android的主要内容,如果未能解决你的问题,请参考以下文章

如何从 firebase_auth 获取令牌

com.google.firebase.auth.FirebaseAuthException:Firebase ID令牌未由有效公钥签名

反应原生android,在尝试获取firebase消息设备令牌时得到FIS_AUTH_ERROR

如何从 Firebase.auth.currentUser Android Kotlin 获取刷新令牌

firebase 数据规则无法解析身份验证令牌

firebase auth是否可以存储和管理不同提供商的访问令牌?