Несоответствие URL обратного вызова Auth0

Я выполняю аутентификацию LinkedIn с auth0 в приложении реакции. Я установил localhost:3000/upload в URL-адресах обратного вызова в настройках, указав, что после входа пользователей в localhost:3000/login они будут перенаправлены на localhost:3000/upload. Однако я всегда получаю эту ошибку: url localhost:3000/login отсутствует в списке URL-адресов обратного вызова. Почему auth0 должен ожидать возврата на страницу, на которой вы только что вошли в систему после входа в систему? Разве это не какой-то другой URL-адрес. Для меня это просто не имеет смысла.

Редактировать:

export default class AuthService {
  constructor(clientId, domain) {
    // Configure Auth0
    const options = {
      allowedConnections: ['linkedin'],
      auth: {
        params: {responseType: 'code'}
      }
    };  
    this.lock = new Auth0Lock(clientId, domain, options)
    // Add callback for lock `authenticated` event
    this.lock.on('authenticated', this._doAuthentication.bind(this))
    // binds login functions to keep this context
    this.login = this.login.bind(this)
    this.loggedIn = this.loggedIn.bind(this)
  }

  _doAuthentication(authResult){
    // Saves the user token
    console.log(authResult);
    this.setToken(authResult.idToken)
    this.lock.getProfile(authResult.idToken, (error, profile) => {
      if (error) {
        console.log('Error loading the Profile', error)
      } else {
        console.log(profile)
      }
    })
  }
//....

person shangsunset    schedule 24.07.2016    source источник


Ответы (6)


Пожалуйста, убедитесь в двух вещах:

1). В коде вашего реагирующего приложения

 responseType: 'code'

2). На панели управления Auth0 в разделе «Настройки» -> «Разрешенные URL-адреса обратного вызова» поместите запись обратного вызова (localhost: 3000 / upload) - что, я думаю, вы сделали, но на всякий случай.

введите описание изображения здесь

Сообщите мне, если у вас все еще есть проблемы.

person arcseldon    schedule 25.07.2016
comment
Эй, спасибо за ответ. Я сделал то, что вы предложили, но он по-прежнему направляет меня на тот же URL-адрес, по которому я проверяю подлинность. - person shangsunset; 25.07.2016
comment
Для реагирующего приложения вы должны действительно использовать неявный поток грантов ..., поэтому в этом случае сделайте responseType = token и используйте прослушиватель событий, как вы это делаете, - это моя рекомендация. Есть смысл? - person arcseldon; 25.07.2016
comment
эй, извините, забыл прокомментировать. нет, это не сработало, поэтому я выбрал другой подход. но я использовал прослушиватели событий. - person shangsunset; 05.08.2016
comment
Приятно слышать, что вы во всем разобрались :) - person arcseldon; 06.08.2016
comment
Как разрешить всех клиентов? - person Steve K; 28.09.2016
comment
@shangsunset, если вы можете поделиться своим окончательным ответом на эту проблему, у меня такая же проблема, и мне бы понравилось решение - person Seer; 03.11.2016

Чтобы вызвать перенаправление на другой URL-адрес после успешной аутентификации, вам необходимо указать redirectUrl для блокировки, например:

// Настроить Auth0 const options = {allowedConnections: ['linkedin'], auth: {responseType: 'code', redirectUrl: 'http://localhost:3000/upload '}};
this.lock = new Auth0Lock (clientId, домен, параметры)

(Также обратите внимание, что параметр responseType находится под auth, а не под auth.params.)

Если вы сделаете перенаправление, вы не достигнете обработчика событий, который вы определили на своей странице входа. Вам нужно будет либо добавить обработчик событий на целевой странице (и использовать responseType:token), либо обработать результаты аутентификации в коде вашего сервера (это то, что вы обычно будете делать, если запрашиваете responseType: code).

person Nico Sabena    schedule 06.09.2016

Убедитесь, что нет специальных скрытых символов или пробелов между запятыми между URL-адресами, когда вы вставляете его на сайт настроек Auth0. Я не знал об этой утилите, я помещал все URL-адреса в Vim, чтобы проверить и увидеть, что есть такие вышеупомянутые случаи

person Thai Tran    schedule 10.03.2018

При вызове AuthProvider обязательно используйте тот же URL-адрес обратного вызова, что и в настройках Auth0:

const uri='http://localhost:3000/upload';

        <Auth0Provider
        domain={domain}
        clientId={clientId}
        redirectUri={uri}>
person Maiuran Loganathan    schedule 29.09.2020

У меня была аналогичная проблема несоответствия URL-адреса обратного вызова, и я решил ее, запустив приложение через https с доверенным сертификатом.

Вот фрагмент из раздела настроек приложений Auth0 об URL-адресе обратного вызова, в котором говорится: Обязательно укажите протокол (https: //), в противном случае обратный вызов может завершиться ошибкой в ​​некоторых случаях.

введите описание изображения здесь

person Varun Nair    schedule 14.01.2021
comment
LOL я столкнулся именно с этим: D - person Sang Dang; 24.02.2021

причина, по которой вы должны установить URL-адрес обратного вызова в настройках auth0, потому что любой может использовать ваш идентификатор клиента и отправить запрос в Google или linkedin, получить ответ в любом месте, которое они установили. но с этой настройкой только вы можете получить доступ к этому ответу.

как только ваше приложение получит разрешение на получение данных из linkedin, linkedin отправит данные туда, куда вы указали. вам следует создать страницу для обработки ответа от сервера Linkedin. Назовем эту страницу callback.js, и это будет пример объекта ответа.

accessToken: "hNuPLKTZHiE9_lnED0JIiiPNjlicRDp"
   appState: null
   expiresIn: 7200
   idToken: "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik5FRXdSVUl5TURVeE4wSkJPRFZEUlRKRU1EVkZNemsxTXpNNU5VTXlNRGt6T0VWQlJqUkZRUSJ9.eyJodHRwOi8vbG9jYWxob3N0OjMwMDAvcm9sZSI6InNpdGVPd25lciIsImdpdmVuX25hbWUiOiJvbWFyIiwiZmFtaWx5X25hbWUiOiJpYm8iLCJuaWNrbmFtZSI6Im9tYXJpYm8xOTgyIiwibmFtZSI6Im9tYXIgaWJvIiwicGljdHVyZSI6Imh0dHBzOi8vbGg1Lmdvb2dsZXVzZXJjb250BQUFBQUkvQUFBQUFBQUFBQUEvQUNIaTNyLTEwLTEyVDIyOjU4OjAxLjgzM1oiLCJpc3MiOiJodHRwczovL3BvcnRmb2xpby15aWxtYXouYXV0aDAuY29tLyIsInN1YiI6Imdvb2dsZS1vYXV0aDJ8MTE0MDY0NTA2ODI2OTgwNTA5ODY3IiwiYXVkIjoiUEdVY242RjRRS21PRkJhb1k0UFdCeWpjVzIyT09vNGMiLCJpYXQiOjE1NzA5MjEwODIsImV4cCI6MTU3MDk1NzA4MiwiYXRfaGFzaCI6InN0R1l5SnJaMHNnbVYzSWNLWjlPeFEiLCJub25jZSI6InRrOV95b096enRmVThVVjFVMlVFR3IyMW5ORW5abjk4In0.TYS7mM8N2d7jEHFdWQGTSeAAUaDt4-0SMUG3LrcQ1r3xzY0RMGsUsEszj5xqk1GE0cIlFS10xCOYKsuHSwsFLomC1EbLjntjkledHtfD0MW84cMoXN6a-x-1-bNwl3lMYJ98qklTrNvTvkQJ6DWhei3hJ8rs8dnbNyCfckNVU6ptJU-9ef1DwWfHRomW5LQ6WSDRHZScW697gdgBEMU-Nd2SddyHhQe0kVh6lKdcbnskEAyCJLE07jfM40RQI_8LJouFcpoyImcXSDZlKv90tYfVDq9_TwE3GNaSz5I5snn0457oCgz0vuX0JoCUiaDuTIX7XiyXnozW_DxGMuhk4w"
   idTokenPayload: {http://localhost:3000/role: "siteOwner", given_name: "me", family_name: "you", nickname: "nck", name: "nm", …}
   refreshToken: null
  scope: null
   state: "xkEbffzXbdOYPLkXOUkrQeb0Jysbnlfy"
   tokenType: "Bearer"
//THIS CODE IS FOR NEXT.JS9
//auth.js
class Auth0 {
  constructor() {
    this.auth0 = new auth0.WebAuth({
      domain: "portfolio-ys.auth0.com",
      clientID: "PGUWJQKmOFBaoY4PWByjcW22OOo4c",
      redirectUri: "http://localhost:3000/callback",
      responseType: "token id_token",
      scope: "openid profile"
    });

     this.handleAuthentication = this.handleAuthentication.bind(this);
  }
     //there are too many methods are defined here i put only relevant ones
    handleAuthentication() {
        return new Promise((resolve, reject) => {
          this.auth0.parseHash((err, authResult) => {
            console.log(authResult);
            if (authResult && authResult.accessToken && authResult.idToken) {
              this.setSession(authResult);
              resolve();
            } else if (err) {
              reject(err);
            }
          });
        });
      }

setSession function is where you set the cookies based on response object. I use js-cookie package to set the cookie.

    setSession(authResult) {
        const expiresAt = JSON.stringify(
          authResult.expiresIn * 1000 + new Date().getTime()
        );
        Cookies.set("user", authResult.idTokenPayload);
        Cookies.set("jwt", authResult.idToken);
        Cookies.set("expiresAt", expiresAt);
      }


}
const auth0Client = new Auth0();
export default auth0Client;


callback.js
import React from "react" 
import auth0Client from "./auth0"
import {withRouter} from "next/router"

 class Callback extends React.Component{
    async componentDidMount(){
        await auth0Client.handleAuthentication()
        this.props.router.push('/')
    }
    render() {
        return (

                    <h1>verifying logging data</h1>

        )
    }
}

export default withRouter(Callback) //this allows us to use router
person Yilmaz    schedule 13.10.2019