برنامه نویسی

Google SignIn در react-native با استفاده از Firebase auth

اگر به دنبال راه حلی بدون فایربیس هستید، من یک مقاله متوسط ​​برای آن دارم: https://medium.com/@ibjects/google-signin-tutorial-for-react-native-81a57fb67b18

روشی مستقیم برای پیاده سازی ورود به سیستم گوگل در یک برنامه بومی react با استفاده از firebase.

کنسول Firebase

اضافه کردن Google از ارائه دهندگان اضافی.

خود را یادداشت کنید Web client ID.

نه پایین شناسه سرویس گیرنده وب

پس از انجام آن باید به شکل زیر باشد:

گوگل را فعال نشان می دهد

React-Native

بیایید کتابخانه های مورد نیاز را نصب کنیم:

yarn add @react-native-firebase/app @react-native-firebase/auth
yarn add @react-native-google-signin/google-signin
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایجاد یک Login.tsx صفحه نمایش در اینجا چند چیز وجود دارد که با هم کار می کنند:

  1. چک کردن onAuthStatusChanged استفاده كردن auth از جانب @react-native-firebase/auth برای بررسی وضعیت فعلی احراز هویت کاربر.
  2. پیکربندی کنید GoogleSignin استفاده كردن GoogleSignin.configure جایی که ما ارائه خواهیم کرد webClientId که باید در زمان پیکربندی کناری کنسول firebase داشته باشید.
  3. رسیدگی onGoogleButtonPress و renderGoogleSigninButton همانطور که ما در حال ایجاد دکمه خودمان برای راه اندازی a هستیم GoogleSignin درخواست.
  4. هنگامی که یک کاربر وارد سیستم می شود، a را رندر می کند renderLogoutView و return اجزای اصلی.

در زیر کد برای Login.tsx طبق لیست اعداد بالا تفکیک شده است:

// 1. 

import auth, { FirebaseAuthTypes } from '@react-native-firebase/auth';

// other imports and code

    const [user, setUser] = React.useState();

    function onAuthStatusChanged(user: FirebaseAuthTypes.User | null) {
        setUser(user);
    }

    useEffect(() => {
        const subscriber = auth().onAuthStateChanged(onAuthStatusChanged);
        return subscriber; // unsubscribe on unmount
    }, []);

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

// 2. 

import { GoogleSignin } from "@react-native-google-signin/google-signin";

//... other imports and everything in 1.

    GoogleSignin.configure({
        webClientId: 'ADD_YOUR_KEY_HERE',
        offlineAccess: true,
    });
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در صورت نیاز، جستجو کنید Web client ID به بالا مراجعه کنید تا بدانید از کجا آن را تهیه کنید.

// 3a. onGoogleButtonPress

    async function onGoogleButtonPress() {
        if (user) {
            // user is already logged in so no need to do anything
            return null;
        }

        try {
            // Check if your device supports Google Play
            await GoogleSignin.hasPlayServices({ showPlayServicesUpdateDialog: true });
            // Get the users ID token
            const { idToken, user, serverAuthCode } = await GoogleSignin.signIn(); // returns type: User
            const { id, name, email, photo, familyName, givenName } = user;

            console.log('serverAuthCode: ', serverAuthCode);
            console.log('idToken: ', idToken);

            // Create a Google credential with the token
            const googleCredential = auth.GoogleAuthProvider.credential(idToken);

            // Sign-in the user with the credential
            return auth().signInWithCredential(googleCredential);
        } catch (error) {
            console.error('ERROR: ', error);
            return null;
        }
    }

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با یک ساده GoogleSignin.signIn() به طور خودکار همه چیز را کنترل می کند.

اکنون مولفه دکمه ورود به سیستم گوگل را پیاده سازی می کنیم:


// 3b. renderGoogleSigninButton

const renderGoogleSigninButton = () => {

        const buttonTitle = user ? `Signed in as: ${user.displayName}` : 'Continue with Google'

        return (
             onGoogleButtonPress().then((value: FirebaseAuthTypes.UserCredential | null) => {
                    // The onGoogleButtonPress will update the setUser state, so no action needed here
                if (value) {
                    console.log('value.additionalInnfo: ', value.additionalUserInfo);
                    console.log('value.user: ', value.user);
                }
            }).catch((error) => {
                if (isErrorWithCode(error)) {
                    switch (error.code) {
                        case statusCodes.SIGN_IN_CANCELLED:
                            // user cancelled the login flow
                            Alert.alert("User cancelled the login flow. Please try again.");
                            break;
                        case statusCodes.IN_PROGRESS:
                            // operation (eg. sign in) already in progress
                            Alert.alert("Sign In already in progress. Please wait.");
                            break;
                        case statusCodes.PLAY_SERVICES_NOT_AVAILABLE:
                            // play services not available or outdated
                            Alert.alert("Play services not available or outdated. Please update your play services.");
                            break;
                        default:
                            // some other error happened
                            Alert.alert("An unknown error occurred. Please try again later.");
                    }
                } else {
                    // an error that's not related to google sign in occurred
                    Alert.alert("An error that's not related to google sign in occurred. Please try again later.");
                }
            })}>
                {buttonTitle}
            
        )
    }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 4، اجازه دهید آن را به قسمت های کوچکتر تقسیم کنیم:

  • پیاده سازی signOut استفاده كردن auth
  • اجرای الف renderLogoutView برای پیاده سازی خروج.
  • صفحه اصلی Components که شامل دکمه های ورود و خروج است
// 4a.Implement `signOut` using `auth`
// src/api/FirebaseAuthUtils.ts
import auth from '@react-native-firebase/auth';

export function userLogout(): Promise {
    return new Promise((resolve, reject) => {
        auth()
            .signOut()
            .then(() => {
                resolve('Logout Successful');
            })
            .catch(error => {
                reject({
                    title: 'Error',
                    desc: error.message,
                });
            });
    });
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یک فایل جدید در src/api/FirebaseAuthUtils.ts و یک تابع خروج اضافه کرد.

همه چیز در زیر موجود است Login.tsx

// 4b. Implement a `renderLogoutView` to implement logout.

import { userLogout } from "../api/FirebaseAuthUtils";
//... other imports

    const renderLogoutView = () => {
        if (user) {
            return (
                 {
                    userLogout().then((message) => {
                        Alert.alert(message);
                    }).catch(error => {
                        Alert.alert(error.title, error.desc);
                    });
                }}>
                    Logout
                
            )
        }
    }

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

// 4c. Main screen `Components` that include login and logout buttons

return (
        
                {!user && <>
                    
                        New or returning user, press{'\n'}
                        Continue with Google
                         to continue
                    
                    {renderGoogleSigninButton()}
                >}
                {renderLogoutView()}
        
)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این همه کد مورد نیاز است. بعد بیایید تستش کنیم

آزمایش کردن

من روی شبیه ساز و دستگاه تست کردم، کار می کند.

من وارد نشده ام، بنابراین دکمه ورود را نشان می دهد:

من وارد نشده ام

من وارد سیستم شده ام، بنابراین دکمه خروج را نشان می دهد:

من وارد شده ام

کاربر را برای تأیید به صفحه ورود به سیستم Google می برد.

مرا به صفحه ورود به سیستم گوگل می برد

تست خروج از سیستم و مطابق انتظار کار می کند.

تست خروج

خطاها

اگر این خطا را دریافت می کنید:

 LOG  ERROR:  [Error: DEVELOPER_ERROR]
 LOG  ERROR:  10 DEVELOPER_ERROR
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اضافه کردن SHA-1 و SHA-256. اگر فقط دارید debug ساخت و سپس فقط برای آن اضافه کنید در غیر این صورت کل 4 را اضافه کنید. 2 برای debug و 2 برای release:

ورود کلیدهای SHA

در زیر دستوری وجود دارد که می توانید برای دریافت تمام اثر انگشت SHA موجود اجرا کنید:

cd android && ./gradlew signingReport
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای پیدا کردن به پایین اسکرول کنید > Task :app:signingReport. در اینجا می توانید تمام اثر انگشت SHA موجود را پیدا کنید. من فقط دارم debug بنابراین برای من release و debug کلیدها یکسان هستند، بنابراین در تصویر بالا فقط دو اثر انگشت SHA را مشاهده می کنید.

نحوه پیدا کردن SHA-1 و SHA-256 برنامه اندروید

این حل می کند 10 DEVELOPER_ERROR.


اگر دریافت می کنید:

[Error: SIGN_IN_REQUIRED]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مطمئن شوید که شما signOut به درستی پیکربندی شده است. سعی کنید برنامه را حذف کرده و دوباره نصب کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا