VueJS Secure с Auth0 — насколько это безопасно?

Мне не хватает какого-то (скорее всего, простого) фундаментального понимания защиты приложения JavaScript, такого как приложение, использующее структуру VueJS и службу, такую ​​​​как Auth0 (или любой другой сервер/служба OAuth).

1) Если вы создаете приложение SPA VueJS с маршрутами, требующими аутентификации, что мешает пользователю просматривать ваш связанный код и просматривать представления/шаблоны, лежащие в основе этого маршрута, без необходимости входа в систему?

2) Если вы создаете приложение VueJS, которое аутентифицирует пользователя и устанавливает некоторую переменную в компоненте, например isLoggedIn = true или isAdminUser = true, что мешает пользователю манипулировать DOM и принудительно устанавливать эти значения в true?

Весь ваш код JavaScript открыт для клиента, так как же ваш код/контент действительно безопасен, если его можно исследовать на уровне кода?

Ничто в ваших представлениях/шаблонах не должно быть секретным. Данные, которые они могут иметь использовать, могут быть, но в этом случае они не должны быть упакованы с установкой приложения — они должны исходить от пользователя или из вашего API после того, как пользователь аутентифицировал его.

ceejayoz 24.05.2019 18:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
205
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

1) Вы правильно понимаете, его ничего не останавливает. Вот почему вы всегда делаете все это на стороне сервера. Код в браузере/VueJS предназначен только для того, чтобы сделать интерфейс понятным, например, скрыть кнопку, но код сервера всегда должен выполнять фактическую проверку.

Например:

  1. У вас есть кнопка «Получить секретный документ», которая имеет запрос axios к пути /api/sendsecret
  2. В вашем приложении VueJS вы можете сделать что-то вроде v-if="user.isAdmin", чтобы показать кнопку только пользователю.

Ничто не мешает пользователю найти этот путь и просто нажать его вручную с помощью curl, postmaster или любого другого подобного инструмента.

Вот почему серверный код (например, nodeJS с экспрессом) всегда должен выполнять проверку:

app.get('api/sendsecret', (req, res) => {
  if (req.user.isAdmin) {
    res.send('the big secret')
  } else {
    res.sendStatus(401) // Unauthorized
  }
})

2) Опять ничего. Вы никогда не должны аутентифицировать пользователя в приложении VueJS. Хорошо иметь некоторые переменные, такие как isLoggedIn или isAdminUser, чтобы интерфейс имел смысл, но код сервера всегда должен выполнять фактическую аутентификацию или авторизацию.

Другой пример. Допустим, вы собираетесь сохранить запись в блоге.

axios.post('/api/save', {
  title: 'My Blog Post'
  userId: 'bergur'
}

Сервер никогда, никогда не должен читать этот идентификатор пользователя и использовать его вслепую. Он должен использовать фактического пользователя в запросе.

app.post('api/save', (req, res) => {
  if (req.user.userId === 'bergur') {
    database.saveBlogpost(req.body)
  } else {
    res.sendStatus(401)
  }
})

Что касается ваших итоговых оценок:

All your JavaScript code is exposed to the client, so how is any of your code/content actually secure if it can be explored on the code level?

Вы правы, это не безопасно. У клиента должны быть переменные, которые помогают пользовательскому интерфейсу иметь смысл, но сервер никогда не должен доверять им и всегда проверять фактического пользователя в запросе. Код клиента также никогда не должен содержать пароль или токен (например, сохранение JSONWebToken в локальном хранилище).

Это всегда работа сервера, чтобы проверить, действителен ли запрос. Вы можете увидеть пример на веб-сайте Auth0 для NodeJS с Express. https://auth0.com/docs/quickstart/backend/nodejs/01-авторизация

// server.js

// This route doesn't need authentication
app.get('/api/public', function(req, res) {
  res.json({
    message: 'Hello from a public endpoint! You don\'t need to be authenticated to see this.'
  });
});

// This route need authentication
app.get('/api/private', checkJwt, function(req, res) {
  res.json({
    message: 'Hello from a private endpoint! You need to be authenticated to see this.'
  });
});

Обратите внимание на checkJwt на приватном маршруте. Это экспресс-промежуточное ПО, которое проверяет, действителен ли токен доступа пользователя в запросе.

Спасибо большое. Это ясно объясняет, что мне нужно было подтвердить. Часто ли разработчики разрешают открывать даже визуальные элементы в защищенных областях? Или сервер может аутентифицировать пользователя и вернуть все компоненты VueJS (конфиденциальные данные + визуальные эффекты)?

Vidarious 24.05.2019 20:14

Я не уверен, что правильно понял вопросы, можете ли вы привести пример?

Bergur 24.05.2019 23:30

Другие вопросы по теме