Angular с использованием angular-oauth2-oidc: действительный токен не сохраняется в хранилище
Я использую Auth-сервер на основе Spring, который создает JWT.
clients.jdbc(dataSource())
.withClient("sampleClientId")
.authorizedGrantTypes("implicit", "password", "authorization_code", "refresh_token")
.scopes("read", "write", "foo")
.autoApprove(false)
.accessTokenValiditySeconds(3600)
.redirectUris("xxx","http://localhost:8080/pmt/", "http://localhost:8080/pmt/index.html", "http://localhost:8080/login/oauth2/code/custom")
Для защиты доступа к Auth-серверу я использую WebSecurityConfigurerAdapter:
public class ServerSecurityConfig extends WebSecurityConfigurerAdapter
{
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth.eraseCredentials(false);
auth.ldapAuthentication() ....;
}
...
}
На стороне клиента у меня есть угловое приложение, в котором я использую angular-oauth2-oidc для реализации неявного потока.
auth.service.ts:
export const authConfig: AuthConfig = {
loginUrl: 'http://localhost:8080/pmtauth/oauth/authorize',
redirectUri: 'http://localhost:8080/pmt/',
clientId: 'sampleClientId',
scope: 'read write foo',
responseType: 'id_token token',
requireHttps: false,
showDebugInformation: true,
tokenEndpoint: 'http://localhost:8080/pmtauth/oauth/token/',
oidc: false,
};
@Injectable()
export class AuthService {
constructor(
private route: ActivatedRoute,
private http: HttpClient,
private oauthService: OAuthService) {
this.oauthService.configure(authConfig);
this.oauthService.setStorage(sessionStorage);
this.oauthService.tryLogin();
}
login() {
this.oauthService.initImplicitFlow();
}
checkCredentials() {
if (this.oauthService.getAccessToken() === null) {
return false;
}
return true;
}
logout() {
this.oauthService.logOut();
location.reload();
}
...}
app.module.ts:
@NgModule({
bootstrap: [App],
declarations: [
App
],
imports: [ // import Angular's modules
BrowserModule,
HttpClientModule,
RouterModule,
FormsModule,
ReactiveFormsModule,
NgaModule.forRoot(),
NgbModule.forRoot(),
OAuthModule.forRoot(),
PagesModule,
routing
],
providers: [
AppState,
GlobalState,
AuthService,
{ provide: OAuthStorage, useValue: sessionStorage },
{ provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true },
]
После вызова метода initImplicitFlow() отображается страница входа в систему Auth-сервера. Когда я ввожу правильные учетные данные (в моем случае кредит LDAP), redirectUri, данный клиентом, называется:
http://localhost:8080/pmt/#access_token=<Token here>
&token_type=bearer
&state=lfSUoxuFJdp7O59UNb0gtXQPOOzcIB4ege0GDnPc
&expires_in=2162
&organization=usernamempdDr
&jti=742fed68-5af3-42f5-b0d9-b93433e28ef7
Тогда приложение "перенаправляет" на эту страницу http://localhost:8080/pmt/#
,
Поэтому я получаю действительный токен от моего Auth-сервера, как я вижу в URL, но angular-oauth2-oidc не извлекает его и не помещает в хранилище сессии. getIdToken, getAccessToken, hasValidIdToken и т. д. всегда возвращают ноль / ложь. В моих логах нет ошибок. Я отладил класс OAuthService, но callOnTokenReceivedIfExists() или storeAccessTokenResponse() никогда не вызываются.
Кстати: когда я в первый раз вызываю метод authorize на моем Auth-сервере, я должен разрешить каждую область видимости. Это нормальное поведение для неявного потока?