Firebase, Auth0, React. Нестандартный формат токена неверен. Пожалуйста, проверьте документацию - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь использовать Auth0 JWT токены с Firebase, но без особой удачи.

При использовании токена с Firebase:

const token = localStorage.getItem('id_token'); //from auth0
firebase.auth().signInWithCustomToken(token).catch((error) => {
  var errorCode = error.code;
  var errorMessage = error.message;

  console.log(error);
  console.log(token);
});

Все, что я получаю, это:

“The custom token format is incorrect. Please check the documentation.”

Насколько я видел в документации Firebase, токены Auth0 и Firebase различны: https://firebase.google.com/docs/auth/admin/create-custom-tokens

Очевидно, Firebase ожидает идентификатор , которого нет в идентификаторе, сгенерированном Auth0, эквивалент которого указан в sub .

Я попытался создать правило, чтобы изменить токен Auth0, включив в него копию с именем uid, чтобы посмотреть, может ли это быть решением, но оно не работает, в тело токена ничего не добавлено.

function (user, context, callback) {
context.idToken.uid = user.user_id;
callback(null, user, context);
}

Любая идея / предложение?

PS:

1.Я проверил токен в jwt.io и его действительность. 2. Я пытался сократить время истечения до 5 минут, так как видел, что некоторые люди считают это возможным решением, но это не так.

1 Ответ

0 голосов
/ 06 мая 2018

Вы не можете использовать токен Auth0 напрямую с Firebase. Вам необходимо создать серверный API, который использует firebase-admin SDK для создания пользовательского токена Firebase с использованием данных Auth0.

На сайте OAuth есть полное руководство . Ознакомьтесь с разделом API Routes о том, как использовать firebaseAdmin.auth().createCustomToken с данным токеном OAuth:

// Auth0 athentication middleware
  const jwtCheck = jwt({
    secret: jwks.expressJwtSecret({
      cache: true,
      rateLimit: true,
      jwksRequestsPerMinute: 5,
      jwksUri: `https://${config.AUTH0_DOMAIN}/.well-known/jwks.json`
    }),
    audience: config.AUTH0_API_AUDIENCE,
    issuer: `https://${config.AUTH0_DOMAIN}/`,
    algorithm: 'RS256'
  });

  // Initialize Firebase Admin with service account
  const serviceAccount = require(config.FIREBASE_KEY);
  firebaseAdmin.initializeApp({
    credential: firebaseAdmin.credential.cert(serviceAccount),
    databaseURL: config.FIREBASE_DB
  });

  // GET object containing Firebase custom token
  app.get('/auth/firebase', jwtCheck, (req, res) => {
    // Create UID from authenticated Auth0 user
    const uid = req.user.sub;
    // Mint token using Firebase Admin SDK
    firebaseAdmin.auth().createCustomToken(uid)
      .then(customToken => 
        // Response must be an object or Firebase errors
        res.json({firebaseToken: customToken})
      )
      .catch(err => 
        res.status(500).send({
          message: 'Something went wrong acquiring a Firebase token.',
          error: err
        })
      );
  });
...