(Как) вы можете выйти из Firebase? - PullRequest
0 голосов
/ 27 августа 2018

Мы используем Firebase для аутентификации наших пользователей.

Я могу войти в систему на клиентской стороне, а затем запустить из приложения python следующее:

import firebase_admin
import firebase_admin.auth
from firebase_admin import credentials
from datetime import datetime

cred = credentials.Certificate('my_creds.json')
app = firebase_admin.initialize_app(cred)

firebase_admin.auth.revoke_refresh_tokens('some-user-id', app=app)
u = firebase_admin.auth.get_user('some-user-id')
print(datetime.fromtimestamp(u.tokens_valid_after_timestamp / 1000))

Который отображает текущую временную метку, и, по крайней мере, насколько я понимаю, документация по управлению сеансами пользователя , он должен отзывать токены. Что, как я думал , должно быть сделано, чтобы дальнейшие операции, которые я выполняю на стороне клиента, потерпели неудачу.

Это, однако, не соответствует действительности. Я могу открыть консоль, где 'some-user-id' был зарегистрирован и запустить:

firebase.database().ref('some/key').once('value').then(function(snap){ console.log(snap.val()); });

И через мгновение я буду наблюдать значение some/key очень хорошо.

Это не хорошо.

Когда я запускаю firebase.auth().currentUser.reload() , тогда фактически отключает мой сеанс, и я больше не смогу получить это значение. Но я хочу сделать что-то на стороне сервера, чтобы каждый последующий запрос от клиента потерпел неудачу с проблемой аутентификации.

Возможно ли это? И если да, то как я могу это сделать?

1 Ответ

0 голосов
/ 28 августа 2018

revoke_refresh_token() делает недействительными "токены обновления". Это не делает недействительными уже авторизованные пользовательские сессии. Фактически любые «токены ID», которые в данный момент находятся в сеансе, могут оставаться действительными до часа (после чего пользователи будут вынуждены войти в систему). Прочтите эту статью , если вы хотите узнать больше о разнице между этими двумя типами токенов.

Чтобы предотвратить доступ к базе данных со старыми (до отзыва) токенами ID, вы должны использовать правила безопасности Firebase. Вы можете записать tokens_valid_after_timestamp в базу данных:

auth.revoke_refresh_tokens(uid)
user = auth.get_user(uid)
revocation_second = user.tokens_valid_after_timestamp / 1000
# Write the revoke time to database as part of the
# server-side revoke operaition
metadata_ref = firebase_admin.db.reference("metadata/" + uid)
metadata_ref.set({'revokeTime': revocation_second})

Затем реализуйте правило, которое проверяет токен идентификатора на это.

{
  "rules": {
    "users": {
      "$user_id": {
        ".read": "$user_id === auth.uid && auth.token.auth_time > (root.child('metadata').child(auth.uid).child('revokeTime').val() || 0)",
        ".write": "$user_id === auth.uid && auth.token.auth_time > (root.child('metadata').child(auth.uid).child('revokeTime').val() || 0)"
      }
    }
  }
}

Эта конфигурация запрещает пользователям доступ к узлу users/{uid} с токеном ID, полученным до отзыва.

Это решение описано в документации .

...