FirebaseAuthError: аргумент `developerClaims` должен быть допустимым ненулевым объектом, содержащим утверждения разработчика - PullRequest
0 голосов
/ 21 апреля 2020

Конечная цель: создайте простой NodeJs для предоставления пользовательского токена Firestore.

Текущий пример: я пытаюсь использовать именно этот подход Пользовательский вопрос токена Stackoverflow . В соответствии с этим автором вопроса он может получить пользовательский токен. К сожалению, я продолжаю получать

C:\WSs\FireStoreDemos\firestore-custom-token>node server
C:\WSs\FireStoreDemos\firestore-custom-token\node_modules\firebase-admin\lib\auth\token-generator.js:205
            throw new error_1.FirebaseAuthError(error_1.AuthClientErrorCode.INVALID_ARGUMENT, errorMessage);
            ^

FirebaseAuthError: `developerClaims` argument must be a valid, non-null object containing the developer claims.
    at FirebaseAuthError.FirebaseError [as constructor] (C:\WSs\FireStoreDemos\firestore-custom-token\node_modules\[4mfirebase-admin[24m\lib\utils\error.js:42:28)
    at FirebaseAuthError.PrefixedFirebaseError [as constructor] (C:\WSs\FireStoreDemos\firestore-custom-token\node_modules\[4mfirebase-admin[24m\lib\utils\error.js:88:28)
    at new FirebaseAuthError (C:\WSs\FireStoreDemos\firestore-custom-token\node_modules\[4mfirebase-admin[24m\lib\utils\error.js:147:16)
    at FirebaseTokenGenerator.createCustomToken (C:\WSs\FireStoreDemos\firestore-custom-token\node_modules\[4mfirebase-admin[24m\lib\auth\token-generator.js:205:19)
    at Auth.BaseAuth.createCustomToken (C:\WSs\FireStoreDemos\firestore-custom-token\node_modules\[4mfirebase-admin[24m\lib\auth\auth.js:94:36)
    at Object.<anonymous> (C:\WSs\FireStoreDemos\firestore-custom-token\server.js:32:14)
[90m    at Module._compile (internal/modules/cjs/loader.js:1147:30)[39m
[90m    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1167:10)[39m
[90m    at Module.load (internal/modules/cjs/loader.js:996:32)[39m
[90m    at Function.Module._load (internal/modules/cjs/loader.js:896:14)[39m {
  errorInfo: {
    code: [32m'auth/argument-error'[39m,
    message: [32m'`developerClaims` argument must be a valid, non-null object containing the developer claims.'[39m
  },
  codePrefix: [32m'auth'[39m
}

Все NodeJs файлы:

сервер. js

const admin = require('firebase-admin');

exports.serviceAccount = {
  "type": "service_account",
  "project_id": "angular-firebase-auth0-3c084",
  "private_key_id": "6ba2ba41e0bf3837841aa9772c7d880b7ce3be81",
  "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEv ... deleted ... 2PV9xsYvkt8+8Ce79fYKA=\n-----END PRIVATE KEY-----\n",
  "client_email": "firebase-adminsdk-lu97a@angular-firebase-auth0-3c084.iam.gserviceaccount.com",
  "client_id": "114324662014690107039",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-lu97a%40angular-firebase-auth0-3c084.iam.gserviceaccount.com"
}

 admin.initializeApp({
   credential: admin.credential.cert(exports.serviceAccount)
});

var uid = "NSBFu2YJNDgLQJCZ99dRJlP4DRo2"; //copied from https://console.firebase.google.com/project/firetestjimis/authentication/users
var claim = {
  control: true
};
admin.auth().createCustomToken(uid, true)
  .then(function (customToken) {
    console.log(customToken)
  })
  .catch(function (error) {
    console.log("Error creating custom token:", error);
  });

пакет. json

{
  "name": "firebase-auth0-nodeserver",
  "version": "0.1.0",
  "description": "Node.js server to provide custom auth token.",
  "repository": "",
  "main": "server.js",
  "scripts": {
    "start": "node server"
  },
  "author": "Auth0",
  "license": "MIT",
  "dependencies": {
    "body-parser": "^1.19.0",
    "cors": "^2.8.5",
    "express": "^4.17.1",
    "express-jwt": "^5.3.3",
    "firebase-admin": "^8.10.0",
    "jwks-rsa": "^1.8.0"
  },
  "devDependencies": {}
}

В случае, если это что-то добавит, мне удалось развернуть облачную функцию, которая возвращает пользовательский токен с приведенной ниже машинописью. Тем не менее, мне нужен такой же подход в наших локальных серверах.

import * as functions from 'firebase-functions';
import * as admin from "firebase-admin";

export const getCustomToken = functions.https.onRequest((request, response) => {
    if (admin.apps.length < 1) {   //Checks if app already initialized
        admin.initializeApp();
    }
    const uid = "NSBFu2YJNDgLQJCZ99dRJlP4DRo2"; 

    admin.auth().createCustomToken(uid)
        .then(function (customToken) {
            console.log(customToken.toString);
            response.send(customToken);
        })
        .catch(function (error) {
            console.log("Error creating custom token:", error);
        });
});

*** отредактировано Благодаря ответу Фрэнка я исправляю эту проблему с помощью "... admin.auth (). CreateCustomToken (uid) .then. .. ".

Тем не менее, сгенерированный Custom Token кажется бесполезным (или, может быть, я что-то неправильно понял).

Желание иметь токен, который позволит мне опубликовать документ в Firestore. Ну, с облачной функцией выше, я получаю токен, затем отправляю его на googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken, который возвращает idToken, который я могу использовать для публикации документа в коллекции Firestore. Я понял, что сервер NodeJs выше будет генерировать токен с теми же характеристиками, что и сгенерированный выше облачной функцией, но, похоже, я ошибся.

По сути, я пытаюсь { ссылка } и, похоже, вопрос Автор получил это работает. Забавно, я могу сделать это с помощью облачной функции, но у меня возникает проблема с генерацией пользовательского токена сверху NodeJs

1 Ответ

1 голос
/ 21 апреля 2020

Если у вас есть такие проблемы с синтаксисом, документы - ваш друг. Из справочной документации для Auth.createCustomToken:

createCustomToken(uid: string, developerClaims?: Object): Promise<string>

...

Параметры

uid: string UID для использования в качестве темы пользовательского токена.

Необязательно developerClaims: Object

Необязательные дополнительные утверждения для включения в полезную нагрузку пользовательского токена.

Таким образом, вторым аргументом createCustomToken должен быть объект с пользовательскими утверждениями, которые вы хотите добавить. Я предполагаю, что логическое значение в вопросе, который вы связали, было допустимым вызовом в более старой версии SDK.

...