Firebase Auth + Python后端

时间:2018-03-10 15:57:54

标签: python firebase bottle firebase-admin

我将使用Firebase Auth和数据库模块来创建我的网络应用程序。但是,并非我希望我的应用程序所做的所有事情都只能在前端实现。因此,我还希望使用Python的Bottle框架后端处理请求,并使用Pyrebase访问Firebase数据库。
让我们说登录后我需要访问主页并查看个性化内容,例如我的笔记。它们以这种方式在DB中构建:

{
    "notes": [{
        "id": "1",
        "title": "X",
        "author": "user1"
    },
    {
        "id": "2",
        "title": "Y",
        "author": "user2"
    } and so on... ]
}

那么如何才能实现只在主页上显示我的文章? 我知道我需要根据author值过滤我的笔记,但是如何让Bottle了解当前登录的用户?
我已经读过there,我应该以某种方式向后端服务器发送唯一令牌以验证当前用户,但是如何做到这一点?在每个链接中插入令牌作为GET参数似乎很愚蠢,但我认为没有其他方法可以实现它。

1 个答案:

答案 0 :(得分:0)

首先组织数据库,使每个音符成为子对象:

{
  "notes": {
    "id1": {
      "id": "id1",
      "title": "X",
      "author": "user1",
    },
    "id2": {

    }
  }
}

然后,这种特定的交互可以完全在客户端实现。只需执行查询即可过滤所需的注释。例如,在JS客户端中:

var uid = firebase.auth().currentUser.uid;
var query = ref.orderByChild('author').equalTo(uid);
// Listen for query value events

如果要在后端服务器上运行此操作,并且要确保只允许登录用户执行它,则必须在每次请求时将ID令牌从客户端应用程序传递到服务器。以下是使用Python Admin SDK实现服务器端逻辑的方法:

import firebase_admin
from firebase_admin import auth
from firebase_admin import db

token = '....' # Extract from the client request
try:
    decoded = auth.verify_id_token(token)
    uid = decoded.uid
    ref = db.reference('path/to/notes')
    notes = ref.order_by_child('author').equal_to(uid).get()
    # Process notes response
except ValueError as ex:
    print(ex)
    # Send error to client