Настройка:
- 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