К Фреймворку Nuxt js я начал присматриваться еще давно, и вот когда применил его в одном из своих последних проектов , то столкнулся с несколькими задачами:
Во первых, сделать авторизацию на основе JWT (Json Web Token), забегая вперед скажу, что с этой задачей я быстро справился. при помощи прекрасного модуля nuxt-auth. Ниже приведу рабочий конфиг который нужно прописать в файле nuxt.config.js.
// Modules: https://go.nuxtjs.dev/config-modules modules: [ // https://go.nuxtjs.dev/bootstrap 'bootstrap-vue/nuxt', // https://go.nuxtjs.dev/axios '@nuxtjs/axios', '@nuxtjs/auth-next' ], // Axios module configuration: https://go.nuxtjs.dev/config-axios axios: { baseURL: 'http://127.0.0.1:8000/api/', }, auth: { scopeKey: 'user_type', strategies: { local: { scheme: 'refresh', localStorage: { prefix: 'auth.' }, token: { prefix: 'access_token.', property: 'access_token', maxAge: 86400, type: 'Bearer' }, refreshToken: { prefix: 'refresh_token.', property: 'refresh_token', data: 'refresh_token', maxAge: 60 * 60 * 24 * 15 }, user: { property: 'user', autoFetch: true }, endpoints: { login: { url: '/login', method: 'post'}, refresh: { url: '/token/refresh/', method: 'post' }, user: { url: '/user', method: 'get' }, logout: { url: '/logout', method: 'post'} }, } } }, // Build Configuration: https://go.nuxtjs.dev/config-build build: { }
Во вторых я далее столкнулся с задачей организации разграничения прав доступа к nuxt приложению, на основании ролей которые я планировал получать из backenda в моем случае это Django RestFramework. Ниже я выложу код модели и сериализера Джанги, для полноты картины.
#models.py class CustomUser(AbstractBaseUser, PermissionsMixin): USER_TYPE_CHOICES = ( (1, 'customer'), (2, 'manufacturer'), (3, 'seller'), ) name = models.CharField(max_length=50, null=True, blank=True) phone = models.CharField(max_length=12, verbose_name='Телефон') email = models.EmailField('Адрес электронной почты', unique=True) is_staff = models.BooleanField(default=False) is_active = models.BooleanField(default=True) date_joined = models.DateTimeField(default=timezone.now) user_type = models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES) USERNAME_FIELD = 'email' REQUIRED_FIELDS = [] objects = CustomUserManager() def get_scope(self): arr = [] arr.append(self.get_user_type_display()) return arr def __str__(self): return self.email #serializers.py class UserSerializer(serializers.ModelSerializer): user_type = serializers.ListField(source='get_scope') # scope = serializers.CharField(source='get_user_type_display') def create(self, validated_data): return get_user_model().objects.create_user(**validated_data) class Meta: model = get_user_model() fields = ('email', 'password', 'phone', 'name', 'user_type') extra_kwargs = { 'password': {'write_only': True, 'min_length': 8}, }
Нюансы на которые стоит заострить внимание
- Поле ScopeKey нужно указывать в секции auth в конфиге nuxt.
- Поле ScopeKey по умолчанию имеет значение ScopeKey: ‘scope’ и если вам backend отдает поле с таким названием можете смело пропускать это пункт.
- Поле scope: должно содержать массив строк. Например ‘scope’: {‘admin’, ‘editor’}
Заключение
Для того, чтобы проверить работу данной настройки достаточно создать middleware следующего содержимого.
export default function ({ $auth, redirect }) { if ($auth.hasScope('manufacturer')) { console.log('MANUFACTURER scope') } }
Если пользователь имеет права ‘manufacturer’ как в моем случае, тогда в консоли выведется MANUFACTURER scope.