কোনও ব্যবহারকারী ফায়ারবেসে লগইন করেছেন কিনা তা আমি কীভাবে সনাক্ত করব?


110

আমি গুগল লগইনের জন্য আমার জাভাস্ক্রিপ্ট ফাইলগুলিতে ফায়ারবেস নোড এপিআই ব্যবহার করছি।

firebase.initializeApp(config);
let provider = new firebase.auth.GoogleAuthProvider();
firebase.auth().signInWithPopup(provider);

এটি দুর্দান্ত কাজ করে এবং ব্যবহারকারী তার Google শংসাপত্রগুলির সাথে লগইন করতে সক্ষম হন। ব্যবহারকারী যখন পৃষ্ঠাটি আবার দেখেন, পপআপটি আবার খোলে তবে সে ইতিমধ্যে লগইন করেছে, ব্যবহারকারীর কোনও ইন্টারঅ্যাকশন প্রয়োজন না করে পপআপ বন্ধ হয়ে যায়। পপআপ প্রম্পট করার আগে ইতিমধ্যে লগ ইন ব্যবহারকারী আছে কিনা তা পরীক্ষা করার কোনও উপায় আছে কি?

উত্তর:


124

https://firebase.google.com/docs/auth/web/manage-users

আপনাকে একটি লেখক রাষ্ট্র পরিবর্তন পর্যবেক্ষক যুক্ত করতে হবে।

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
  } else {
    // No user is signed in.
  }
});

4
এটি আমার পক্ষে বেমানান। stackoverflow.com/questions/39395158/…
ড্যান পি।

4
OnAuthStateChanged ব্যবহার করে, কোনও ব্যবহারকারী নতুন কিনা তা বলার উপায় আছে?
ব্রেনান

4
হ্যাঁ, তবে এর মাধ্যমে নয় onAuthStateChanged। এই 4.6.0 যোগ করা হয়েছিল: firebase.google.com/support/release-notes/js#4.6.0 আপনি পদ্ধতি সাইন-ইন বা থেকে থেকে এটা পেতে পারেন currentUser.metadata(সময় ও সৃষ্টি সময় শেষ বার সাইন ইন) ...
বোজাইল

4
@ বোজিল আমি মনে করি এই পদ্ধতিতে একটি সতর্কতা রয়েছে। আপনি এই কোডটি একটি পৃষ্ঠায় রাখতে পারেন এবং আপনি সেই পৃষ্ঠাটিতে না থাকলেও এটি ট্রিগার করবে। যখন অথস্টেট পরিবর্তন হয় এটি ট্রিগার করে। যদি এটি অন্য পৃষ্ঠাগুলিতে পরিবর্তিত হয় আপনি কার্যকরভাবে এটিটি ট্রিগার করতে পারবেন যখন আপনি এটি চান না। কমপক্ষে, এখনই আমার সাথে এটি ঘটছে।
দ্য অ্যাভেঞ্জফুলকো

4
এটি অন্যান্য ট্যাবগুলিতে সাইন ইন ইভেন্টগুলি সনাক্ত করবে। এটি উদ্দেশ্য হিসাবে কাজ করে। ফায়ারবেস অথথ উইন্ডোজ জুড়ে ইভেন্টগুলিতে সাইন ইন প্রচার করে।
বোজাইল

86

কারেন্ট ইউজার রয়েছে কিনা তাও আপনি পরীক্ষা করতে পারেন

var user = firebase.auth().currentUser;

if (user) {
  // User is signed in.
} else {
  // No user is signed in.
}

10
এটি তাত্ক্ষণিকভাবে লগইন করার পরেও আমার কাছে বাতিল হয়ে যাচ্ছে।
আর্মোড়া

9
এটি আশ্চর্যজনক, এটি আমার পক্ষে কাজ করে, সম্ভবত সমস্যাটি কারণ অ্যাথ অ্যাসিঙ্ক এবং _ কারেন্টউজার_ এখনও আপডেট হয়নি।
ড্যানিয়েল পাসোসোস

4
দস্তাবেজগুলি থেকে: কারেন্ট ইউজারটিও নাল হতে পারে কারণ প্রবন্ধ অবজেক্টটি আরম্ভ করা শেষ হয়নি। আপনি যদি ব্যবহারকারীর সাইন ইন স্থিতি ট্র্যাক রাখতে কোনও পর্যবেক্ষক ব্যবহার করেন তবে আপনার এই মামলাটি পরিচালনা করার দরকার নেই।
CHESireoctopus

আপনি এটির উপর নির্ভর করতে পারবেন না। সরকারী দস্তাবেজগুলি দেখুন: "এমন কিছু কেস রয়েছে যেখানে getCenterUser একটি নন-ফিরিয়ে দেবে ..."
অ্যান্ড্রু

যদি আপনি শূন্য হয়ে যাচ্ছেন তবে এটি সম্ভবত কারণ এটি এখনও শুরু হয়নি।
আর্নাল্ডো ক্যাপো

31

এটা সম্ভব কিনা একটি ব্যবহারকারী হবে যখন একটি পৃষ্ঠা লোড শুরু সাইন ইন করতে, একটি কাজ যদিও প্রায়।

সেশন এবং ট্যাবগুলির মধ্যে এটি চালিয়ে যাওয়ার জন্য আপনি স্থানীয় লেখার স্থিতিতে গত লেখক স্থিতি মুখস্ত করতে পারেন ।

তারপরে, পৃষ্ঠাটি লোড করা শুরু হওয়ার পরে, আপনি আশাবাদীভাবে ধরে নিতে পারেন যে ব্যবহারকারীটি স্বয়ংক্রিয়ভাবে পুনরায় সাইন ইন হয়ে যাবে এবং ডায়ালগটি স্থগিত না করা পর্যন্ত আপনি নিশ্চিত না হন (যেমন onAuthStateChangedআগুনের পরে )। অন্যথায়, localStorageকীটি খালি থাকলে আপনি এখনই ডায়ালগটি প্রদর্শন করতে পারেন।

ফায়ারবেস onAuthStateChangedইভেন্টটি পৃষ্ঠা লোডের প্রায় 2 সেকেন্ড পরে চালিত হবে ।

// User signed out in previous session, show dialog immediately because there will be no auto-login
if (!localStorage.getItem('myPage.expectSignIn')) showDialog() // or redirect to sign-in page

firebase.auth().onAuthStateChanged(user => {
  if (user) {
    // User just signed in, we should not display dialog next time because of firebase auto-login
    localStorage.setItem('myPage.expectSignIn', '1')
  } else {
    // User just signed-out or auto-login failed, we will show sign-in form immediately the next time he loads the page
    localStorage.removeItem('myPage.expectSignIn')

    // Here implement logic to trigger the login dialog or redirect to sign-in page, if necessary. Don't redirect if dialog is already visible.
    // e.g. showDialog()
  }
})



আমি এটি প্রতিক্রিয়া এবং প্রতিক্রিয়া-রাউটার দিয়ে ব্যবহার করছি । আমি componentDidMountআমার অ্যাপ্লিকেশন মূল উপাদানটির উপরে কোডটি রেখেছি। সেখানে, রেন্ডারে, আমার কিছু আছেPrivateRoutes

<Router>
  <Switch>
    <PrivateRoute
      exact path={routes.DASHBOARD}
      component={pages.Dashboard}
    />
...

এবং এভাবেই আমার প্রাইভেটরউট বাস্তবায়ন করা হয়:

export default function PrivateRoute(props) {
  return firebase.auth().currentUser != null
    ? <Route {...props}/>
    : localStorage.getItem('myPage.expectSignIn')
      // if user is expected to sign in automatically, display Spinner, otherwise redirect to login page.
      ? <Spinner centered size={400}/>
      : (
        <>
          Redirecting to sign in page.
          { location.replace(`/login?from=${props.path}`) }
        </>
      )
}

    // Using router Redirect instead of location.replace
    // <Redirect
    //   from={props.path}
    //   to={{pathname: routes.SIGN_IN, state: {from: props.path}}}
    // />

আপনি কি আমাকে এই বিষয়ে সাহায্য করতে পারেন বলে মনে করেন? আপনার উত্তরের শীর্ষে থাকা স্বতঃ-লগইন পুনর্নির্দেশের চেষ্টা করেছি এবং এখন আমি এটিকে সরিয়ে ফেলতে পারি না। আমি আমার স্থানীয় সঞ্চয়স্থান পুরোপুরি সাফ করে ফেলেছি এবং ধ্রুবক পুনঃনির্দেশের কারণে আমি এখনও আমার ফায়ারবেস সাইটে লগ আউট করতে পারি না।
hego64

@ হেগো 64 আপনি কি আপনার ফায়ারবেস অ্যাপ্লিকেশনটি লগ আউট করেছেন? এই সমাধানটি লগ-ইন করে না user যদি ব্যবহারকারীরা আগের সেশনে সাইন আউট না করে তবে এটি সাইন ইন ফর্মটি এড়িয়ে যেতে কেবল অনুমতি দেয়। / সম্পাদনা: আপনি একটি পুনর্নির্দেশ লুপ হয়? আমি উত্তর আপডেট করব।
কিউয়েরটি

হ্যাঁ, আমার আরও পরিষ্কার হওয়া উচিত ছিল, আমি একটি পুনর্নির্দেশ লুপে আটকে গিয়েছিলাম। আমি লগ আউট করতাম এবং অ্যাপটিতে ফিরে যাওয়ার পরিবর্তে আমাকে সরাসরি সাইন-ইন পৃষ্ঠাতে নিয়ে যাওয়া হয়েছিল। আমি পূর্ববর্তী মোতায়েনের দিকে রোল করে এটিকে ঠিক করতে সক্ষম হয়েছি, তবে এ থেকে এই সমস্যাটি ঠিক করার জন্য আমি কী করব তা নিশ্চিত ছিলাম না।
hego64

4
@ হেগো 64৪ ব্যবহারকারী সাইন-ইন না করে নিখরচায় নতুন করে ঘুরে বেড়াতে সক্ষম হবে না, সুতরাং লগ-ইন পৃষ্ঠাতে পুনর্নির্দেশ করা সঠিক, তবে যদি এমন কোনও রুট রয়েছে যা প্রমাণীকরণ ব্যতীত পাওয়া যায় তবে আপনাকে অবশ্যই যুক্তিটি রাউটারে সরিয়ে নিতে হবে অথবা এর পরিবর্তে নির্দিষ্ট রুটগুলি, আমার ব্যক্তিগত রউটের মোড়কের উদাহরণের মতো। সুতরাং যদি ব্যবহারকারী কোনও সীমাবদ্ধ পৃষ্ঠায় থাকে এবং সাইন আউট করে তবে তাদের লগ-ইন পৃষ্ঠাতে পুনর্নির্দেশ করা হবে। আপনার অন্যান্য রুটে এই যুক্তি প্রয়োগ করা হবে না।
কিওয়ার্টি

আমি এই জন্য কিছুটা আটকে ছিলাম ... এই পদ্ধতিটি বেশ ভালভাবে কাজ করে। ধন্যবাদ.
spetz83

20

এই দৃশ্যে onAthStateChanged () ফাংশনটি ব্যবহার করার দরকার নেই।

ব্যবহারকারী সহজেই নির্ধারণ করতে পারবেন যে ব্যবহারকারী লগড আছে বা না:

var user = firebase.auth().currentUser;

যারা "রিটার্নিং নাল" ইস্যুটির মুখোমুখি তাদের পক্ষে এটি কেবল কারণ আপনি ফায়ারবেস কলটি সম্পূর্ণ হওয়ার অপেক্ষায় নন।

ধরা যাক আপনি পেজ এ তে লগইন ক্রিয়াটি সম্পাদন করেন এবং তারপরে আপনি পৃষ্ঠা বিতে, পৃষ্ঠা বিতে অনুরোধ করুন আপনি প্রত্যাশিত আচরণটি পরীক্ষা করতে নিম্নলিখিত জেএস কোডটি কল করতে পারেন:

  var config = {
    apiKey: "....",
    authDomain: "...",
    databaseURL: "...",
    projectId: "..",
    storageBucket: "..",
    messagingSenderId: ".."
  };
  firebase.initializeApp(config);

    $( document ).ready(function() {
        console.log( "testing.." );
        var user = firebase.auth().currentUser;
        console.log(user);
    });

যদি ব্যবহারকারী লগইন হয় তবে "var ব্যবহারকারী" এ প্রত্যাশিত জেএসওএন পে-লোড ধারণ করবে, যদি তা না হয় তবে এটি কেবল "নাল" হবে

এবং এটিই আপনার প্রয়োজন।

শ্রদ্ধা


4
@ মৌরিসিও সিলভেস্টের এটি কি? ব্যবহার firebase.auth.currentUser। Undefined কিনা বা না আমি সাইন ইন করি আয় শুধু প্রমাণীকরণ () সঠিক ফলাফলের ফেরৎ যখন সাইন ইন করেছেন।
জর্ডন

6

আর একটি উপায় ফায়ারবেস যা ব্যবহার করে একই জিনিস ব্যবহার করা use

উদাহরণস্বরূপ যখন ব্যবহারকারী লগ ইন করেন, ফায়ারবেস স্থানীয় স্টোরেজে বিশদ নীচে রাখে। ব্যবহারকারীরা যখন পৃষ্ঠায় ফিরে আসে, ব্যবহারকারী স্বয়ংক্রিয়ভাবে লগ ইন করা উচিত কিনা তা চিহ্নিত করতে ফায়ারবেস একই পদ্ধতি ব্যবহার করে।

এখানে চিত্র বর্ণনা লিখুন

এটিটিএন: এটি ফায়ারবেস দ্বারা তালিকাভুক্ত বা প্রস্তাবিত নয়। আপনি এই পদ্ধতিটিকে এটি করার আনুষ্ঠানিক উপায় বলতে পারেন। যার অর্থ পরে যদি ফায়ারবেস তাদের অভ্যন্তরীণ কাজকে পরিবর্তন করে তবে এই পদ্ধতিটি কাজ করতে পারে না। বা সংক্ষেপে। আপনার নিজের ঝুঁকিতে ব্যবহার করুন! :)


5

এইটা কাজ করে:

async function IsLoggedIn(): Promise<boolean> {
  try {
    await new Promise((resolve, reject) =>
      app.auth().onAuthStateChanged(
        user => {
          if (user) {
            // User is signed in.
            resolve(user)
          } else {
            // No user is signed in.
            reject('no user logged in')
          }
        },
        // Prevent console error
        error => reject(error)
      )
    )
    return true
  } catch (error) {
    return false
  }
}

2

আপনি যদি বেনাম ব্যবহারকারীদের পাশাপাশি ইমেল সহ লগ ইন করা ব্যক্তিদেরও যদি আপনি ব্যবহার করতে পারেন তবে firebase.auth().currentUser.isAnonymousযা ফেরত আসবে trueবা হয় false



-4

প্রথমে নিম্নলিখিতটি আমদানি করুন

import Firebase
import FirebaseAuth

তারপর

    // Check if logged in
    if (Auth.auth().currentUser != null) {
      // User is logged in   
    }else{
      // User is not logged in
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.