Ошибка клиента Firebase: пользовательский токен соответствует другой аудитории - PullRequest
0 голосов
/ 22 октября 2018

Я использую Firebase Python AdminSDK для создания пользовательского токена, который клиент Javascript использует для входа в Firebase.Когда клиент JS пытается пройти аутентификацию с помощью пользовательского токена, он получает сообщение об ошибке «Пользовательский токен соответствует другой аудитории».

Код, указанный с ошибкой: «auth / custom-token-mismatch».

Многие ответы Google в отношении "аудитории" не совпадают со справочной аналитикой.Но я занимаюсь веб-проектом, а не iOS или Android, поэтому я не могу использовать Analytics для управления аудиториями.

Ответы SO, которые я прочитал, перечислены в конце ниже.

Я захватил пользовательский токен и подключил его к https://jwt.io/, и оба значения, и время создания / истечения срока действия (с интервалом в один час) выглядят хорошо:

Декодированный пользовательский токен в jwt.io:

{
  "claims": {},
  "uid": "<myuniqueID",
  "sub": "firebase-adminsdk-1knpr@firebase-<myproject>.iam.gserviceaccount.com",
  "iss": "firebase-adminsdk-1knpr@firebase-<myproject>.iam.gserviceaccount.com",
  "iat": 1540153710,
  "aud": "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
  "exp": 1540157310
}

Сервер Python:

def getFirebaseInstance():  # For Firebase Python SDK
  try:
    currentDir_path = os.path.dirname(os.path.realpath(__file__))
    cred = credentials.Certificate(currentDir_path + '/includeFirebaseServiceAccounts/firebase-<myprojectname>-firebase-adminsdk-1knpr-e1244dd261.json')  
    firebaseAdmin = firebase_admin.initialize_app(cred, { 'databaseURL': 'https://<myprojectname>.firebaseio.com', 'databaseAuthVariableOverride': {'uid':'<myuniqueServerID>'}})
    if firebaseAdmin:
      return(firebaseAdmin)
  except:
    raise


def firebaseClientToken(request):
  try:
    uid = "<myuniqueClientID>"  # case sensitive
    additional_claims = { }
    token = auth.create_custom_token(uid,additional_claims)
    return HttpResponse(token)
  except Exception as err:
    return HttpResponse("System error:" + str(err), status=406)

Клиент Javascript:

(
function authClient2Firebase() {
  $.ajax({
    url: "firebaseClientToken/",
    method: "POST",
    success: function(response) { step2(response); },
    error: function(xhr) { alert("There was an error loading a security check.  Have you lost your internet connection?  Detail:" + xhr.responseText); }
  });

  function step2(customToken) {
    try {
      firebase.auth().signInWithCustomToken(customToken).catch(function(error) {
        var errorCode = error.code;
        var errorMessage = error.message;
          alert("There was an error with the secure login. \n\nDetail: " + errorMessage + '\nCode: ' + errorCode);
      });
    }
    catch(err) {
      alert(err);
    }

    console.log("authClient2Firebase.js: Firebase login succeeded!");
  }
}

)();

Мой проект на странице "Настройки" консоли имеет ключ веб-API, ноЯ нигде не вижу, чтобы он использовался.

На странице "Настройки" -> "Пользователи и разрешения" есть только один пользователь - я.

В списке указана только одна учетная запись службы.на консоли «Настройки» -> «Сервисные учетные записи».Я попытался удалить все секреты на этой странице, сгенерировать новый, затем сгенерировать и установить новую синюю кнопку «секрет» (плохое имя, фактически он генерирует целый объект учетных данных json).

Это доменыперечислены в консоли «Аутентификация» -> «Метод входа»:

localhost                      Default
<myproject>.firebaseapp.com    Default
127.0.0.1                      Custom
auth.firebase.com              Custom

Фактический домен, который я использую, это localhost: 8000, который не может быть введен здесь.

Так что ответы не прошли успешно:

Пользовательский токен соответствует другой аудитории (я не использую ключ, кроме того, что хранится в учетных данных ServiceAccount.)

Ошибка токена Firebase: «Пользовательский токен соответствует другой аудитории.»

Пользовательский токен Firebase выдан для другой аудитории введите описание ссылки здесь (Закрыть, но я не использую Node-сервер и не уверен, что он подразумевает под сервером «должен принадлежать одному и тому же проекту», поскольку сервер Python не зарегистрирован ни в каком случае, кроме как через ServiceAccountучетные данные, которые я скачал.)

1 Ответ

0 голосов
/ 22 октября 2018

неловко, но факт, это оказалось простым упущением.Когда JS-клиент инициализировался как приложение Firebase, перед аутентификацией он использовал старые учетные данные из тестовой среды.

  // Initialize Firebase
  var config = {
    apiKey: "<WebAPI from Firebase console, 'Project Settings'>",
    authDomain: "<myproject>.firebaseapp.com",
    databaseURL: "https://<myproject>.firebaseio.com",
    projectId: "<myproject>",
    storageBucket: "<myproject>.appspot.com",
    messagingSenderId: "<id from Console Project Settings>"  // optional
  };

  firebase.initializeApp(config);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...