Angular - oidc-клиент отправляет запрос /authorize для каждого вызова API REST

В настоящее время я настраиваю сервер идентификации с клиентом SPA и несколькими службами REST для получения данных.

Кажется, все работает, но я в настоящее время пытаюсь понять, почему каждый вызов API с действительным access_token вызывает запрос к /authorize конечная точка сервера идентификации.


Кнопка на странице входа


Эта кнопка просто вызывает мой REST API через экземпляр HttpClient от @angular/common/http

Эти кнопки на моем /login стр.

Обратный вызов с сервера идентификации настроен для перехода к /login/callback,


Запрос к /authorize конечная точка


Каждое нажатие на кнопку отправляет запрос /authorize конечная точка и в результате перенаправляет меня с http 302 к /login/callback стр.

Запрос проходит, и все работает, но всегда происходит перенаправление.

Я бы ожидал, что в случае действительного access_tokenэтот запрос не будет необходим?


AccessToken Interceptor


В пределах AccessTokenInterceptor Я звоню OidcService который имеет доступ к UserManager из библиотеки oidc-client.

По какой-то причине каждый запрос, который включает getUser() на UserManager вызывает это /authorize запрос в ответ - хотя access_token все еще в силе. Что мне здесь не хватает?

@Injectable()
export class AccessTokenInterceptor implements HttpInterceptor {

constructor(private oidcService: OidcService) { }

intercept(request: HttpRequest<any>, next: HttpHandler): 
Observable<HttpEvent<any>> {

return this.oidcService.getUser()
  .mergeMap((user: User) => {

    if (user) {
      request = request.clone({
        setHeaders: {
          Authorization: `Bearer ${user.access_token}`
        }
      });
    }

    return next.handle(request);
   });
  }
 }

Я ценю любую помощь в этом вопросе, и, пожалуйста, дайте мне знать, если вам понадобится еще несколько примеров кода.


Обновление 1


Как только я вызываю кнопку "Call Api", выполняются следующие три запроса.

  1. OPTIONS запрос к моему REST API.
  2. /authorize запрос (который в конечном итоге возвращает http 302 и делает перенаправление, которое я хотел бы избежать)
  3. GET просьба к которой я и собирался сделать.


Обновление 2


Веб-приложение - UserManagerSettings

{
    "authority": "https://localhost:44327",
    "client_id": "webClient",
    "response_type": "id_token token",
    "scope": "openid testclientapi testclientapi.read testclientapi.write",
    "redirect_uri": "http://localhost:4200/login/callback",
    "post_logout_redirect_uri": "http://localhost:4200/logout/callback",
    "silent_redirect_uri": "http://localhost:4200/login/silentLogin",
    "automaticSilentRenew": true,
    "monitorSession": true,
    "revokeAccessTokenOnSignout": true,
    "loadUserInfo": true
}

Identity Server - Конфигурация клиента

       new Client {
                    ClientId = "webClient",
                    ClientName = "myclient",
                    AllowedGrantTypes = GrantTypes.Implicit,

                    AccessTokenType = AccessTokenType.Reference,
                    AccessTokenLifetime = 60 * 60,
                    IdentityTokenLifetime = 30,
                    RequireConsent = false,
                    AllowOfflineAccess = true,
                    AllowAccessTokensViaBrowser = true,

                    ClientSecrets =
                    {
                        new Secret("XYZ)
                    },

                    AllowedCorsOrigins = new string[]
                    {
                        "http://localhost:4200",
                    },
                    RedirectUris =
                    {
                        "http://localhost:4200/login/callback",
                        "http://localhost:4200/login/silentLogin",
                        "http://localhost:4200/logout/callback",

                    },
                    PostLogoutRedirectUris =
                    {
                        "http://localhost:4200/logout/callback",                         
                    },

                    AllowedScopes =
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        "testclientapi",
                        "testclientapi.read",
                        "testclientapi.write"
                    }
                }
            };

Обновление 3


getUser() : Observable<User> {
    return Observable.fromPromise(this.userManager.getUser())
  }

1 ответ

Решение

Я нашел временное решение этой проблемы.

Это работает как по волшебству, как только я не вызвал запрос REST API от моего /login маршрут, но вместо этого из другого места, например /admin,

Что в итоге не отправляет никаких запросов /authorize конечная точка.

Я обновлю этот ответ, как только выясню, почему именно это происходит.

Запрос REST API

Обновление 1

Я столкнулся с симуляцией проблем при выполнении /logout запросы - также пришлось перенести его на полный другой маршрут...

Другие вопросы по тегам