1.6.7 • Published 4 months ago

nuxt-simple-auth v1.6.7

Weekly downloads
-
License
MIT
Repository
github
Last release
4 months ago

nuxt-simple-auth

npm version GitHub License npm downloads Nuxt Static Badge

nuxt-simple-auth é um módulo de autenticação para Nuxt 3, Ele é um pacote de código aberto, robusto e repleto de recursos, permitindo a validação de cookies e CSRF utilizando Laravel Passport.\ Além disso, oferece suporte a diversos parâmetros para cookies, tanto no login quanto na autenticação em duplo fator (2FA).\ Conta ainda com suporte à autenticação SSR, garantindo que o usuário permaneça autenticado tanto no cliente quanto no servidor.

Embora o pacote seja estável em termos de opções e comportamento, ainda há melhorias a serem implementadas e a possibilidade de alguns bugs.

Start

npx nuxi@latest module add nuxt-simple-auth

Setup

Installation

Adicione nuxt-simple-auth à seção de módulos do nuxt.config.js.

Configuration

A configuração deve ser realizada no arquivo nuxt.config.js, adicionando a biblioteca à seção de módulos.

Na propriedade auth, a definição das strategies é obrigatória, enquanto as configurações de cookies e * *CSRF são opcionais**.

Para autenticação, a propriedade endpoints.login exige o uso do Laravel Passport, que deve expor a rota /oauth/token.
Documentação do Laravel Passport - Client Credentials Grant Tokens

Essa rota deve retornar uma resposta JSON contendo os seguintes atributos:

  • access_token
  • refresh_token
  • expires_in

Se optar por utilizar a autenticação 2FA, o pacote requer a configuração de endpoints.2fa, que exige que o * *Laravel** exponha uma rota específica.
Essa rota deve retornar uma resposta JSON com os seguintes atributos:

  • access_token
  • expires_in

expires_in: Deve ser o número de segundos até que o token de acesso do 2FA expire.

Exemplo de implementação no Laravel para o controller da rota TwoFactorAuthController:

return response()->json([

    'access_token' => $twoFactorAuth->token,

    'expires_in' => $twoFactorAuth->expire_at->timestamp - now()->timestamp, // Número de segundos até a expiração.

]);

Após a validação do 2FA, o token será automaticamente adicionado aos headers das requisições como um Bearer Token, com o nome "2fa".
Isso permite que as APIs do Laravel validem a autenticação nas rotas protegidas.

Example

export default defineNuxtConfig({
    modules: [
        'nuxt-simple-auth'
    ],

    auth: {
        csrf: '/csrf-token',
        cookie: {
            options: {
                httpOnly: true,
                secure: true,
                sameSite: 'Lax',
                priority: 'high',
            },
            prefix: '__Secure-auth.'
        },
        strategies: {
            local: {
                redirect: {
                    logout: "/auth",
                    login: "/auth"
                },
                user: {
                    property: "profile",
                },
                endpoints: {
                    login: {url: "/oauth/token", method: "post", alias: "auth token"},
                    user: {url: "/api/profile", method: "get"},
                    "2fa": {url: "/api/send-token-2fa", method: "post"},
                },
            }
        }
    },
});

A configuração da propriedade auth.csrf também é opcional. Nela, você pode definir o endpoint da rota /csrf-token do Laravel, que é responsável por fornecer o CSRF Token. Isso melhora a segurança ao validar as rotas protegidas que utilizam CSRF Token.

Exemplo de Implementação no Laravel

Definição da rota no web.php

Route::get('/csrf-token', function () {
    return response()->json(['csrf_token' => csrf_token()])
        ->header('Access-Control-Allow-Origin', '*')
        ->header('Access-Control-Allow-Methods', 'GET, POST')
        ->header('Access-Control-Allow-Headers', 'Content-Type, X-CSRF-TOKEN');
});

Configuração do CORS (config/cors.php)

Adicione /csrf-cookie e /csrf-token às permissões de caminhos no CORS:

'paths' => ['api/*', 'csrf-cookie', 'csrf-token', 'oauth/*']

Exceções de CSRF (app/Http/Middleware/VerifyCsrfToken.php)

Para garantir que o token seja validado corretamente nas rotas de API, adicione as exceções:

protected $except = [
    '/api/*'
];

Runtime Config

A configuração do runtimeConfig do Nuxt 3 também precisa ser ajustada para incluir um objeto secret.
Este objeto deve conter os nomes das suas strategies, e dentro de cada uma delas, as seguintes chaves são * *obrigatórias**:

Exemplo de Configuração:

export default defineNuxtConfig({
    runtimeConfig: {
        secret: {
            local: {
                client_id: 'YOUR_CLIENT_ID',
                client_secret: 'YOUR_CLIENT_SECRET',
                grant_type: 'password',
            },
            client: {
                client_id: 'YOUR_CLIENT_ID',
                client_secret: 'YOUR_CLIENT_SECRET',
                grant_type: 'authorization_code',
            }
        }
    }
});

Strategies

As configurações das strategies seguem a estrutura abaixo, iniciando com um nome de sua escolha para configurar o pacote.
As opções disponíveis estão listadas, indicando quais são obrigatórias e quais são opcionais.

Configuration

  • redirect: Defines the pages for redirection. (Required)

    • login: (Optional)
    • logout: (Required)
    • callback: (Optional)
    • home: (Optional)
  • endpoints: Defines the API routes configured in Laravel. (Required)

    • login: (Required)
      • url: (Required)
      • method: (Required)
      • alias: (Optional)
    • user: Contains user data. (Required)
      • url: (Required)
      • method: (Required)
    • "2fa": (Optional)
      • url: (Required)
      • method: (Required)
      • alias: (Optional)
    • logout: (Optional)
      • alias: (Optional)
  • token: Name of the object returned from Laravel authentication. It is usually "access_token". (Required)

  • user: Name of the object containing user data. (Required)


 strategies: {
            local: {
                redirect: {
                    logout: "/auth",
                    login: "/auth"
                },
                token: {
                    property: "access_token",
                },
                user: {
                    property: "profile",
                },
                endpoints: {
                    login: {url: "/oauth/token", method: "post", alias: "auth token"},
                    user: {url: "/api/profile", method: "get"},
                    "2fa": {url: "/api/send-token-2fa", method: "post"},
                },
            },
            client:{
                redirect: {
                    logout: "/auth",
                    login: "/auth"
                },
                token: {
                    property: "access_token",
                },
                user: {
                    property: "profile",
                },
                endpoints: {
                    login: {url: "/oauth/token", method: "post"},
                    user: {url: "/api/profile", method: "get"},
                    "2fa": {url: "/api/send-token-2fa", method: "post"},
                    logout: {alias: 'logout client'}
                },
            }
        }

O 2FA é opcional, mas, se incluído em uma das "strategies", deve conter a URL e o método necessários para ativar o middleware "_2fa". Esse middleware não é global e pode ser utilizado seletivamente nas páginas do Nuxt.

 definePageMeta({
      middleware: ['auth', '_2fa']
    });

Cookie

OptionDescription
prefixDefault token prefix used in constructing a key for token storage.
optionsAdditional cookie options, passed to cookie.
pathPath where the cookie is visible. Default is /.
expiresSpecifies the lifetime of the cookie in number of days or a specific date. Default is session-only.
maxAgeSpecifies the number (in seconds) that will be the Max-Age value (preferably expired).
domainDomain (and by extension subdomains) where the cookie is visible. Default is the domain and all subdomains.
secureDefines whether the cookie requires a secure protocol (HTTPS). Default is false, should be set to true if possible.

Notes:

  • By default, the prefix on localhost is set to "auth."
  • __Secure- prefix: Cookies with names starting with __Secure- (dash is part of the prefix) must be set with the secure flag from a secure page (HTTPS).
  • __Host- prefix: Cookies with names starting with __Host- must be set with the secure flag, must originate from a secure page (HTTPS), must not have a domain specified (and therefore are not sent to subdomains), and the path must be /.
cookie: {
        options: {
            httpOnly: true,
                secure: true,
                sameSite: 'Lax',
                priority: 'high',
            //maxAge: 24 * 60 * 60 * 1000,
        },
        prefix: '__Secure-auth.',
    }

Middlewares

O pacote nuxt-simple-auth disponibiliza dois middlewares: "auth" e "_2fa".
Eles não são globais e podem ser aplicados seletivamente às páginas do Nuxt.

  • auth: Restringe o acesso a páginas protegidas, garantindo que o usuário esteja autenticado via Laravel Passport , tanto no cliente quanto no servidor (SSR).
  • _2fa: Complementa a autenticação verificando os valores armazenados nos cookies e no sessionStorage para validar a autenticação de dois fatores (2FA), também funcionando no cliente e no servidor (SSR).
 definePageMeta({
      middleware: ['auth', '_2fa']
    });

Methods

Método / MethodDescrição (PT)Description (EN)
loginWith(strategyName, ...args)Define a estratégia atual e tenta realizar o login. Retorna uma Promise.Sets the current strategy and attempts to log in. Returns a Promise.
logout(strategyName)Realiza o logout, garantindo a destruição dos cookies e do estado.Logs out, ensuring the destruction of cookies and state.
_2fa(strategyName, ...args)Tenta validar o código de autenticação em dois fatores (2FA). Retorna uma Promise.Attempts to validate the two-factor authentication (2FA) code. Returns a Promise.
refreshToken(strategyName)
$auth.headers.set(name, value)Define um cabeçalho HTTP manualmente.Sets an HTTP header manually.
$auth.headers.get(name)Obtém o valor de um cabeçalho HTTP.Retrieves the value of an HTTP header.

Usage Examples

loginWith

const {$auth} = useNuxtApp()

$auth.loginWith('local', data)
    .then(response => {
        // Logic after login
    })

logout

const {$auth} = useNuxtApp()

$auth.logout('local')

_2fa

$auth._2fa('local', data).then(response => {
    // Logic after 2FA validation
})

Headers and Requests

$auth.headers.set('name', 'value') // Sets a header  
$auth.headers.get('name') // Retrieves a header  

const {data, pending, error, refresh} = useFetch(url, {
    headers: $auth.headers,
})

⚖️ License

Released under MIT by @4slan.

1.6.4

4 months ago

1.4.6

5 months ago

1.6.3

4 months ago

1.6.2

4 months ago

1.6.1

4 months ago

1.6.0

4 months ago

1.5.9

4 months ago

1.5.8

4 months ago

1.5.7

4 months ago

1.5.6

4 months ago

1.5.5

4 months ago

1.5.4

4 months ago

1.5.3

4 months ago

1.5.2

4 months ago

1.5.1

4 months ago

1.5.0

5 months ago

1.6.7

4 months ago

1.4.9

5 months ago

1.6.6

4 months ago

1.4.8

5 months ago

1.6.5

4 months ago

1.4.7

5 months ago

1.4.5

10 months ago

1.4.4

1 year ago

1.4.3

1 year ago

1.4.2

1 year ago

1.4.1

1 year ago

1.4.0

1 year ago

1.3.7

1 year ago

1.3.6

1 year ago

1.3.9

1 year ago

1.3.8

1 year ago

1.3.5

1 year ago

1.3.4

1 year ago

1.3.3

2 years ago

1.3.2

2 years ago

1.3.1

2 years ago

1.3.0

2 years ago

1.2.9

2 years ago

1.2.8

2 years ago

1.2.7

2 years ago

1.2.6

2 years ago

1.2.5

2 years ago

1.2.4

2 years ago

1.2.3

2 years ago

1.2.2

2 years ago

1.2.1

2 years ago

1.2.0

2 years ago

1.1.9

2 years ago

1.1.8

2 years ago

1.1.7

2 years ago

1.1.6

2 years ago

1.1.5

2 years ago

1.1.4

2 years ago

1.1.1

2 years ago

1.0.2

2 years ago

1.1.0

2 years ago

1.0.1

2 years ago

1.0.9

2 years ago

1.0.8

2 years ago

1.0.7

2 years ago

1.0.6

2 years ago

1.0.5

2 years ago

1.1.3

2 years ago

1.0.4

2 years ago

1.0.3

2 years ago

1.0.0

2 years ago