با استفاده از اپل با جاوا اسکریپت احراز هویت شوید

با استفاده از Firebase SDK می توانید به کاربران خود اجازه دهید با استفاده از Apple ID خود با Firebase احراز هویت کنند تا جریان ورود به سیستم OAuth 2.0 را به صورت کامل انجام دهند.

قبل از اینکه شروع کنی

برای ورود کاربران با استفاده از Apple ، ابتدا ورود به سیستم با Apple را در سایت توسعه دهندگان Apple پیکربندی کنید ، سپس Apple را به عنوان ارائه دهنده ورود به سیستم پروژه Firebase خود فعال کنید.

به برنامه توسعه دهندگان اپل بپیوندید

ورود به سیستم با اپل تنها می تواند توسط اعضای پیکربندی اپل توسعهدهنده برنامه .

پیکربندی ورود به سیستم با Apple

در توسعه اپل سایت زیر را انجام دهید:

  1. مرتبط کردن وبسایت خود را به برنامه خود را به عنوان در بخش اول از توصیف پیکربندی ورود به سیستم با اپل برای وب . وقتی از شما خواسته شد ، URL زیر را به عنوان یک URL بازگشت ثبت کنید:

    https://YOUR_FIREBASE_PROJECT_ID.firebaseapp.com/__/auth/handler

    شما می توانید فایربیس ID پروژه خود را در گرفتن صفحه فایربیس کنسول تنظیمات .

    پس از اتمام کار ، به شناسه سرویس جدید خود توجه کنید ، که در قسمت بعدی به آن نیاز خواهید داشت.

  2. درست ورود به سیستم با کلید خصوصی اپل . در قسمت بعدی به کلید خصوصی جدید و شناسه کلید خود نیاز دارید.
  3. اگر شما استفاده از هر یک از ویژگی فایربیس احراز هویت که ارسال ایمیل به کاربران، از جمله لینک ایمیل ورود به سیستم، تأیید آدرس ایمیل، تغییر حساب ابطال، و دیگران، پیکربندی سرویس رله ایمیل خصوصی اپل و ثبت نام noreply@ YOUR_FIREBASE_PROJECT_ID .firebaseapp.com (یا دامنه قالب ایمیل سفارشی شما) تا اپل بتواند ایمیل های ارسال شده توسط تأیید هویت Firebase را به آدرس های ایمیل ناشناس اپل منتقل کند.

اپل را به عنوان ارائه دهنده ورود به سیستم فعال کنید

  1. اضافه کردن فایربیس را به پروژه خود .
  2. در فایربیس کنسول ، باز کردن بخش تایید. بر روی ثبت نام در تب روش، فعال کردن ارائه دهنده اپل. شناسه خدماتی را که در قسمت قبل ایجاد کرده اید مشخص کنید. همچنین، در کد OAuth حفظ بخش پیکربندی جریان، مشخص خود را اپل کد تیم و کلید خصوصی و شناسایی کلید شما در بخش قبلی ایجاد شده است.

از الزامات داده ناشناس اپل پیروی کنید

ورود به سیستم با اپل به کاربران می دهد این گزینه از بی نام داده، از جمله آدرس ایمیل خود، هنگامی که ورود به سیستم. کاربرانی که این گزینه را انتخاب کنید آدرس ایمیل با دامنه privaterelay.appleid.com . هنگامی که از برنامه ورود به سیستم با Apple در برنامه خود استفاده می کنید ، باید از هرگونه سیاست توسعه دهنده یا شرایط مربوط به Apple در مورد این شناسه های ناشناس Apple استفاده کنید.

این شامل اخذ رضایت کاربر مورد نیاز قبل از ارتباط مستقیم اطلاعات شخصی با یک Apple ID ناشناس است. هنگام استفاده از احراز هویت Firebase ، این ممکن است شامل اقدامات زیر باشد:

  • پیوند آدرس ایمیل به Apple ID ناشناس یا برعکس.
  • یک شماره تلفن را به Apple ID ناشناس یا بالعکس پیوند دهید
  • یک اعتبار اجتماعی ناشناس (فیس بوک ، گوگل و غیره) را به Apple ID ناشناس پیوند دهید یا برعکس.

لیست فوق جامع نیست. در قسمت عضویت در حساب توسعه دهنده خود به موافقت نامه مجوز برنامه توسعه دهندگان Apple مراجعه کنید تا مطمئن شوید برنامه شما با الزامات Apple مطابقت دارد.

جریان ورود به سیستم را با Firebase SDK مدیریت کنید

اگر در حال ایجاد یک برنامه وب هستید ، ساده ترین راه برای احراز هویت کاربران با Firebase با استفاده از حساب های Apple آنها این است که تمام جریان ورود به سیستم را با Firebase JavaScript SDK مدیریت کنید.

برای مدیریت جریان ورود به سیستم با Firebase JavaScript SDK ، این مراحل را دنبال کنید:

  1. ایجاد یک نمونه از یک OAuthProvider با استفاده از مربوطه ارائه دهنده ID apple.com.

    نسخه وب 9

    import { OAuthProvider } from "firebase/auth";
    
    const provider = new OAuthProvider('apple.com');

    نسخه وب 8

    var provider = new firebase.auth.OAuthProvider('apple.com');
  2. اختیاری: مشخص OAuth حفظ 2.0 حوزه فراتر از پیش فرض که شما به درخواست از ارائه دهنده احراز هویت می خواهید.

    نسخه وب 9

    provider.addScope('email');
    provider.addScope('name');

    نسخه وب 8

    provider.addScope('email');
    provider.addScope('name');

    به طور پیش فرض، هنگامی که یک حساب در آدرس ایمیل فعال باشد، فایربیس درخواست ایمیل و نام حوزه. اگر این تنظیم را تغییر دهید به حساب های چندگانه در آدرس ایمیل، فایربیس هیچ حوزه از اپل درخواست کند مگر اینکه مشخص کنید.

  3. اختیاری: اگر شما می خواهید برای نمایش اپل در صفحه ورود در یک زبان غیر از انگلیسی، مجموعه ای از locale پارامتر. مشاهده ورود به سیستم با اسناد اپل برای مناطق پشتیبانی شده است.

    نسخه وب 9

    provider.setCustomParameters({
      // Localize the Apple authentication screen in French.
      locale: 'fr'
    });

    نسخه وب 8

    provider.setCustomParameters({
      // Localize the Apple authentication screen in French.
      locale: 'fr'
    });
  4. با استفاده از شیء ارائه دهنده OAuth با Firebase احراز هویت کنید. با باز کردن یک پنجره بازشو یا تغییر مسیر به صفحه ورود ، می توانید از کاربران خود بخواهید با حساب های Apple خود وارد سیستم شوند. روش تغییر مسیر در دستگاه های تلفن همراه ترجیح داده می شود.

    • برای ثبت نام با یک پنجره پاپ آپ، پاسخ signInWithPopup() :

      نسخه وب 9

      import { getAuth, signInWithPopup, OAuthProvider } from "firebase/auth";
      
      const auth = getAuth();
      signInWithPopup(auth, provider)
        .then((result) => {
          // The signed-in user info.
          const user = result.user;
      
          // Apple credential
          const credential = OAuthProvider.credentialFromResult(result);
          const accessToken = credential.accessToken;
          const idToken = credential.idToken;
      
          // ...
        })
        .catch((error) => {
          // Handle Errors here.
          const errorCode = error.code;
          const errorMessage = error.message;
          // The email of the user's account used.
          const email = error.email;
          // The credential that was used.
          const credential = OAuthProvider.credentialFromError(error);
      
          // ...
        });

      نسخه وب 8

      firebase
        .auth()
        .signInWithPopup(provider)
        .then((result) => {
          /** @type {firebase.auth.OAuthCredential} */
          var credential = result.credential;
      
          // The signed-in user info.
          var user = result.user;
      
          // You can also get the Apple OAuth Access and ID Tokens.
          var accessToken = credential.accessToken;
          var idToken = credential.idToken;
      
          // ...
        })
        .catch((error) => {
          // Handle Errors here.
          var errorCode = error.code;
          var errorMessage = error.message;
          // The email of the user's account used.
          var email = error.email;
          // The firebase.auth.AuthCredential type that was used.
          var credential = error.credential;
      
          // ...
        });
    • برای ثبت نام با تغییر مسیر به صفحه ورود به سیستم، پاسخ signInWithRedirect() :

      نسخه وب 9

      import { getAuth, signInWithRedirect } from "firebase/auth";
      
      const auth = getAuth();
      signInWithRedirect(auth, provider);

      نسخه وب 8

      firebase.auth().signInWithRedirect(provider);

      پس از کامل کاربران ثبت نام و بازده به این صفحه، شما می توانید ورود به سیستم در نتیجه با تماس گرفتن getRedirectResult() :

      نسخه وب 9

      import { getAuth, getRedirectResult, OAuthProvider } from "firebase/auth";
      
      // Result from Redirect auth flow.
      const auth = getAuth();
      getRedirectResult(auth)
        .then((result) => {
          const credential = OAuthProvider.credentialFromResult(result);
          if (credential) {
            // You can also get the Apple OAuth Access and ID Tokens.
            const accessToken = credential.accessToken;
            const idToken = credential.idToken;
          }
          // The signed-in user info.
          const user = result.user;
        })
        .catch((error) => {
          // Handle Errors here.
          const errorCode = error.code;
          const errorMessage = error.message;
          // The email of the user's account used.
          const email = error.email;
          // The credential that was used.
          const credential = OAuthProvider.credentialFromError(error);
      
          // ...
        });

      نسخه وب 8

      // Result from Redirect auth flow.
      firebase
        .auth()
        .getRedirectResult()
        .then((result) => {
          if (result.credential) {
            /** @type {firebase.auth.OAuthCredential} */
            var credential = result.credential;
      
            // You can get the Apple OAuth Access and ID Tokens.
            var accessToken = credential.accessToken;
            var idToken = credential.idToken;
      
            // ...
          }
          // The signed-in user info.
          var user = result.user;
        })
        .catch((error) => {
          // Handle Errors here.
          var errorCode = error.code;
          var errorMessage = error.message;
          // The email of the user's account used.
          var email = error.email;
          // The firebase.auth.AuthCredential type that was used.
          var credential = error.credential;
      
          // ...
        });

      این جایی است که می توانید خطاها را بگیرید و مدیریت کنید. برای یک لیست از کدهای خطا، را ببینید مرجع API .

    برخلاف سایر ارائه دهندگان پشتیبانی شده توسط Firebase Auth ، اپل آدرس عکس ارائه نمی دهد.

    همچنین، هنگامی که کاربر بخواهد به اشتراک گذاشتن ایمیل خود را با این برنامه، مفاد اپل یک آدرس ایمیل منحصر به فرد برای آن کاربر (از فرم نمی xyz@privaterelay.appleid.com )، آن سهام با برنامه شما. اگر سرویس رله ایمیل خصوصی را پیکربندی کرده اید ، اپل ایمیل های ارسال شده به آدرس ناشناس را به آدرس ایمیل واقعی کاربر ارسال می کند.

    اپل این اطلاعات را تنها سهام کاربر مانند نام نمایش با برنامه های اولین بار که کاربر در. معمولا، فروشگاه های فایربیس نام صفحه نمایش اولین بار که کاربر با شرکت اپل، که شما می توانید با گرفتن firebase.auth().currentUser.displayName . با این حال ، اگر قبلاً از Apple برای ورود کاربر به برنامه بدون استفاده از Firebase استفاده کرده اید ، اپل نام نمایشی کاربر را به Firebase ارائه نمی دهد.

احراز هویت مجدد و پیوند دادن حساب

همین الگو را می توان با استفاده reauthenticateWithPopup() و reauthenticateWithRedirect() ، که شما می توانید برای بازیابی یک اعتبارنامه تازه برای عملیات حساس که نیاز به ورود به سیستم جدید استفاده کنید:

نسخه وب 9

import { getAuth, reauthenticateWithPopup, OAuthProvider } from "firebase/auth";

// Result from Redirect auth flow.
const auth = getAuth();
const provider = new OAuthProvider('apple.com');

reauthenticateWithPopup(auth.currentUser, provider)
  .then((result) => {
    // User is re-authenticated with fresh tokens minted and can perform
    // sensitive operations like account deletion, or updating their email
    // address or password.

    // The signed-in user info.
    const user = result.user;

    // You can also get the Apple OAuth Access and ID Tokens.
    const credential = OAuthProvider.credentialFromResult(result);
    const accessToken = credential.accessToken;
    const idToken = credential.idToken;

    // ...
  })
  .catch((error) => {
    // Handle Errors here.
    const errorCode = error.code;
    const errorMessage = error.message;
    // The email of the user's account used.
    const email = error.email;
    // The credential that was used.
    const credential = OAuthProvider.credentialFromError(error);

    // ...
  });

نسخه وب 8

const provider = new firebase.auth.OAuthProvider('apple.com');

firebase
  .auth()
  .currentUser
  .reauthenticateWithPopup(provider)
  .then((result) => {
    // User is re-authenticated with fresh tokens minted and can perform
    // sensitive operations like account deletion, or updating their email
    // address or password.
    /** @type {firebase.auth.OAuthCredential} */
    var credential = result.credential;

    // The signed-in user info.
    var user = result.user;
     // You can also get the Apple OAuth Access and ID Tokens.
    var accessToken = credential.accessToken;
    var idToken = credential.idToken;

    // ...
  })
  .catch((error) => {
    // Handle Errors here.
    var errorCode = error.code;
    var errorMessage = error.message;
    // The email of the user's account used.
    var email = error.email;
    // The firebase.auth.AuthCredential type that was used.
    var credential = error.credential;

    // ...
  });

و شما می توانید با استفاده از linkWithPopup() و linkWithRedirect() ، لینک ارائه دهندگان هویت های مختلف به حساب های موجود،.

توجه داشته باشید که اپل از شما می خواهد قبل از پیوند دادن حساب های Apple خود به سایر داده ها ، رضایت صریح خود را از آنها بگیرید.

به عنوان مثال ، برای پیوند دادن حساب فیس بوک به حساب فعلی Firebase ، از رمز دسترسی که از ورود کاربر به فیس بوک دریافت کرده اید استفاده کنید:

نسخه وب 9

import { getAuth, linkWithPopup, FacebookAuthProvider } from "firebase/auth";

const auth = getAuth();
const provider = new FacebookAuthProvider();
provider.addScope('user_birthday');

// Assuming the current user is an Apple user linking a Facebook provider.
linkWithPopup(auth.currentUser, provider)
    .then((result) => {
      // Facebook credential is linked to the current Apple user.
      // ...

      // The user can now sign in to the same account
      // with either Apple or Facebook.
    })
    .catch((error) => {
      // Handle error.
    });

نسخه وب 8

const provider = new firebase.auth.FacebookAuthProvider();
provider.addScope('user_birthday');

// Assuming the current user is an Apple user linking a Facebook provider.
firebase.auth().currentUser.linkWithPopup(provider)
    .then((result) => {
      // Facebook credential is linked to the current Apple user.
      // Facebook additional data available in result.additionalUserInfo.profile,

      // Additional Facebook OAuth access token can also be retrieved.
      // result.credential.accessToken

      // The user can now sign in to the same account
      // with either Apple or Facebook.
    })
    .catch((error) => {
      // Handle error.
    });

احراز هویت با Firebase در افزونه Chrome

اگر در حال ساخت برنامه افزودنی Chrome هستید ، باید شناسه افزونه Chrome خود را اضافه کنید:

  1. پروژه خود را در را باز کنسول فایربیس .
  2. در بخش احراز هویت، باز کردن صفحه ورود به سیستم روش.
  3. اضافه کردن یک URI مانند زیر را به لیست مجاز دامنه:
    chrome-extension://CHROME_EXTENSION_ID

فقط عملیات پنجره ( signInWithPopup ، linkWithPopup و reauthenticateWithPopup ) در دسترس برنامههای افزودنی Chrome، به عنوان برنامههای افزودنی Chrome می توانید HTTP تغییرمسیر استفاده نمی کند. شما باید این روشها را از یک اسکریپت صفحه پس زمینه به جای یک پنجره عمل مرورگر فراخوانی کنید ، زیرا پنجره احراز هویت پنجره عملکرد مرورگر را لغو می کند. روش پنجره تنها ممکن است در پسوند با استفاده از استفاده از اظهارنامه V2 . جدیدتر آشکار V3 تنها اجازه می دهد تا اسکریپت پس زمینه در قالب کارگران خدمات، که می تواند عملیات پنجره در همه انجام نمی دهد.

در مانیفست فایل را برنامه افزودنی Chrome خود را حاصل کنید که شما اضافه کردن https://apis.google.com URL به content_security_policy allowlist.

توجه داشته باشید که همچنان باید دامنه سفارشی را با Apple مشابه دامنه پیش فرض firebaseapp.com تأیید کنید:

http://auth.custom.example.com/.well-known/apple-developer-domain-association.txt

پیشرفته: احراز هویت با Firebase در Node.js

برای احراز هویت با Firebase در برنامه Node.js:

  1. با حساب Apple خود وارد سیستم شوید و رمز Apple ID کاربر را دریافت کنید. شما می توانید این کار را از چند طریق انجام دهید. به عنوان مثال ، اگر برنامه Node.js شما دارای مرورگر جلویی است:

    1. در پشتیبان خود ، یک رشته تصادفی ("nonce") ایجاد کرده و هش SHA256 آن را محاسبه کنید. nonce یک بار مصرف است که برای اعتبارسنجی یک سفر رفت و برگشت بین سرورهای پشتیبان خود و سرورهای نویسنده اپل استفاده می کنید.

      نسخه وب 9

      const crypto = require("crypto");
      const string_decoder = require("string_decoder");
      
      // Generate a new random string for each sign-in
      const generateNonce = (length) => {
        const decoder = new string_decoder.StringDecoder("ascii");
        const buf = Buffer.alloc(length);
        let nonce = "";
        while (nonce.length < length) {
          crypto.randomFillSync(buf);
          nonce = decoder.write(buf);
        }
        return nonce.substr(0, length);
      };
      
      const unhashedNonce = generateNonce(10);
      
      // SHA256-hashed nonce in hex
      const hashedNonceHex = crypto.createHash('sha256')
        .update(unhashedNonce).digest().toString('hex');

      نسخه وب 8

      const crypto = require("crypto");
      const string_decoder = require("string_decoder");
      
      // Generate a new random string for each sign-in
      const generateNonce = function(length) {
        const decoder = new string_decoder.StringDecoder("ascii");
        const buf = Buffer.alloc(length);
        var nonce = "";
        while (nonce.length < length) {
          crypto.randomFillSync(buf);
          nonce = decoder.write(buf);
        }
        return nonce.substr(0, length);
      };
      
      const unhashedNonce = generateNonce(10);
      
      // SHA256-hashed nonce in hex
      const hashedNonceHex = crypto.createHash('sha256')
        .update(unhashedNonce).digest().toString('hex');
    2. در صفحه ورود به سیستم ، پیکربندی ورود به سیستم با ورود به سیستم Apple را مشخص کنید:

      <script src="https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js"></script>
      <div id="appleid-signin" data-color="black" data-border="true" data-type="sign in"></div>
      <script>
          AppleID.auth.init({
              clientId: YOUR_APPLE_CLIENT_ID,
              scope: 'name email',
              redirectURI: URL_TO_YOUR_REDIRECT_HANDLER,  // See the next step.
              state: '[STATE]',  // Optional value that Apple will send back to you
                                 // so you can return users to the same context after
                                 // they sign in.
              nonce: HASHED_NONCE  // The hashed nonce you generated in the previous step.
          });
      </script>
      
    3. توکن Apple ID را از سمت سرور POSTed Author reply دریافت کنید:

      app.post('/redirect', (req, res) => {
        const savedState = req.cookies.__session;
        const code = req.body.code;
        const state = req.body.state;
        const appleIdToken = req.body.id_token;
        if (savedState !== state || !code) {
          res.status(403).send('403: Permission denied');
        } else {
          // Sign in with Firebase using appleIdToken. (See next step).
        }
      });
      

    همچنین مشاهده کنید پیکربندی صفحه وب خود را برای ورود به با اپل .

  2. پس از دریافت نشان Apple ID کاربر ، از آن برای ساختن یک شی Credential استفاده کنید و سپس با کاربری وارد سیستم شوید:

    نسخه وب 9

    import { getAuth, signInWithCredential, OAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    
    // Build Firebase credential with the Apple ID token.
    const provider = new OAuthProvider('apple.com');
    const authCredential = provider.credential({
      idToken: appleIdToken,
      rawNonce: unhashedNonce,
    });
    
    // Sign in with credential form the Apple user.
    signInWithCredential(auth, authCredential)
      .then((result) => {
        // User signed in.
      })
      .catch((error) => {
        // An error occurred. If error.code == 'auth/missing-or-invalid-nonce',
        // make sure you're sending the SHA256-hashed nonce as a hex string
        // with your request to Apple.
        console.log(error);
      });

    نسخه وب 8

    // Build Firebase credential with the Apple ID token.
    const provider = new firebase.auth.OAuthProvider('apple.com');
    const authCredential = provider.credential({
      idToken: appleIdToken,
      rawNonce: unhashedNonce,
    });
    
    // Sign in with credential form the Apple user.
    firebase.auth().signInWithCredential(authCredential)
      .then((result) => {
        // User signed in.
      })
      .catch((error) => {
        // An error occurred. If error.code == 'auth/missing-or-invalid-nonce',
        // make sure you're sending the SHA256-hashed nonce as a hex string
        // with your request to Apple.
        console.log(error);
      });

مراحل بعدی

پس از ورود کاربر برای اولین بار ، یک حساب کاربری جدید ایجاد می شود و به اعتبارنامه - یعنی نام کاربری و گذرواژه ، شماره تلفن یا اطلاعات ارائه دهنده تأیید - که کاربر با آن وارد شده است پیوند داده می شود. این حساب جدید به عنوان بخشی از پروژه Firebase شما ذخیره می شود و می تواند بدون در نظر گرفتن نحوه ورود کاربر در هر برنامه ای در پروژه شما ، کاربر را شناسایی کند.

  • در برنامه های خود را، راه توصیه می شود به دانستن وضعیت تایید از کاربر خود را این است که مجموعه یک ناظر در Auth شی. بعد از آن شما می توانید اطلاعات نمایه کاربر از User شی. مشاهده مدیریت کاربران .

  • در خود پایگاه فایربیس بیدرنگ و ابر ذخیره سازی قوانین امنیتی ، شما می توانید دریافت امضا در شناسه کاربری منحصر به فرد کاربر را از auth متغیر، و استفاده از آن برای کنترل آنچه داده دسترسی کاربر می تواند.

شما می توانید اجازه به کاربران برای ورود به سیستم برنامه خود را با استفاده از ارائه دهندگان تأیید هویت چندگانه توسط ارتباط تایید اعتبار ارائه دهنده به یک حساب کاربری موجود.

برای خروج از سیستم یک کاربر، پاسخ signOut :

نسخه وب 9

import { getAuth, signOut } from "firebase/auth";

const auth = getAuth();
signOut(auth).then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});

نسخه وب 8

firebase.auth().signOut().then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});