الفرق بين المراجعتين لصفحة: «Next.js/authentication»

من موسوعة حسوب
أنشأ صفحة فارغة
 
لا ملخص تعديل
سطر 1: سطر 1:


= الاستيثاق في Next.js =
يتيح لك الاستيثاق Authentication معرفة هوية المستخدم بينما تتحكم من خلال رخصة الولج authorization بما يمكن الوصول إليه من موارد. تقدم لك Next.js أنماطًا متعددة من الاستيثاق وصُمم كل نمط لحالة مختلفة. سنمر في هذ الصفحة على كل حالة لتتمكن من الاختيار بناء على المعطيات المتوفرة.
== أنماط الاستيثاق في Next.js ==
إن الخطوة الرئيسية في تحديد النمط الاستيثاق التي تحتاجه هي فهم استراتيجية إحضار البيانات التي تريدها. يمكنك بعد ذلك تحديد مزود خدمة الاستيثاق التي تدعم هذه الاستراتيجية. ستجد عمومًا نمطين أساسيين:
* استخدام [[Next.js/pages#.D8.A7.D9.84.D8.AA.D9.88.D9.84.D9.8A.D8.AF%20.D8.A7.D9.84.D8.B3.D8.A7.D9.83.D9.86%20.D9.84.D8.B5.D9.81.D8.AD.D8.A7.D8.AA%20.D8.A8.D9.84.D8.A7%20.D8.A8.D9.8A.D8.A7.D9.86.D8.A7.D8.AA%20.D9.81.D9.8A%20Next.js|التوليد الساكن]] ليصيَّر الخادم حالة تحميل يليها إحضار بيانات المستخدم إلى جانب العميل.
* إحضار بيانات المستخدم إلى [[Next.js/pages#.D8.A7.D9.84.D8.AA.D8.B5.D9.8A.D9.8A.D8.B1%20.D9.85.D9.86%20.D8.AC.D8.A7.D9.86.D8.A8%20.D8.A7.D9.84.D8.AE.D8.A7.D8.AF.D9.85%20.D9.81.D9.8A%20Next.js|جانب العميل]] لإزالة محتوى لم يُستوثق منه.
=== الاستيثاق في صفحات التوليد الساكن ===
تقرر Next.js تلقائيًا إن كانت الصفحة ساكنة وذلك إن لم تحتج بيانات محجوبة. أي بمعنى آخر غياب الدالتين  [[Next.js/data fetching#.D8.A7.D9.84.D8.AA.D8.B5.D9.8A.D9.8A.D8.B1%20.D9.85.D9.86%20.D8.AC.D8.A7.D9.86.D8.A8%20.D8.A7.D9.84.D8.AE.D8.A7.D8.AF.D9.85%20.D9.81.D9.8A%20Next.js%20.D8.A8.D8.A7.D8.B3.D8.AA.D8.AE.D8.AF.D8.A7.D9.85%20.D8.A7.D9.84.D8.AF.D8.A7.D9.84.D8.A9%20getServerSideProps|<code>getServerSideProps</code>]] و <code>getInitialProps</code>  في هذه الصفحة. يمكن لهذه الصفحة تصيير حمل من الخادم يليها إحضار بيانات المستخدم إلى طرف العميل. ومن ميزات هذه النمط انه يسمح بتقديم الصفحات من شبكة توصيل محتوى عامة وإعادة تحميلها باستخدام المكوّن [[Next.js/next link|<code>next/link</code>]]، وهذا ما يؤدي عمليًا إلى بلوغ زمن التفاعل Time to Interactive واختصارًا TTI بسرعة أكبر.
لنلق نظرة على هذه الصفحة الشخصية التي تصيّر مبدئيًا هيكل التحميل. وحالما تنتهي معالجة طلب مصدره مستخدم معين ستُظهر الصفحة اسم المستخدم:<syntaxhighlight lang="javascript">
// pages/profile.js
import useUser from '../lib/useUser'
import Layout from '../components/Layout'
const Profile = () => {
  // إحضار بيانات المستخدم إلى جانب العميل
  const { user } = useUser({ redirectTo: '/login' })
  // تصيير حالة التحميل من ناحية الخادم
  if (!user || user.isLoggedIn === false) {
    return <Layout>Loading...</Layout>
  }
  // أظهر اسم المستخدم بعد غنتهاء تنفيذ الطلب
  return (
    <Layout>
      <h1>Your Profile</h1>
      <pre>{JSON.stringify(user, null, 2)}</pre>
    </Layout>
  )
}
export default Profile
</syntaxhighlight>
=== الاستيثاق من صفحات يصيّرها الخادم ===
إن صُدّرت الدالة غير المتزامنة <code>getServerSideProps</code> من صفحة، تُصيّر Next.js هذه الصفحة مسبقًا عند كل طلب مستخدمة البيانات التي تعيدها تلك الدالة:<syntaxhighlight lang="javascript">
export async function getServerSideProps(context) {
  return {
    props: {}, // تمرر إلى مكوّن الصفحة على شكل خاصيات
  }
}
</syntaxhighlight>لنحوّل مثال الصفحة الشخصية السابق إلى صفحات مصيّرة من قبل الخادم. إن كان هناك جلسة عمل ستُعاد القيمة <code>user</code>على شكل خاصية للمكوَّن <code>Profile</code> في الصفحة.<syntaxhighlight lang="javascript">
// pages/profile.js
import withSession from '../lib/session'
import Layout from '../components/Layout'
export const getServerSideProps = withSession(async function ({ req, res }) {
  const { user } = req.session
  if (!user) {
    return {
      redirect: {
        destination: '/login',
        permanent: false,
      },
    }
  }
  return {
    props: { user },
  }
})
const Profile = ({ user }) => {
  //أظهر اسم المستخدم دون الحاجة لحالة التحميل
  return (
    <Layout>
      <h1>Your Profile</h1>
      <pre>{JSON.stringify(user, null, 2)}</pre>
    </Layout>
  )
}
export default Profile
</syntaxhighlight>إن ميزة هذا النمط هي منع دفقة غير مستوثقة من البيانات قبل أن يُعاد توجيها إلى المتصفح. ومن المهم ملاحظة أن  إحضار البيانات بواسطة الدالة سيمنع التصيير حتى يُجاب طلب الاستيثاق. ولكي تمنع ظاهرة عنق الزجاجة bottleneck وتزيد من قيمة مؤشر (زمن وصول أول بايت [https://web.dev/time-to-first-byte/ Time to First Byte] واختصارًا TTFB) عليك ان تتأكد من سرعة الاستيثاق وإلا فكر باستخدام التوليد الساكن.
== مكتبات الاستيثاق في Next.js ==
لنلق نظرة اللآن على بعض مكتبات الاستيثاق الخاصة ونستكشف طرق العمل معها.
* <code>[https://github.com/vercel/next.js/tree/canary/examples/with-iron-session iron-session]</code>: وذلك إن احتجت إلى خدمة لتقديم جلسة مُشفّرة عند مستوى منخفض دون حالة stateless.
* <code>[https://github.com/nextauthjs/next-auth-example next-auth]</code>: وذك إن أردت منظومة استيثاق كاملة الميزات دمجت معها مزوّدات (Google و Facebook و GitHub وغيرها) وكذلك مفاتيح استيثاق JWT و JWE و ثنائيات بريد إلكتروني/كلمة سر، وروابط الاستيثاق magic links وغيرها.
تدعم هذه المكتبات كلا نمطي الاستيثاق، وإن كنت مهتمًا باستخدام الأداة الوسطية [http://www.passportjs.org/ Passport]، الق نظرة على المثاليين الخارجيين التاليين على GitHub:
* [https://github.com/vercel/next.js/tree/canary/examples/with-passport with-passport]
* [https://github.com/vercel/next.js/tree/canary/examples/with-passport with-passport-and-next-connect]
=== مكتبات استيثاق أخرى ===
الق نظرة على [https://github.com/vercel/next.js/tree/canary/examples مخزن Github المخصص لهذا الغرض].
== المصادر ==
* الصفحة [https://nextjs.org/docs/authentication Authentication] من توثيق Next.js الرسمي.

مراجعة 08:02، 27 مايو 2022

الاستيثاق في Next.js

يتيح لك الاستيثاق Authentication معرفة هوية المستخدم بينما تتحكم من خلال رخصة الولج authorization بما يمكن الوصول إليه من موارد. تقدم لك Next.js أنماطًا متعددة من الاستيثاق وصُمم كل نمط لحالة مختلفة. سنمر في هذ الصفحة على كل حالة لتتمكن من الاختيار بناء على المعطيات المتوفرة.

أنماط الاستيثاق في Next.js

إن الخطوة الرئيسية في تحديد النمط الاستيثاق التي تحتاجه هي فهم استراتيجية إحضار البيانات التي تريدها. يمكنك بعد ذلك تحديد مزود خدمة الاستيثاق التي تدعم هذه الاستراتيجية. ستجد عمومًا نمطين أساسيين:

  • استخدام التوليد الساكن ليصيَّر الخادم حالة تحميل يليها إحضار بيانات المستخدم إلى جانب العميل.
  • إحضار بيانات المستخدم إلى جانب العميل لإزالة محتوى لم يُستوثق منه.

الاستيثاق في صفحات التوليد الساكن

تقرر Next.js تلقائيًا إن كانت الصفحة ساكنة وذلك إن لم تحتج بيانات محجوبة. أي بمعنى آخر غياب الدالتين getServerSideProps و getInitialProps في هذه الصفحة. يمكن لهذه الصفحة تصيير حمل من الخادم يليها إحضار بيانات المستخدم إلى طرف العميل. ومن ميزات هذه النمط انه يسمح بتقديم الصفحات من شبكة توصيل محتوى عامة وإعادة تحميلها باستخدام المكوّن next/link، وهذا ما يؤدي عمليًا إلى بلوغ زمن التفاعل Time to Interactive واختصارًا TTI بسرعة أكبر.

لنلق نظرة على هذه الصفحة الشخصية التي تصيّر مبدئيًا هيكل التحميل. وحالما تنتهي معالجة طلب مصدره مستخدم معين ستُظهر الصفحة اسم المستخدم:

// pages/profile.js

import useUser from '../lib/useUser'
import Layout from '../components/Layout'

const Profile = () => {
  // إحضار بيانات المستخدم إلى جانب العميل
  const { user } = useUser({ redirectTo: '/login' })

  // تصيير حالة التحميل من ناحية الخادم
  if (!user || user.isLoggedIn === false) {
    return <Layout>Loading...</Layout>
  }

  // أظهر اسم المستخدم بعد غنتهاء تنفيذ الطلب
  return (
    <Layout>
      <h1>Your Profile</h1>
      <pre>{JSON.stringify(user, null, 2)}</pre>
    </Layout>
  )
}

export default Profile

الاستيثاق من صفحات يصيّرها الخادم

إن صُدّرت الدالة غير المتزامنة getServerSideProps من صفحة، تُصيّر Next.js هذه الصفحة مسبقًا عند كل طلب مستخدمة البيانات التي تعيدها تلك الدالة:

export async function getServerSideProps(context) {
  return {
    props: {}, // تمرر إلى مكوّن الصفحة على شكل خاصيات
  }
}

لنحوّل مثال الصفحة الشخصية السابق إلى صفحات مصيّرة من قبل الخادم. إن كان هناك جلسة عمل ستُعاد القيمة userعلى شكل خاصية للمكوَّن Profile في الصفحة.

// pages/profile.js

import withSession from '../lib/session'
import Layout from '../components/Layout'

export const getServerSideProps = withSession(async function ({ req, res }) {
  const { user } = req.session

  if (!user) {
    return {
      redirect: {
        destination: '/login',
        permanent: false,
      },
    }
  }

  return {
    props: { user },
  }
})

const Profile = ({ user }) => {
  //أظهر اسم المستخدم دون الحاجة لحالة التحميل
  return (
    <Layout>
      <h1>Your Profile</h1>
      <pre>{JSON.stringify(user, null, 2)}</pre>
    </Layout>
  )
}

export default Profile

إن ميزة هذا النمط هي منع دفقة غير مستوثقة من البيانات قبل أن يُعاد توجيها إلى المتصفح. ومن المهم ملاحظة أن إحضار البيانات بواسطة الدالة سيمنع التصيير حتى يُجاب طلب الاستيثاق. ولكي تمنع ظاهرة عنق الزجاجة bottleneck وتزيد من قيمة مؤشر (زمن وصول أول بايت Time to First Byte واختصارًا TTFB) عليك ان تتأكد من سرعة الاستيثاق وإلا فكر باستخدام التوليد الساكن.

مكتبات الاستيثاق في Next.js

لنلق نظرة اللآن على بعض مكتبات الاستيثاق الخاصة ونستكشف طرق العمل معها.

  • iron-session: وذلك إن احتجت إلى خدمة لتقديم جلسة مُشفّرة عند مستوى منخفض دون حالة stateless.
  • next-auth: وذك إن أردت منظومة استيثاق كاملة الميزات دمجت معها مزوّدات (Google و Facebook و GitHub وغيرها) وكذلك مفاتيح استيثاق JWT و JWE و ثنائيات بريد إلكتروني/كلمة سر، وروابط الاستيثاق magic links وغيرها.

تدعم هذه المكتبات كلا نمطي الاستيثاق، وإن كنت مهتمًا باستخدام الأداة الوسطية Passport، الق نظرة على المثاليين الخارجيين التاليين على GitHub:

مكتبات استيثاق أخرى

الق نظرة على مخزن Github المخصص لهذا الغرض.

المصادر