在Angular 2应用程序中获取回调URL不匹配

时间:2016-12-01 20:41:59

标签: redirect angular login auth0

我使用Auth0通过Google,Facebook和其他人授权用户。如果您在Auth0中列出白名单的回调URL列表时单击登录,则此方法非常有效。

但我的网络应用程序可以包含任意数量的不同网址,因此使用包含一些允许的网址的简单白名单不起作用。

登录始终尝试重定向回我登录时的相同URL,此URL大部分时间不在允许的URL列表中。

我已尝试过上述设置的各种变体,但我只会遇到以下错误:

  

网址“https://x.com/posts/gif/hot/1”不在允许的回拨网址列表中   网址“https://x.com/posts/world/new/1”不在允许的回调网址列表中   网址“https://x.com/posts/nature/hot/6”不在允许的回调网址列表中   网址“https://x.com/posts/gaming/hot/3”不在允许的回调网址列表中

Lock配置相关代码:

options = {
    auth: {
        callbackURL: 'https://x.com',
        // redirectUrl: 'https://x.com',
        responseType: 'token',
        // sso: true,
        // redirect: true,
        params: {
            scope: 'openid user_id name nickname email picture'
        }
    }
};

// Configure Auth0
lock = new Auth0Lock('x', 'x.auth0.com', this.options);

constructor(private _router: Router) {
    this.userProfile = JSON.parse(localStorage.getItem('profile'));

    // Add callback for the Lock `authenticated` event
    this.lock.on('authenticated', (authResult) => {
        localStorage.setItem('id_token', authResult.idToken);

        // Fetch profile information
        this.lock.getProfile(authResult.idToken, (error, profile) => {
            if (error) {
                throw new Error(error);
            }
        });
    });
};

登录方法:

public login() {
    // Call the show method to display the widget.
    this.lock.show({
        callbackUrl: 'https://x.com',
        state: this._router.url
    });
};

1 个答案:

答案 0 :(得分:1)

我假设您使用的是最新版本的Lock(Lock 10),如果是这种情况,您所包含的代码存在一些问题:

  • 用户完成身份验证步骤后的URL to which Auth0 will redirect to是通过auth: { redirectUrl: '...' }指定的,您已对该行进行了注释,而代码却错误地使用了callbackURL
  • According to the docsshow方法不再使用任何参数。
  • 独立于Lock版本,state parameter应该用于缓解CSRF攻击,因此专门用它来传递上下文信息可能是不安全的。

鉴于你有redirectUrl评论,你可能也试过了;你在使用那个参数时有没有相同的行为?

根据文档,您应该通过以下方式完成所需配置:

options = {
    auth: {
        redirectUrl: 'https://example.com/login/callback',
        responseType: 'token',
        params: {
            state: '[your_state_value]',
            scope: 'openid user_id name nickname email picture'
        }
    }
};

public login() {
    // Call the show method to display the widget.
    this.lock.show();
};