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", выполняются следующие три запроса.
OPTIONS
запрос к моему REST API./authorize
запрос (который в конечном итоге возвращает http302
и делает перенаправление, которое я хотел бы избежать)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
конечная точка.
Я обновлю этот ответ, как только выясню, почему именно это происходит.
Обновление 1
Я столкнулся с симуляцией проблем при выполнении /logout
запросы - также пришлось перенести его на полный другой маршрут...