本文へ移動
rdlabo.devdocs

認証・HTTP

アクセス権限

provideKitAuth()userconfirmrequiredanonymousunavailable の認証状態に対応するfunctional Route Guardを設定します。Redirect routeとアプリ固有の副作用は利用側に残します。以下の例の AuthService はアプリ所有です。authState Observableと任意のlifecycle callbackはアプリ側で用意します。

KitAuthAccessService は現在のsessionが実行できる操作を公開します。

Mode Local Replica・Outbox 認証HTTP・Realtime・Sync
none 不可 不可
local 不可
remote

Authoritativeな required はsign-outであり、Offline Accessへ変換してはいけません。以前検証したLocal Sessionを有効化できるのはtransport結果が unavailable の場合だけです。

import { inject } from '@angular/core';
import type { Routes } from '@angular/router';
import {
  kitRequireAuthorizedGuard,
  kitRequireConfirmingGuard,
  kitRequiredUnauthorizedGuard,
  provideKitAuth,
} from '@rdlabo/ionic-angular-kit';
import { AuthService } from './auth.service';

provideKitAuth(() => {
  const auth = inject(AuthService);
  return {
    authState: () => auth.state$,
    redirects: {
      whenAuthorized: '/home',
      whenConfirming: '/auth/confirm',
      whenNotConfirming: '/auth/signin',
      whenUnauthorized: '/auth',
    },
  };
});

export const routes: Routes = [
  { path: 'auth/signin', canActivate: [kitRequiredUnauthorizedGuard], loadComponent: () => import('./signin.page').then((m) => m.SigninPage) },
  { path: 'auth/confirm', canActivate: [kitRequireConfirmingGuard], loadComponent: () => import('./confirm.page').then((m) => m.ConfirmPage) },
  { path: 'home', canActivate: [kitRequireAuthorizedGuard], loadComponent: () => import('./home.page').then((m) => m.HomePage) },
];

Route定義では kitRequiredUnauthorizedGuardkitRequireConfirmingGuardkitRequireAuthorizedGuard を使います。保護対象の非同期判定開始時には、現在のauthorization leaseが成功するまで以前のremote権限を一時停止します。

HTTPポリシー

provideKitHttp() はcredential付与、bypass規則、一時障害処理、アプリのerror hookを備えた kitAuthInterceptor を設定します。Interceptor自体は provideHttpClient で別途登録します。必須なのは getAuthHeaders だけで、他のhookはすべて任意でアプリ所有です。

import { provideHttpClient, withInterceptors } from '@angular/common/http';
import { inject } from '@angular/core';
import type { ApplicationConfig } from '@angular/core';
import { kitAuthInterceptor, provideKitAuth, provideKitHttp } from '@rdlabo/ionic-angular-kit';
import { AuthService } from './auth.service';

export const appConfig: ApplicationConfig = {
  providers: [
    provideHttpClient(withInterceptors([kitAuthInterceptor])),
    provideKitAuth(() => {
      const auth = inject(AuthService);
      return {
        authState: () => auth.state$,
        redirects: {
          whenAuthorized: '/home',
          whenConfirming: '/auth/confirm',
          whenNotConfirming: '/auth/signin',
          whenUnauthorized: '/auth',
        },
      };
    }),
    provideKitHttp(() => {
      const auth = inject(AuthService);
      return {
        getAuthHeaders: async () => ({ Authorization: `Bearer ${await auth.token()}` }),
        onUnauthorized: () => auth.signOut(),
      };
    }),
  ],
};

自動retryは GETHEADOPTIONS または Idempotency-Key を持つrequestだけです。通常のwriteは自動retryしません。一時status 0408429502503504 を対象にし、Retry-After を尊重します。

Offline対応時は offlineInterceptorkitAuthInterceptor より前に登録します。Local modeではcredential生成とnetwork transportを止めながら、一致するread policyがスコープ付きReplicaを返せます。