Firebase Echtzeitdatenbank Erlaubnis_DeniedieJavaScript

Javascript-Forum
Guest
 Firebase Echtzeitdatenbank Erlaubnis_Deniedie

Post by Guest »

Ich versuche also, eine Chat-App mit FireBase (leider) Echtzeit-DB zu erstellen, aber ich erhalte Fehler:
Fehler beim Senden von Meldungen: Berechtigung_Denied: Berechtigung verweigert
Das bettelte das Betteln, da ich einige Regeln in der Datenbank ändern musste, aber ich habe jede mögliche Regel auf der Erde 6 Stunden lang ausprobiert und funktioniert immer noch nicht! < /p>
Aktuelle Regeln: < /p>

Code: Select all

{
"rules": {
"chats": {
"$chatId": {
".read": "auth != null",
".write": "auth != null"
}
}
}
}
//chatComponent

Code: Select all

import { database, auth } from '../../../firebaseConfig';
import { ref, onValue, push } from 'firebase/database';
import { useLocalSearchParams, useRouter } from 'expo-router';
import { MaterialIcons } from '@expo/vector-icons';
import { useNetInfo } from '@react-native-community/netinfo';
import { useUser } from '@clerk/clerk-expo';
import { signInWithCustomToken } from 'firebase/auth';
const ChatScreen = () => {
const { user } = useUser(); // Get Clerk user
const { buyerId, sellerId, shopData, sellerStatus } = useLocalSearchParams();
const [messages, setMessages] = useState([]);
const [newMessage, setNewMessage] = useState('');
const router = useRouter();
const netInfo = useNetInfo();
const isConnected = netInfo?.isConnected;

useEffect(() => {
if (!user || !user.session) return; // If user is not authenticated, do nothing

// Get Clerk session and retrieve token
const getClerkJwtToken = async () => {
try {
// Directly access Clerk's session
const session = user.session; // Get Clerk session directly
const token = session?.access_token; // Get the token from the session
console.log('Clerk user:', user);
const clerkToken = await user.getToken();
console.log('Clerk Token:', clerkToken);

if (!token) {
Alert.alert('Error', 'Failed to retrieve Clerk token');
return;
}

// Sign in with the token to Firebase Authentication
await signInWithCustomToken(auth, token); // Sign in to Firebase
console.log("Firebase user authenticated with Clerk JWT");

} catch (error) {
console.error("Error linking Clerk with Firebase", error.message);
Alert.alert('Error', 'Failed to authenticate with Firebase');
}
};

getClerkJwtToken(); // Call the function to authenticate with Firebase

const chatId = `${buyerId}_${sellerId}`;
const messagesRef = ref(database, `chats/${chatId}/messages`);

const unsubscribe = onValue(messagesRef, (snapshot) => {
const data = snapshot.val();
const messagesData = data ? Object.values(data) : [];
setMessages(messagesData);
});

return () => unsubscribe();
}, [buyerId, sellerId, user]);

const sendMessage = async () => {
if (newMessage.trim() === '') {
Alert.alert('Error', 'Message cannot be empty.');
return;
}
if (!isConnected) {
Alert.alert('Error', 'You are offline.  Please check your connection.');
return;
}

const chatId = `${buyerId}_${sellerId}`;
const messagesRef = ref(database, `chats/${chatId}/messages`);

try {
// Use Clerk's `user.id` to send the message
await push(messagesRef, {
senderId: user.id, // Use Clerk's `id` as senderId
text: newMessage,
timestamp: new Date().toISOString(),
});
setNewMessage('');
} catch (e) {
console.error('Error sending message:', e.message);
Alert.alert('Error', e.message);
}
};

return (

{/* Header */}

 router.back()} style={styles.backButton}>




{shopData?.shopName}



{sellerStatus === 'online' ? 'Online' : 'Offline'}





{/* Messages List */}
 (

{item.text}

)}
keyExtractor={(item, index) => `${item.timestamp}-${index}`}
contentContainerStyle={styles.messagesContainer}
/>

{/* Input Field */}







);
};

const styles = StyleSheet.create({
..
});

export default ChatScreen;

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post