Невозможно проверить idToken Firebase на стороне PHP-сервера – выставка React-nativePhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Невозможно проверить idToken Firebase на стороне PHP-сервера – выставка React-native

Сообщение Anonymous »

У меня есть выставочный проект, который использует Firebase для createUserWithEmailAndPassword и SignInWithEmailAndPassword. Вход на стороне клиента работает нормально. Проблема заключается в проверке idToken с использованием как JWT PHP, так и Kreait PHP Admin - оба выдают мне ошибку проверки подписи и недействительный токен соответственно.
Настройка:
  • npm expo install firebase
  • npm expo run:ios --device
  • серверная часть — php
Соответствующие фрагменты собственного кода реагирования:
import { initializeApp } from 'firebase/app';
import { getAuth, signInWithEmailAndPassword, createUserWithEmailAndPassword, updateProfile } from 'firebase/auth';
const firebaseConfig = {
apiKey: "AIzaxxxxxxxxxxxxxxxxxxJxk",
authDomain: "oxxxxxxxxx.firebaseapp.com",
projectId: "oxxx-xxxx",
storageBucket: "oxxx-xxxx.firebasestorage.app",
messagingSenderId: "1111111111",
appId: "1:111111111:web:1111111111",
measurementId: "G-5555555555"
};

export default function Index() {
const app = initializeApp(firebaseConfig);
const auth = getAuth(app);

// Email/Password Authentication
const handleEmailAuth = async () => {
if (!email || !password) {
Alert.alert('Error', 'Please fill in all fields');
return;
}

if (!isLogin && password !== confirmPassword) {
Alert.alert('Error', 'Passwords do not match');
return;
}
if (!isLogin && !name.trim()) {
Alert.alert('Error', 'Please enter your name');
return;
}

setLoading(true);
try {
let userCredential;

if (isLogin) {
userCredential = await signInWithEmailAndPassword(auth, email, password);
} else {
userCredential = await createUserWithEmailAndPassword(auth, email, password);
}
// Update user profile with name

await updateProfile(userCredential.user, {
displayName: name.trim()
}).then(() => {
userCredential.user.reload().then(() => { userCredential.user
console.log('Profile reloaded - displayname: ' + JSON.stringify(userCredential.user));
});
}).catch((error) => {
console.log(error);
});
//console.log("entered name:" + JSON.stringify(await userCredential.user.getIdToken(true)));

await registerUserInBackend(auth.currentUser, "emailpwd");

} catch (error: any) {
Alert.alert('Error', error.message);
} finally {
setLoading(false);
}
};

const registerUserInBackend = async (responsedata: any, provider: string) => {
try {

const user = (provider == "google" ? responsedata.user : responsedata);
const firebaseIdToken = provider!="google" ? JSON.stringify(await user.getIdToken(true)): null;
;
const response = await fetch('https://qqqqqqqq.com/register_user.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
idToken: provider == "google" ? responsedata.idToken : firebaseIdToken,
email: user.email,
name: provider=="google" ? user.name : user.displayName,
photo_url: provider == "google" ? user.photo: "",
provider: provider
})
});

const data = await response.json();
if (data.success) {
storeUserSession(user, data.uid, responsedata.idToken);
await signIn({
uid: data.uid,
accessToken: responsedata.accessToken,
email: user.email,
displayName: user.name,
photoURL: user.photo
});
router.replace('/(tabs)/mainScreen');
setLoading(false);
}
else {
setLoading(false);
throw new Error(data.error);
}
} catch (error) {
console.error('Backend registration error:', error);
}
};

< /code>
фрагменты кода PHP: < /p>
equire_once '../../vendor/autoload.php';
use Google\Client as GoogleClient;
use Kreait\Firebase\Factory;
use Kreait\Firebase\Auth;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use GuzzleHttp\Client;

public function verifyFirebaseIdToken($idToken) {
try {
error_log('inside verifyFirebaseIdToken'.$idToken);
// Verify the ID token
$verifiedIdToken = $this->auth->verifyIdToken($idToken);

// Get user info
return [
'success' => true,
'uid' => $verifiedIdToken->claims()->get('sub'),
'email' => $verifiedIdToken->claims()->get('email'),
'email_verified' => $verifiedIdToken->claims()->get('email_verified'),
'name' => $verifiedIdToken->claims()->get('name')
];
} catch (\Kreait\Firebase\Exception\Auth\FailedToVerifyToken $e) {
error_log('inside catch1'.$e);
return ['success' => false, 'error' => 'Invalid token'];
} catch (\Exception $e) {
error_log('inside catch2'.$e);
return ['success' => false, 'error' => $e->getMessage()];
}
}

public function verifyIdToken($idToken) {
try {
$tokenParts = explode('.', $idToken);
if (count($tokenParts) != 3) {
throw new Exception('Invalid token format');
}

// Get token header to determine which key to use
$header = json_decode(base64_decode($tokenParts[0]), true);
if (!isset($header['kid']) || !isset($this->publicKeys[$header['kid']])) {
throw new Exception('Invalid token header');
}

$publicKey = $this->publicKeys[$header['kid']];

error_log('verifyIdToken - idtoken:'.$idToken);
error_log('verifyIdToken - kid:'.$header['kid']);
error_log('verifyIdToken - publicKey:'.$publicKey);
$decodedToken = JWT::decode($idToken, new Key($publicKey, 'RS256'));
error_log('verifyIdToken - decodedToken:'.$decodedToken);

// Verify issuer and audience
if ($decodedToken->iss !== 'https://securetoken.google.com/oxxx-00000') {
throw new Exception('Invalid token issuer');
}

return [
'success' => true,
'uid' => $decodedToken->sub,
'email' => $decodedToken->email ?? null,
'email_verified' => $decodedToken->email_verified ?? false,
'name' => $decodedToken->name ?? null
];

} catch (Exception $e) {
return ['success' => false, 'error' => $e->getMessage()];
}
}

//in my register_user.php

error_log('token: '.$data['idToken']);
error_log('email: '.$data['email']);

if($data['provider']=='google')
$verifyTokenResponse = $Oxxx->validateGoogleToken($data['idToken']);
else
$verifyTokenResponse = $Oxxx->verifyFirebaseIdToken($data['idToken']);
error_log('verifyTokenResponse: '.implode($verifyTokenResponse));

< /code>

[*] Консоль Firebase была настроена на iOS, Android и Web < /li>
Googleservices Plist была добавлена ​​в Root Directory < / li>
В node_modules я также имею реагируйте-Firebase /Auth и /App (они тоже попробовали, и они дали ту же ошибку-в конечном итоге установили NPM Firebase) < /li>
Я попытался удалить папку модулей узлов и переустановить (NPM Install + POD Install). Та же ошибка. < /Li>
< /ul>
Что я пробовал и проверил до сих пор? Напечатано на стороне клиента такая же, как и на стороне сервера
Printed Kid в iDtoken находится в https://www.googleapis.com/robot/v1/met ... iceaccount .com < /li>
Firebase показывает пользователя, зарегистрированного на вкладке «Пользователи» на консоли < /li>
В jwt.io сгенерированный идентификатор может быть декодирован и показывает Правильные значения в заголовке и полезной нагрузке, но всегда показывают «неверную подпись» внизу. /li>
< /ul>
Чего мне здесь не хватает? Пожалуйста, помогите - те души, которые поняли это правильно.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ative-expo
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Невозможно проверить idToken Firebase на стороне PHP-сервера – выставка React-native
    Anonymous » » в форуме Php
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Замените «Idtoken» на «Idtoken» Swift Win в Apple, используя Firebase
    Anonymous » » в форуме IOS
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Выставка React-Native для Android Native не работает. Команда npx expo run: Android не работает. Еще до того, как я напи
    Anonymous » » в форуме Android
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Невозможно аннулировать IdToken Amazon Cognito
    Anonymous » » в форуме C#
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • React-Native-Firebase – приложение Firebase «[DEFAULT]» не создано – вызовите firebase.initializeApp() (на Android, несм
    Anonymous » » в форуме Android
    0 Ответы
    51 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Php»