Запустить npm run build
для сборки проекта. Результат сборки располагается в каталоге dist/auth
.
Перед публикацией пакета убедитесь, что вы обладаете правами на публикацию.
Выполните вход в npm-аккаунт через консоль npm login
.
Дождитесь сборки пакета. Из консоли в корне выполните cd dist/auth
и запустите npm publish
.
Сборка и публикация одновременно производится командой npm run publish-onmoon
.
yarn add gm-auth-angular-bundle
// or
npm install --save gm-auth-angular-bundle
Модуль AuthModule подключается в корне проекта через метод forRoot(AuthConfig)
.
При объявлении маршрутов, также доступен из коробки AuthGuard
, который выполняет проверки на указанных маршрутах.
Кофигурация модуля имеет сигнатуру
interface AuthConfig {
host: string;
cookieSecure?: boolean; // deprecated
testingMode?: boolean;
cookie?: {
secure?: boolean;
ignoreBaseUrl?: boolean;
},
whitelist?: RegExp[]
}
host
– url к апи с развернутым беком аутентификации. Бандл обращается к эндпоинтам (/session/create/ и
/session/close/)
cookieSecure
(deprecated) – безопасные/небезовасные куки. Обычно сюда отправляется флажок из environment.production
.
cookie.secure
– безопасные/небезовасные куки. Обычно сюда отправляется флажок из environment.production
.
cookie.ignoreBaseUrl
– устанавливает куки только по домену, игнорируя baseUrl.
cookie.keyId
– имя куки для параметра id в паре ключей авторизации id/token.
cookie.keyToken
– имя куки для параметра token в паре ключей авторизации id/token.
testingMode
– По умолчанию false. В этом режиме AuthService.isAuthenticated() всегда вернет true
whitelist
– По умолчанию []. Список регулярных выражений маршрутов, по которым AuthGuard
не делает проверок на аутентификацию.
// app.module.ts
import { NgModule } from '@angular/core';
import { AuthModule } from 'gm-auth-angular-bundle';
import { TranslateModule } from '@ngx-translate/core';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { environment } from './environments/environment';
@NgModule({
declarations: [AppComponent],
imports: [
TranslateModule.forRoot(),
AuthModule.forRoot({
host: 'https://api.gm.money',
cookie: {
secure: environment.production
},
testingMode: false
}
),
AppRoutingModule
],
bootstrap: [AppComponent]
})
export class AppModule {
}
Бандл подключает интерсептор, который слушает все запросы на предмет 401
ошибки.
Если ловится 401, то вычищаются куки браузера, уходит запрос (/session/create/
) на создание сессии, и затем
пользователя редиректит на панель аутентификации по адресу
<authUrl>?token=<token>&id=<id>&lang=<lang>
.
Параметр <lang>
получаем из сервиса локализации (из TranslateModule),
<authUrl>
, <id>
и <token>
получены из запроса создания сессии.
В случае успешной аутентификации клиент направляется по адресу
<frontend-domain>/login?token=<token>&id=<id>&lang=<lang>
Этот маршрут создается из пакета при подключении модуля, здесь отрабатывает компонент AuthComponent
:
извлекаются параметры из query-строки, устанавливается язык, запоминаются id
и token
и заполняются куки.
После установки куки клиент направляется по адресу в который стучался до аутентификации.
Заметка. Бандл не обрабатывает 403 статус запросов. 403
статус расценивается как нехватка прав пользователя и должен
обрабатываться из приложения. Все аутентификационные траблы должны плевать 401
.
Заметка. Имеется подводный камень. Подключайте модуль ДО вашего модуля с маршрутами проекта. В проектах зачастую
используют редиректы при объявлении RouterModule. Может сложиться ситуация, при которой достучаться до маршрута
<frontend-domain>/login?token=<token>&id=<id>&lang=<lang>
не удастся, в итоге фронт попадет петлю редиректов. Если
подключать модуль первым, вы исключите подобный кейс.
Для отправки на страницу настроек пользователь используется метод profile(lang?: string)
сервиса AuthService
.
Метод ничего не возвращает. Бандл отправляет запрос к API /session/config/
и получачает ссылку и перенаправляет на нее
с соотствующими параметрами сессии <profileUrl>?id=<id>&token=<token>&lang=<lang>
Если необходимо в запросе отключить авторизационные заголовки, используйте токен контекста SKIP_AUTH_TOKEN
из пакета, как в примере ниже
import { SKIP_AUTH_TOKEN } from 'gm-auth-angular-bundle';
httpClient.get<Response>(`/request`, {
context: new HttpContext().set(SKIP_AUTH_TOKEN, true),
}
);