我有一个使用Auth0进行身份验证的Angular应用,如果令牌尚未过期,我正尝试使用checkSession({},…)来持久化用户会话。
当我使用为网站设置的用户名/密码登录时,当我直接将浏览器/导航重新加载到资源时,此方法可以正常工作。但是,当我使用社交服务提供商(例如Google)登录时,页面重新加载上的checkSession({},…)调用返回一个错误,并迫使用户再次登录。
一些相关代码(主要来自auth0教程):
export class AuthService {
// Create Auth0 web auth instance
private _auth0 = new auth0.WebAuth({
clientID: AUTH_CONFIG.CLIENT_ID,
domain: AUTH_CONFIG.CLIENT_DOMAIN,
responseType: 'token',
redirectUri: AUTH_CONFIG.REDIRECT,
audience: AUTH_CONFIG.AUDIENCE,
scope: AUTH_CONFIG.SCOPE
});
accessToken: string;
userProfile: any;
expiresAt: number;
// Create a stream of logged in status to communicate throughout app
loggedIn: boolean;
loggedIn$ = new BehaviorSubject<boolean>(this.loggedIn);
loggingIn: boolean;
isAdmin: boolean;
// Subscribe to token expiration stream
refreshSub: Subscription;
constructor(private router: Router) {
// If app auth token is not expired, request new token
if (JSON.parse(localStorage.getItem('expires_at')) > Date.now()) {
this.renewToken();
}
}
...
handleAuth() {
// When Auth0 hash parsed, get profile
this._auth0.parseHash((err, authResult) => {
if (authResult && authResult.accessToken) {
window.location.hash = '';
this._getProfile(authResult);
} else if (err) {
this._clearRedirect();
this.router.navigate(['/']);
console.error(`Error authenticating: ${err.error}`);
}
this.router.navigate(['/']);
});
}
private _getProfile(authResult) {
this.loggingIn = true;
// Use access token to retrieve user's profile and set session
this._auth0.client.userInfo(authResult.accessToken, (err, profile) => {
if (profile) {
this._setSession(authResult, profile);
this._redirect();
} else if (err) {
console.warn(`Error retrieving profile: ${err.error}`);
}
});
}
private _setSession(authResult, profile?) {
this.expiresAt = (authResult.expiresIn * 1000) + Date.now();
// Store expiration in local storage to access in constructor
localStorage.setItem('expires_at', JSON.stringify(this.expiresAt));
this.accessToken = authResult.accessToken;
this.userProfile = profile;
if (profile) {
this.isAdmin = this._checkAdmin(profile);
}
...
}
...
get tokenValid(): boolean {
// Check if current time is past access token's expiration
return Date.now() < JSON.parse(localStorage.getItem('expires_at'));
}
renewToken() {
// Check for valid Auth0 session
this._auth0.checkSession({}, (err, authResult) => {
if (authResult && authResult.accessToken) {
this._getProfile(authResult);
} else {
this._clearExpiration();
}
});
}
}
(这来自在应用程序内许多地方调用的服务,包括一些路由保护程序以及某些依赖于配置文件信息的组件。如果有更多应用程序代码有用,我可以提供。)< / p>
也请注意:AUTH_CONFIG.SCOPE ='openid个人资料电子邮件'
答案 0 :(得分:0)
因此,该问题似乎根本与我的应用无关。使用社交服务提供商时,Auth0在其中的一篇教程中有明确的注释,对我有帮助:
社交服务提供商的问题在于他们在我的Auth0仪表板中配置不正确,需要使用提供商特定的应用程序密钥。
重要说明:如果您在应用中使用Auth0社交联系, 请确保您已设置连接以使用自己的连接 客户端应用程序密钥。如果您使用的是Auth0开发人员密钥,则令牌续约 始终返回login_required。每个社交关系的详细信息都有一个 链接与有关如何获取自己的密钥的明确说明 特定的IdP。
在此页面上找到评论:https://auth0.com/blog/real-world-angular-series-part-7/