Angular 8アプリケーションにモバイルアクセストークンを追加するにはどうすればよいですか?

彼らは運ぶ

アプリケーションをUATにデプロイしましたが、アクセス拒否(401)ページに直接移動するため、モバイルでアプリケーションを実行できません。アクセストークンの問題が原因だと思います。

私のアプリケーションを処理するために、主に2つのインターセプターがあります。1.エラーインターセプター-ルートエラーまたは不正なエラーが発生した場合に処理します。2.jwt-トークンを取得するために認証サービスを内部的に呼び出すトークンを割り当てます。

以下は、トークンを受信する準備ができているというpostMessage送信することにより、セッションまたはローカルで、またはウィンドウイベントからアクセストークンを取得しようとしているサービスファイルです

authentication-service.ts

public getToken() {
    let accessToken = null;
     const auth = JSON.parse(sessionStorage.getItem('auth'));
    if (auth) {
        accessToken = auth.access_token;
    } elseif (accessToken == null || accessToken === undefined) {
        accessToken = localStorage.getItem('access_token');
    }

 window.addEventListener('message', function(event){
      // this event should have all the necessary tokens
 }, false);

 // once my page is loaded to indicate that I am ready to receive the message from server side.
  parent.postMessage({ askForToken:"true"}, "*");

  return accessToken;
}

window.addEventListenerを作成してデータを取得するためにparent.postMessageを送信していますが、イベントが期待どおりにトークンを送信していません。

私はauthentication.service.tsで上記のすべてのコード実装を行っていますが、それが正しい方法かどうかはわかりません。

このコードを実装してトークンを適切に受け取る正しい方法を誰かに提案してもらえますか?

トークンを使用した展開を初めて試みているので、修正してください。

trungk18

ソースコードとデモ:

https://github.com/trungk18/angular-authentication-demo-with-lazy-loading

https://stackblitz.com/edit/angular-authentication-demo-with-lazy-loading

最初に実行するときに、他のすべてのモジュールを遅延ロードするセクションを追加します。つまり、ログインページのみが最初に読み込まれます。ログイン後、次のモジュールがロードされます。それは私たちに多くの帯域幅を節約します。


ユーザーがいて、ログインに成功した後、このオブジェクト全体をlocalStorageに保存します。

フローは次のようになります。

  1. アプリケーションを開きます

  2. AuthGuardがトリガーされます。トークンを持つユーザーオブジェクトがlocalStorageにある場合は、ルートをアクティブ化します。そうでない場合は、ログインページに戻ります。

  3. ルートがアクティブ化され、サーバーへのAPI呼び出しを開始すると、JWTInterceptorがトリガーされ、後続の各要求でトークンが送信されます。

  4. ErrorInterceptorは401があるかどうかを確認してから、localStorageからユーザーを削除し、ページをリロードします。誰かのユースケースでのこの処理は、別のトークンまたはオブジェクトでlocalStorageを手動で更新しようとします。サーバーからの修飾子がなくてもトークンが正しい場合、それは発生しないはずです。


モデル

export const ConstValue = { 
    ReturnUrl: "returnUrl",
    CurrentUser: "currentUser",    
}

export const ConstRoutingValue = {
    Login: "login"
}

export interface AICreateUser {
    firstName: string;
    lastName: string;
    email: string;
    password: string;    
    roleIds: string[]
}

export interface PartnerUser extends AICreateUser {
    id: string;    
    createdAt: string;    
    token: string;    
    featureSet: string[]
}

export interface AuthDto {
    email: string;
    password: string;
}

auth.service

export class AuthService {
    private _currentUserSubject: BehaviorSubject<User>;
    public currentUser: Observable<User>;

    public get currentUserVal(): User {
        return this._currentUserSubject.value;
    }

    get currentUserToken() {
        return this.currentUserVal.token;
    }

    constructor(private http: HttpClient) {
        this._currentUserSubject = new BehaviorSubject<User>(this.getUserFromLocalStorage());
        this.currentUser = this._currentUserSubject.asObservable();
    }

    login(username, password) {
        return this.http.post<any>(`/users/authenticate`, { username, password })
            .pipe(map(user => {
                // store user details and jwt token in local storage to keep user logged in between page refreshes
                localStorage.setItem(ConstValue.CurrentUser, JSON.stringify(user));
                this._currentUserSubject.next(user);
                return user;
            }));
    }

    logout() {
        // remove user from local storage and set current user to null
        localStorage.removeItem(ConstValue.CurrentUser);
        this._currentUserSubject.next(null);
    }

    private getUserFromLocalStorage(): User {
        try {
          return JSON.parse(localStorage.getItem(ConstValue.CurrentUser)!);
        } catch (error) {
          return null!;
        }
      }
}

そして、リクエストごとにヘッダーにトークンを追加するJwtInterceptorがあります

export class JwtInterceptor implements HttpInterceptor {
  constructor(private authenticationService: AuthService) {}

  intercept(
    request: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    let currentUser = this.authenticationService.currentUserVal;
    if (currentUser && currentUser.token) {
      request = request.clone({
        setHeaders: {
          Authorization: `Bearer ${currentUser.token}`
        }
      });
    }

    return next.handle(request);
  }
}

export const JWTInterceptorProvider = {
  provide: HTTP_INTERCEPTORS,
  useClass: JwtInterceptor,
  multi: true
};

ErrorInterceptorは、401があるかどうかを確認してから、localStorageからユーザーを削除してページをリロードします。

export class ErrorInterceptor implements HttpInterceptor {
    constructor(private authenticationService: AuthService) {}

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        return next.handle(request).pipe(catchError(err => {
            if (err.status === 401) {
                // auto logout if 401 response returned from api
                this.authenticationService.logout();
                location.reload(true);
            }
            
            const error = err.error.message || err.statusText;
            return throwError(error);
        }))
    }
}

export const ErrorInterceptorProvider = { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true }

また、ルートをアクティブ化する前にトークンがあることを確認するためのAuthGuardがあります。ログインページを除き、Angularルーターを構成するときにすべてのルートに含める必要があります。

export class AuthGuard implements CanActivate {
    constructor(
        private router: Router,
        private authenticationService: AuthService
    ) {}

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
        const currentUserToken = this.authenticationService.currentUserToken;
        if (currentUserToken) {
            return true;
        }

        // not logged in so redirect to login page with the return url
        this.router.navigate(['/login'], { queryParams: { [ConstValue.ReturnUrl]: state.url }});
        return false;
    }
}

Userオブジェクトを使用する場合は、AuthService内でcurrentUserのパブリックオブザーバブルを取得します。たとえば、リストにユーザーユーザーの名を表示したい

export class AppComponent {
    currentUser: User;

    constructor(
        private router: Router,
        private authenticationService: AuthService
    ) {
        this.authenticationService.currentUser.subscribe(
            x => (this.currentUser = x)
        );
    }

    logout() {
        this.authenticationService.logout();
        this.router.navigate(["/login"]);
    }
}

そこからアイデアが浮かぶことを願っています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Angular 2クライアント側アプリケーションでAPIキーを非表示/保護するにはどうすればよいですか?

分類Dev

Angularアプリケーションで親にクラスを追加するにはどうすればよいですか?

分類Dev

Angular4アプリケーションのRESTAPIを介してクライアントブラウザコンソールログをバックエンドに転送するにはどうすればよいですか?

分類Dev

Angular 2アプリケーションでバックエンド言語としてPHPを使用するにはどうすればよいですか?

分類Dev

Angularアプリケーションをテストするために(Angular Materialを使用して)共有モジュールをインポートするにはどうすればよいですか?

分類Dev

クライアント側のAngularアプリケーションで発生する可能性のあるすべてのコンソールエラーをログに記録するにはどうすればよいですか?

分類Dev

バックエンドから取得した構成値をすべてのAngular6アプリケーションコンポーネントとグローバルに共有するにはどうすればよいですか?

分類Dev

Ionic3、Cordova、Angular4アプリケーションでAndroidデバイスの言語を取得するにはどうすればよいですか?

分類Dev

VisualStudioのソリューションにAngular5アプリケーションを追加するにはどうすればよいですか?

分類Dev

Tomcatサーバー(Windows Server 2012)にAngular2アプリケーションをデプロイするにはどうすればよいですか?

分類Dev

データマップAngular8のバブルにアニメーション効果を追加するにはどうすればよいですか?

分類Dev

Angular WebアプリをモバイルChromeでフルスクリーンで開くにはどうすればよいですか?

分類Dev

PHPアプリケーションでAngular 2を使用するにはどうすればよいですか?

分類Dev

AngularアプリケーションでFirebaseAdmin SDKを使用するにはどうすればよいですか?

分類Dev

Angular2アプリケーションでMediaRecorderオブジェクトを使用するにはどうすればよいですか?

分類Dev

Angular 8アプリケーションでビューポート全体を使用するにはどうすればよいですか?

分類Dev

Angular 8アプリケーションでInternet Explorerをサポートするにはどうすればよいですか?

分類Dev

BlocklyをAngular7アプリケーションにインポートするにはどうすればよいですか?

分類Dev

ネイティブスクリプトAngularアプリでナビゲーションラグとメモリ不足の問題をプロファイリングするにはどうすればよいですか?

分類Dev

Angular 6の本番レベルのアプリケーションでクロスオリジンリソースシェアリングを処理するにはどうすればよいですか?

分類Dev

Angular 5アプリケーションでCLIを使用して新しい@ngrxファイルを作成するにはどうすればよいですか?

分類Dev

HTML / Angularアプリケーションからモバイルカメラにアクセスする

分類Dev

Angular Materialの必須フィールドからアスタリスクを削除し、オプションラベルのラベルの横に(オプション)を追加するにはどうすればよいですか?

分類Dev

rxjs6を使用してAngular8でスクロールアニメーションを実装するにはどうすればよいですか?

分類Dev

最新バージョンのストライプペイメントゲートウェイ(サーバーチェックアウト)をangular-8に統合するにはどうすればよいですか?

分類Dev

typescriptモジュールの拡張をAngularライブラリまたはアプリケーションに適切にインポート/含めるにはどうすればよいですか?

分類Dev

フロントエンドにAngular 7を、バックエンドにSpring Bootを使用してアプリケーションをデバッグするにはどうすればよいですか

分類Dev

Angularインターセプター内のリクエストの本文に何かを追加するにはどうすればよいですか?

分類Dev

Angular 2アプリケーションでnpmを使用してツールチップにqtip2をインストールするにはどうすればよいですか?

Related 関連記事

  1. 1

    Angular 2クライアント側アプリケーションでAPIキーを非表示/保護するにはどうすればよいですか?

  2. 2

    Angularアプリケーションで親にクラスを追加するにはどうすればよいですか?

  3. 3

    Angular4アプリケーションのRESTAPIを介してクライアントブラウザコンソールログをバックエンドに転送するにはどうすればよいですか?

  4. 4

    Angular 2アプリケーションでバックエンド言語としてPHPを使用するにはどうすればよいですか?

  5. 5

    Angularアプリケーションをテストするために(Angular Materialを使用して)共有モジュールをインポートするにはどうすればよいですか?

  6. 6

    クライアント側のAngularアプリケーションで発生する可能性のあるすべてのコンソールエラーをログに記録するにはどうすればよいですか?

  7. 7

    バックエンドから取得した構成値をすべてのAngular6アプリケーションコンポーネントとグローバルに共有するにはどうすればよいですか?

  8. 8

    Ionic3、Cordova、Angular4アプリケーションでAndroidデバイスの言語を取得するにはどうすればよいですか?

  9. 9

    VisualStudioのソリューションにAngular5アプリケーションを追加するにはどうすればよいですか?

  10. 10

    Tomcatサーバー(Windows Server 2012)にAngular2アプリケーションをデプロイするにはどうすればよいですか?

  11. 11

    データマップAngular8のバブルにアニメーション効果を追加するにはどうすればよいですか?

  12. 12

    Angular WebアプリをモバイルChromeでフルスクリーンで開くにはどうすればよいですか?

  13. 13

    PHPアプリケーションでAngular 2を使用するにはどうすればよいですか?

  14. 14

    AngularアプリケーションでFirebaseAdmin SDKを使用するにはどうすればよいですか?

  15. 15

    Angular2アプリケーションでMediaRecorderオブジェクトを使用するにはどうすればよいですか?

  16. 16

    Angular 8アプリケーションでビューポート全体を使用するにはどうすればよいですか?

  17. 17

    Angular 8アプリケーションでInternet Explorerをサポートするにはどうすればよいですか?

  18. 18

    BlocklyをAngular7アプリケーションにインポートするにはどうすればよいですか?

  19. 19

    ネイティブスクリプトAngularアプリでナビゲーションラグとメモリ不足の問題をプロファイリングするにはどうすればよいですか?

  20. 20

    Angular 6の本番レベルのアプリケーションでクロスオリジンリソースシェアリングを処理するにはどうすればよいですか?

  21. 21

    Angular 5アプリケーションでCLIを使用して新しい@ngrxファイルを作成するにはどうすればよいですか?

  22. 22

    HTML / Angularアプリケーションからモバイルカメラにアクセスする

  23. 23

    Angular Materialの必須フィールドからアスタリスクを削除し、オプションラベルのラベルの横に(オプション)を追加するにはどうすればよいですか?

  24. 24

    rxjs6を使用してAngular8でスクロールアニメーションを実装するにはどうすればよいですか?

  25. 25

    最新バージョンのストライプペイメントゲートウェイ(サーバーチェックアウト)をangular-8に統合するにはどうすればよいですか?

  26. 26

    typescriptモジュールの拡張をAngularライブラリまたはアプリケーションに適切にインポート/含めるにはどうすればよいですか?

  27. 27

    フロントエンドにAngular 7を、バックエンドにSpring Bootを使用してアプリケーションをデバッグするにはどうすればよいですか

  28. 28

    Angularインターセプター内のリクエストの本文に何かを追加するにはどうすればよいですか?

  29. 29

    Angular 2アプリケーションでnpmを使用してツールチップにqtip2をインストールするにはどうすればよいですか?

ホットタグ

アーカイブ