通过社交提供程序登录时,auth0 checkSession({})返回login_required,但通过用户名/密码登录时,则不返回

时间:2020-09-10 03:20:05

标签: auth0

我有一个使用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个人资料电子邮件'

1 个答案:

答案 0 :(得分:0)

因此,该问题似乎根本与我的应用无关。使用社交服务提供商时,Auth0在其中的一篇教程中有明确的注释,对我有帮助:

社交服务提供商的问题在于他们在我的Auth0仪表板中配置不正确,需要使用提供商特定的应用程序密钥。

重要说明:如果您在应用中使用Auth0社交联系, 请确保您已设置连接以使用自己的连接 客户端应用程序密钥。如果您使用的是Auth0开发人员密钥,则令牌续约 始终返回login_required。每个社交关系的详细信息都有一个 链接与有关如何获取自己的密钥的明确说明 特定的IdP。

在此页面上找到评论:https://auth0.com/blog/real-world-angular-series-part-7/