Python Firebase身份验证

2024-09-28 22:23:46 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我试图从Firebase中获取一些数据,其中当然定义了一些规则/安全约束。我可以从Login&Auth选项卡验证我的用户,我希望从firebase获取数据,但是我的用户仍然没有通过身份验证。

user = ref.authenticate(email, password),返回user的以下内容

{
   u'token':{some long token here}',
   u'user':{
      u'uid':u'ef44b781-8842-4f28-abf0-2ac9aa0b2bea',
      u'provider':u'password',
      u'email':u'user@email.com',
      u'isTemporaryPassword':False,
      u'sessionKey':u'{session key here}}',
      u'md5_hash':u'{md5_hash here}}',
      u'id':u'ef44b781-8842-4f28-abf0-2ac9aa0b2bea'
   }
}

现在我知道用户已经过身份验证(否则它会返回一些错误信息,我想做一个简单的GETconversations = firebase.get(FIREBASE_NAME + '/conversations/' + me),其中'me'是user['user']['uid']

我的conversations结构如下:

conversations/my-uid/other-uid/{data}

我认为我的用户已经过身份验证,但它仍然返回一个被拒绝的权限

编辑 通过使用另一个可以找到here的库解决了这个问题。我使用的初始库不支持身份验证,而此库支持身份验证。解决方法是,从另一个函数中实现一些函数,并按如下方式发送我的令牌: FIREBASE.child('/messages/').get(token=token)


Tags: 用户token身份验证uidgethereemailpassword
2条回答

您不应该在URL中发送密码,您可以这样做:

__FIREBASE_USER_VERIFY_SERVICE = "https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword"
__FIREBASE_API_KEY = __your_api_key_here__

def user_login(email, passwd):
    url = "%s?key=%s" % (__FIREBASE_USER_VERIFY_SERVICE, __FIREBASE_API_KEY)
    data = {"email": email,
            "password": passwd,
            "returnSecureToken": True}
    result = requests.post(url, json=data)
    is_login_successful = result.ok
    json_result = result.json()
    return json_result    # authToken=> json_result['idToken']

如果成功,结果如下:

{
    "displayName": "",
    "email": "your_users_email@example.com",
    "expiresIn": "3600",
    "idToken": "abc123...",
    "kind": "identitytoolkit#VerifyPasswordResponse",
    "localId": "UWQ...x2",
    "refreshToken": "def098...",
    "registered": true
}

如果失败(密码错误等):

{
  "error": {
    "code": 400,
    "errors": [
      {
        "domain": "global",
        "message": "INVALID_PASSWORD",
        "reason": "invalid"
      }
    ],
    "message": "INVALID_PASSWORD"
  }
}

或者可能是

{
  "error": {
    "code": 400,
    "errors": [
      {
        "domain": "global",
        "message": "MISSING_PASSWORD",
        "reason": "invalid"
      }
    ],
    "message": "MISSING_PASSWORD"
  }
}

通过使用另一个可以找到here的库解决了这个问题。我使用的初始库不支持身份验证,而此库支持身份验证。解决方法是通过实现另一个函数的某些功能,并按如下方式进行身份验证:

def auth_with_password(self, email, password):
    request_ref = 'https://auth.firebase.com/auth/firebase?firebase={0}&email={1}&password={2}'.\
        format(self.fire_base_name, email, password)
    request_object = self.requests.get(request_ref)
    return request_object.json()

那么要打一个授权电话,就这样做

user = auth_with_password(email, password)
token = user['user']['token']
FIREBASE.child('/messages/').get(token=token)

确保您的令牌是正确的。库支持此功能,但否则我建议您使用Firebase token generator for Python

相关问题 更多 >