gpt4 book ai didi

oidc-client-js - 静默刷新不适用于Angular 5中的OIDC客户端

转载 作者:行者123 更新时间:2023-12-04 12:39:25 25 4
gpt4 key购买 nike

我对oidc-client的无提示刷新有问题。
登录工作正常,我可以获取 token 。
但是,无提示刷新不会触发,什么也不会发生。当我订阅检查 token 到期的方法时(以下authservice.ts中subscribeevents中的方法),这些方法将永远不会触发-即使 token 已过期,isLoggedIn()方法也始终返回true。
这是我的代码:

import { Component, OnInit } from '@angular/core';
import { UserManager } from 'oidc-client';
import { getClientSettings } from '../openIdConnectConfig';
import { AuthService } from '../services/auth.service';

@Component({
selector: 'app-silentrefresh',
templateUrl: './silentrefresh.component.html',
styleUrls: ['./silentrefresh.component.css']
})
export class SilentRefreshComponent implements OnInit {
constructor(private _authService:AuthService) {
}

ngOnInit() {
this._authService.refreshCallBack();
}
}
然后我的authservice:
import { UserManagerSettings, UserManager, User } from 'oidc-client';
import { Injectable } from '@angular/core';
import { getClientSettings } from '../openIdConnectConfig';

@Injectable()
export class AuthService {

private _manager = new UserManager(getClientSettings());
private _user: User = null;

constructor() {
this._manager.getUser().then(user => {
this._user = user;
});

this._manager.events.addUserLoaded(user => {
this._user = user;
});

this.subscribeevents();
}

public isLoggedIn(): boolean {
return this._user != null && !this._user.expired;
}

public getClaims(): any {
return this._user.profile;
}

public subscribeevents(): void {
this._manager.events.addSilentRenewError(() => {
console.log("error SilentRenew");
});

this._manager.events.addAccessTokenExpiring(() => {
console.log("access token expiring");
});

this._manager.events.addAccessTokenExpired(() => {
console.log("access token expired");
});
}

public refreshCallBack(): void {
console.log("start refresh callback");
this._manager.signinSilentCallback()
.then(data => { console.log("suucess callback") })
.catch(err => {
console.log("err callback");
});
console.log("end refresh callback");
}

getUser(): any {
return this._user;
}

getName(): any {
return this._user.profile.name;
}

getAuthorizationHeaderValue(): string {
return `${this._user.token_type} ${this._user.access_token}`;
}

startAuthentication(): Promise<void> {
return this._manager.signinRedirect();
}

completeAuthentication(): Promise<void> {
return this._manager.signinRedirectCallback().then(user => {
this._user = user;
});
}
}
而我的配置:
import { UserManagerSettings } from "oidc-client";

export function getClientSettings(): UserManagerSettings {
return {
authority: 'https://login.microsoftonline.com/136544d9-038e-4646-afff-10accb370679',
client_id: '257b6c36-1168-4aac-be93-6f2cd81cec43',
redirect_uri: 'http://localhost:4200/auth-callback',
//redirect_uri: 'https://demoazureadconnectangular5.azurewebsites.net/auth-callback',
post_logout_redirect_uri: 'http://localhost:4200/',
//post_logout_redirect_uri: 'https://demoazureadconnectangular5.azurewebsites.net/',
response_type: "id_token",
scope: "openid profile",
filterProtocolClaims: true,
loadUserInfo: true,
automaticSilentRenew: true,
silent_redirect_uri: 'http://localhost:4200/assets/silentrefresh',
metadata: {
issuer: "https://sts.windows.net/136544d9-038e-4646-afff-10accb370679/",
authorization_endpoint: "https://login.microsoftonline.com/136544d9-038e-4646-afff-10accb370679/oauth2/authorize",
token_endpoint: "https://login.microsoftonline.com/136544d9-038e-4646-afff-10accb370679/oauth2/token",
//jwks_uri: "https://login.microsoftonline.com/common/discovery/keys",
jwks_uri: "http://localhost:4200/assets/keys.json",
//jwks_uri: "https://demoazureadconnectangular5.azurewebsites.net/assets/keys.json",
//jwks_uri: "http://localhost:50586/api/keys",
signingKeys: [{ "ApiAccessKey": "NgixniZ0S1JHxo7GPEZYa38OBTxSA98AqJKDX5XqsJ8=" }]
}
};
}
我也尝试使用这样的静态页面:
<head>
<title></title>
</head>

<body>
<script src="oidc-client.min.js"></script>
<script>
var usermanager = UserManager().signinSilentCallback()
.catch((err) => {
console.log(err);
});
</script>
</body>
从来没有炒过
为了进行测试,我将ID token 的有效期限更改为10分钟。
我使用Azure AD Connect(Azure中的Open Id Connect),并且Microsoft表示它与Open ID Connect标准不完全兼容...因此我不知道它是支持我还是Azure。
有人可以帮助我解决这个问题吗?

最佳答案

问题在于,您不是从azure AD询问access_token,而只是询问id_token。您必须将response_type设置为id_token token 才能获取两个 token 。此更改还将需要几个其他参数。例如您的后端资源。
我在这里回答了类似的问题。我也在使用Angular 5和oidc客户端。 https://stackoverflow.com/a/50922730/8081009
我也在https://github.com/IdentityModel/oidc-client-js/issues/504#issuecomment-400056662之前在这里回答你
这是您需要设置的功能,以使它们无声地恢复工作。

includeIdTokenInSilentRenew: true
extraQueryParams: {
resource: '10282f28-36ed-4257-a853-1bf404996b18'
}
response_type: 'id_token token',
scope: 'openid'
loadUserInfo: false,
automaticSilentRenew: true,
silent_redirect_uri: `${window.location.origin}/silent-refresh.html`,
metadataUrl: 'https://login.microsoftonline.com/YOUR_TENANT_NAME.onmicrosoft.com/.well-known/openid-configuration',
signingKeys: [
add here keys from link below
]

https://login.microsoftonline.com/common/discovery/keys

我还对具有静默更新的回调终结点使用了不同的静态页面,因为这种方式用户不会注意到任何事情。该页面的数量最少,因此oidc不会将整个角度应用程序加载到用于静默更新的隐藏iframe中。因此,建议提高效率。
<head>
<title></title>
</head>

<body>
<script src="assets/oidc-client.min.js"></script>
<script>
new Oidc.UserManager().signinSilentCallback()
.catch((err) => {
console.log(err);
});
</script>
</body>

关于oidc-client-js - 静默刷新不适用于Angular 5中的OIDC客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48778603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com