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

В моем 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 Ответ

1 голос
/ 15 мая 2019

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

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

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


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


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

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

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

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