Мне не хватает какого-то (скорее всего, простого) фундаментального понимания защиты приложения JavaScript, такого как приложение, использующее структуру VueJS и службу, такую как Auth0 (или любой другой сервер/служба OAuth).
1) Если вы создаете приложение SPA VueJS с маршрутами, требующими аутентификации, что мешает пользователю просматривать ваш связанный код и просматривать представления/шаблоны, лежащие в основе этого маршрута, без необходимости входа в систему?
2) Если вы создаете приложение VueJS, которое аутентифицирует пользователя и устанавливает некоторую переменную в компоненте, например isLoggedIn = true или isAdminUser = true, что мешает пользователю манипулировать DOM и принудительно устанавливать эти значения в true?
Весь ваш код JavaScript открыт для клиента, так как же ваш код/контент действительно безопасен, если его можно исследовать на уровне кода?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


1) Вы правильно понимаете, его ничего не останавливает. Вот почему вы всегда делаете все это на стороне сервера. Код в браузере/VueJS предназначен только для того, чтобы сделать интерфейс понятным, например, скрыть кнопку, но код сервера всегда должен выполнять фактическую проверку.
Например:
Ничто не мешает пользователю найти этот путь и просто нажать его вручную с помощью 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 (конфиденциальные данные + визуальные эффекты)?
Я не уверен, что правильно понял вопросы, можете ли вы привести пример?
Ничто в ваших представлениях/шаблонах не должно быть секретным. Данные, которые они могут иметь использовать, могут быть, но в этом случае они не должны быть упакованы с установкой приложения — они должны исходить от пользователя или из вашего API после того, как пользователь аутентифицировал его.