Django REST framework - запретить доступ к данным для просмотра пользователем?

В моем API у меня есть конечная точка / users, которая в данный момент показывает (например, адрес) детали всех зарегистрированных пользователей. Это должно быть доступно для приложения (Ember) (например, для просмотра адреса доставки пользователя), но по понятным причинам я не могу позволить кому-либо иметь возможность просматривать данные (будь то через доступный для просмотра API или в виде простого JSON, если мы ограничиваем представление только использованием JSONRenderer). Я не думаю, что смогу использовать аутентификацию и разрешения, так как приложению необходимо в первый раз войти в систему из внешнего интерфейса (я использую аутентификацию на основе токенов). Например, если я использую аутентификацию в представлении пользователя в Django, я не могу войти в Ember.

Я что-то пропустил?

ОБНОВИТЬ

Привет, я хотел вернуться к этому.

Для аутентификации на стороне Ember я использую Ember Simple Auth и аутентификацию на основе токенов в Django. Все работает нормально - я могу войти в приложение Ember и получить доступ к токену.

Что мне нужно сделать, это получить доступ к пользователю; для этого я воспользовался примером кода здесь https://github.com/simplabs/ember-simple-auth/blob/master/guides/managing-current-user.md

Я проверил аутентификацию на основе токенов в Postman, используя токен для моего вошедшего в систему пользователя - и могу получить доступ к конечной точке / users. (Это возвращает всех пользователей - я хочу только для пользователя, для которого у меня есть токен, который нужно вернуть, но это на потом!).

Вопрос в том, как передать заголовок (токен) в любых запросах Ember, например:

this.store.findAll('user') .... etc 

Это явно не происходит в настоящее время, и я не уверен, как это исправить.

ОБНОВИТЬ

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

authorize(xhr) {
    let { access_token } = this.get('session.data.authenticated');
    if (isPresent(access_token)) {
        xhr.setRequestHeader('Authorization', `Token ${access_token}`);
    }
},
headers: computed('session.data.authenticated.token', function () {
    const headers = {};
    if (this.session.isAuthenticated) {
        headers['Authorization'] = `Token ${this.session.data.authenticated.token}`
    }
    return headers;
})

Всего 1 ответ


Эмбер - это основа для создания СПА. Они запускаются в браузере. Таким образом, чтобы Ember получил данные, вы должны отправить данные в браузер.

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

Любые данные, которые вы отправляете в браузер, пользователь может получить доступ. Полная остановка.


Если вы хотите ограничить, какие биты данных пользователь может читать из API, то вам нужно написать логику, чтобы применить эти ограничения на стороне сервера и не зависеть от кода Ember на стороне клиента для фильтрации битов, которые вы не делаете. Я не хочу, чтобы пользователь видел.


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

Это на самом деле не имеет смысла.

Как правило, это должно произойти:

  1. Пользователь вводит некоторые учетные данные в приложение Ember
  2. Приложение ember отправляет их на конечную точку аутентификации на сервере
  3. Сервер возвращает токен
  4. Приложение Ember хранит токен
  5. Приложение ember отправляет токен, когда делает запрос данных из API
  6. Сервер использует токен, чтобы определить, какие данные отправлять обратно из API.

Есть идеи?

10000