Запросить новый токен доступа и продолжить последний запрос - PullRequest
1 голос
/ 17 февраля 2020

Я использую Angular / Typescript. Приложение связывается с API, access_token хранится в хранилище.

При каждом запросе перехватчик проверяет, все ли действительное access_token.

Когда истекает access_token, приложение должно обновить sh access_token с помощью refresh_token и продолжить работу с последним запросом (с новым access_token)

Проблема Не удается получить клонирование исходный запрос (с токеном с истекшим сроком) и выполнить его. Вызов для запроса нового access_token мешает перехватчику. Как лучше всего:

  1. Запросить новый токен.
  2. Установить новый токен.
  3. Возобновить вызов с токеном с истекшим сроком действия и клоном для запуска. успешно?

Перехватчик:

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        // add authorization header with jwt token if available
        if (!this.isRefreshing) {
            if (this.authenticationService.checkLoginState()) {
                // Check if access_token is valid.
                this.currentUser = JSON.parse(localStorage.getItem('auth'));
                if (new Date(this.currentUser.access_token_expires) > new Date()) {
                    // Access token is valid, clone request and continue.
                    request = request.clone({
                        setHeaders: {
                            Authorization: `Bearer ${this.currentUser.access_token}`
                        }
                    });
                    return next.handle(request);
                } else {
                    // Token is not valid, request new token with reLogin().
                    this.reLogin().then(any => {
                        // New token has been set, now run old request with new token.
                        return next.handle(request);
                    }, error => {
                        this.authenticationService.logout();
                    });
                }
            }
        } else {
            return next.handle(request);
        }
    }

reLogin:

    reLogin() {
        return new Promise(function (resolve, reject) {
            this.isRefreshing = true;
            // Check if refresh token is valid
            if (new Date(this.currentUser.refresh_token_expires) > new Date()) {
                this.authenticationService.loginWithRefreshToken(this.currentUser.refresh_token).subscribe(data => {
                    // Using refresh_token was successful
                    this.currentUser = JSON.parse(localStorage.getItem('auth'));
                    this.isRefreshing = false;
                    resolve();
                }, error => {
                    console.error(error);
                    reject();
                });

        });
    }

1 Ответ

0 голосов
/ 19 февраля 2020

Первым замечанием будет создание нового const для запроса при его клонировании, а не присвоение его старому. Я думаю, что проблема в том, что вы вызываете reLogin и ожидаете, что в then у вас есть доступ к новому запросу с обновленным токеном. Но вы все еще в контексте старого request. Поэтому вам, вероятно, следует вернуть access_token из reLogin и установить его на клоне запроса, прежде чем продолжить с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...