Можно ли интегрировать внешний сервер разрешений? - PullRequest
1 голос
/ 12 марта 2019

Я реализовал RBAC с Ory Keto для управления разрешениями пользователя на основе утверждений токена.Я использую Ory Oathkeeper в качестве обратного прокси-сервера, который аутентифицирует пользователя с помощью Ory Hydra и авторизует его с помощью Ory Keto.Теперь я хочу интегрировать эти сервисы с Firebase / Firestore.

Я думаю, что будет возможно интегрировать Ory Hydra (сервер аутентификации) с Firebase / Firestore, потому что возможно интегрировать Auth0 (https://auth0.com/blog/developing-real-time-apps-with-firebase-and-firestore/). То есть, я думаю, что возможно использовать токен доступа Hydra(OAuth2) или токен OpenId (JWT) для создания собственного токена firebase и использования последнего для авторизации доступа (создания правил firebase).

Мне было интересно, возможно ли использовать роли Ори Кето в процессе авторизации firebase.Другими словами, если возможно интегрировать внешний сервер разрешений в firebase для предоставления доступа.

1 Ответ

1 голос
/ 12 марта 2019

Невозможно вызвать ваш сторонний сервер авторизации из правил безопасности Firestore, так как его производительность будет непредсказуемой.

Вместо этого вы можете сделать информацию со стороннего сервера авторизации доступной в правилах безопасности вашего Firestore.Для этого есть два общих подхода:

  1. Сделать информацию доступной в качестве пользовательских утверждений в профиле аутентификации пользователя.
  2. Сделать информацию доступной внутри самого Firestore.

Любая из этих задач должна выполняться из доверенного кода, поэтому она должна выполняться в доверенной среде, такой как компьютер разработчика,сервер, которым вы управляете, или Облачные функции.

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

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.token.admin == true;  
    } 
  }
}

Если информация об авторизации больше или более изменчива, ее чаще хранят в самой базе данных.Затем вы можете получить к нему доступ в своих правилах безопасности с помощью чего-то вроде:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if exists(/databases/$(database)/documents/AuthorizedUsers/$(request.auth.id))
    } 
  }
}
...