Angular AuthGuard — это правильное решение?

Я хотел бы создать защиту маршрута для защиты маршрутов от неавторизованных пользователей.

Я использую jsonwebtoken для авторизации и на данный момент сохраняю его в localStorage.

Моя идея заключается в том, что когда пользователь хочет получить доступ к защищенному маршруту администратора, authguard отправляет токен для проверки на сервер nodeJS/Express, который после проверки возвращает true или 401 (независимо от того, является ли пользователь администратором) на стороне клиента.

служба авторизации:

isLoggedIn(){
  let headers = new HttpHeaders().set('x-auth-token',localStorage.getItem('token') || '');
  return this.http.post('http://localhost:3000/api/users/check-auth', {}, { headers: headers }).toPromise();
}

Сервис authGuard:

canActivate(){
    return this.sign.isLoggedIn().then(res => {return res;}).catch(ex => {return ex});
}

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

Не могли бы вы проверить, хорошая это идея или плохая, и придумать лучшее решение с точки зрения безопасности? Большое спасибо!

Я думаю, что это хорошая практика, за исключением ответа 401. Технически клиент не делал недопустимый запрос. Ответ 401 указывает, что содержание HTTP GET недействителен. Сервер должен выдать 200 в случае успеха и содержать флаг в теле, который клиент читает, чтобы узнать, разрешен ли пользователю. Ошибки 401 регистрируются в консоли и сетевых панелях браузера как неверные запросы.

Reactgular 28.04.2019 18:45

На самом деле 400 указывает на то, что содержимое http-запроса недействительно. 401 действительно для несанкционированных запросов.

Bernard Pagoaga 28.04.2019 20:29

Спасибо, я исправлю ответ 401. :)

Roelly 28.04.2019 22:04
Поведение ключевого слова "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) для оценки ваших знаний,...
0
3
262
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Хорошей практикой было бы управление ролями (или разрешениями) на уровне модели на стороне сервера. Например, класс User может иметь свойство roles, например:

auth.service.ts
myUser.roles = ['ROLE_ADMIN']

Таким образом, когда ваш пользователь входит в систему, вы можете сохранить информацию в вашем auth.service.ts

// auth.service.ts
get isAdmin() {
    return this.user.roles.includes('ROLE_ADMIN')
}

Обратите внимание, что обычно вы хотите хранить эту информацию в управлении состоянием вашего приложения, будь то простые rxjs, ngrx, ngxs...

Наконец, вы должны добавить AuthInterceptor, который будет перенаправлять вашего пользователя, если ваш API возвращает ошибку 401.

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

Roelly 28.04.2019 22:01

да. Вам не нужно делать запрос к API каждый раз, когда вы хотите перейти в ограниченную область вашего приложения. Защищенная часть вашего приложения в любом случае будет на стороне сервера, и это возможно благодаря пакету jwt.

Bernard Pagoaga 28.04.2019 22:28

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