الفرق بين المراجعتين لصفحة: «Next.js/authentication»
لا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) طلا ملخص تعديل |
||
(4 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:الاستيثاق Authentication في Next.js}}</noinclude> | |||
يتيح لك الاستيثاق Authentication معرفة هوية المستخدم، بينما تتحكم من خلال رخصة الولج أو التصريح authorization بما يمكن الوصول إليه من موارد. تقدم لك Next.js أنماطًا متعددة من الاستيثاق وصُمم كل نمط لحالة مختلفة. سنمر في هذه الصفحة على كل حالة لتتمكن من الاختيار بناء على المعطيات المتوفرة. | |||
يتيح لك الاستيثاق Authentication معرفة هوية | |||
== أنماط الاستيثاق في 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.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 تلقائيًا إن كانت الصفحة ساكنة وذلك إن لم تتطلب أية بيانات محجوبة. أي بمعنى آخر غياب الدالتين [[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> في هذه الصفحة. يمكن لهذه الصفحة تصيير حالة تحميل loading state من الخادم بالتزامن مع تنفيذ عملية إحضار بيانات المستخدم إلى طرف العميل. ومن ميزات هذه النمط أنه يسمح بتقديم الصفحات من شبكة توصيل محتوى CDN عامة وإعادة تحميلها باستخدام المكوّن [[Next.js/next link|<code>next/link</code>]]، وهذا ما يؤدي عمليًا إلى بلوغ مرحلة التفاعل Time to Interactive (واختصارًا TTI) بسرعة أكبر. | ||
لنلق نظرة على هذه الصفحة الشخصية التي تصيّر مبدئيًا هيكل التحميل. | لنلق نظرة على هذه الصفحة الشخصية التي تصيّر مبدئيًا هيكل التحميل. حالما تنتهي معالجة طلب مصدره مستخدم معين ستُظهر هذه الصفحة اسم المستخدم:<syntaxhighlight lang="javascript"> | ||
// pages/profile.js | // pages/profile.js | ||
سطر 19: | سطر 18: | ||
const Profile = () => { | const Profile = () => { | ||
// إحضار بيانات المستخدم | // إحضار بيانات المستخدم من جانب العميل | ||
const { user } = useUser({ redirectTo: '/login' }) | const { user } = useUser({ redirectTo: '/login' }) | ||
سطر 27: | سطر 26: | ||
} | } | ||
// أظهر اسم المستخدم بعد | // أظهر اسم المستخدم بعد إنتهاء تنفيذ الطلب | ||
return ( | return ( | ||
<Layout> | <Layout> | ||
سطر 37: | سطر 36: | ||
export default Profile | export default Profile | ||
</syntaxhighlight> | </syntaxhighlight>يمكنك الاطلاع على [https://iron-session-example.vercel.app/ هذا المثال] العملي، وتحقق من من مثال <code>[https://github.com/vercel/next.js/tree/canary/examples/with-iron-session with-iron-session]</code> لمزيد من التفاصيل حول كيفية عملها. | ||
=== الاستيثاق من صفحات يصيّرها الخادم === | === الاستيثاق من صفحات يصيّرها الخادم === | ||
سطر 46: | سطر 45: | ||
} | } | ||
} | } | ||
</syntaxhighlight>لنحوّل مثال الصفحة الشخصية السابق إلى صفحات مصيّرة من قبل الخادم. إن | </syntaxhighlight>لنحوّل مثال الصفحة الشخصية السابق إلى صفحات مصيّرة من قبل الخادم. إن كانت هناك جلسة عمل ستُعاد القيمة <code>user</code> على شكل خاصية للمكوَّن <code>Profile</code> في الصفحة.<syntaxhighlight lang="javascript"> | ||
// pages/profile.js | // pages/profile.js | ||
سطر 80: | سطر 79: | ||
export default Profile | export default Profile | ||
</syntaxhighlight>إن ميزة هذا النمط هي منع | </syntaxhighlight>إن ميزة هذا النمط هي منع عرض محتوى للحظات سريعة (أجزاء من الثانية) لا يجب عرضه إلا لمستخدم سجل دخوله قبل أن يُعاد توجيهه إلى المتصفح إن لم يكن. ومن المهم ملاحظة أن إحضار البيانات بواسطة الدالة سيمنع التصيير حتى يُجاب طلب الاستيثاق. ولكي تمنع ظاهرة عنق الزجاجة bottleneck وتزيد من قيمة مؤشر (زمن وصول أول بايت [https://web.dev/time-to-first-byte/ Time to First Byte] واختصارًا TTFB) عليك أن تتأكد من سرعة الاستيثاق وإلا فكر باستخدام التوليد الساكن. | ||
== مكتبات الاستيثاق في Next.js == | == مكتبات الاستيثاق في Next.js == | ||
سطر 86: | سطر 85: | ||
* <code>[https://github.com/vercel/next.js/tree/canary/examples/with-iron-session iron-session]</code>: وذلك إن احتجت إلى خدمة لتقديم جلسة مُشفّرة عند مستوى منخفض دون حالة stateless. | * <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 | * <code>[https://github.com/nextauthjs/next-auth-example next-auth]</code>: وذك إن أردت منظومة استيثاق كاملة الميزات دمجت معها مزوّدات (Google و Facebook و GitHub وغيرها) وكذلك مفاتيح استيثاق JWT و JWE عبر بريد إلكتروني/كلمة سر، وروابط الاستيثاق magic links وغيرها. | ||
تدعم هذه المكتبات كلا نمطي الاستيثاق، وإن كنت مهتمًا باستخدام الأداة الوسطية [http://www.passportjs.org/ Passport]، الق نظرة على المثاليين الخارجيين التاليين على GitHub: | تدعم هذه المكتبات كلا نمطي الاستيثاق، وإن كنت مهتمًا باستخدام الأداة الوسطية [http://www.passportjs.org/ Passport]، الق نظرة على المثاليين الخارجيين التاليين على GitHub: | ||
سطر 94: | سطر 93: | ||
=== مكتبات استيثاق أخرى === | === مكتبات استيثاق أخرى === | ||
الق نظرة على [https://github.com/vercel/next.js/tree/canary/examples مخزن | الق نظرة على [https://github.com/vercel/next.js/tree/canary/examples مخزن GitHub المخصص لهذا الغرض]. | ||
== أمثلة == | |||
* [https://github.com/vercel/next.js/tree/canary/examples/with-iron-session with-iron-session] | |||
* [https://github.com/nextauthjs/next-auth-example next-auth-example] | |||
* [https://github.com/vercel/next.js/tree/canary/examples/auth0 Auth0] | |||
* [https://github.com/vercel/next.js/tree/canary/examples/with-clerk Clerk] | |||
* [https://github.com/vercel/next.js/tree/canary/examples/with-firebase-authentication Firebase] | |||
* [https://github.com/vercel/next.js/tree/canary/examples/with-magic Magic] | |||
* [https://github.com/vercel/next.js/tree/canary/examples/with-nhost-auth-realtime-graphql Nhost] | |||
* [https://github.com/vercel/examples/tree/main/solutions/auth-with-ory Ory] | |||
* [https://github.com/vercel/next.js/tree/canary/examples/with-supabase-auth-realtime-db Supabase] | |||
* [https://github.com/vercel/next.js/tree/canary/examples/with-supertokens Supertokens] | |||
* [https://github.com/vercel/next.js/tree/canary/examples/with-userbase Userbase] | |||
== المصادر == | == المصادر == | ||
* الصفحة [https://nextjs.org/docs/authentication Authentication] من توثيق Next.js الرسمي. | * الصفحة [https://nextjs.org/docs/authentication Authentication] من توثيق Next.js الرسمي. | ||
[[تصنيف:Next.js|{{SUBPAGENAME}}]] |
المراجعة الحالية بتاريخ 16:44، 4 يناير 2023
يتيح لك الاستيثاق Authentication معرفة هوية المستخدم، بينما تتحكم من خلال رخصة الولج أو التصريح authorization بما يمكن الوصول إليه من موارد. تقدم لك Next.js أنماطًا متعددة من الاستيثاق وصُمم كل نمط لحالة مختلفة. سنمر في هذه الصفحة على كل حالة لتتمكن من الاختيار بناء على المعطيات المتوفرة.
أنماط الاستيثاق في Next.js
إن الخطوة الرئيسية في تحديد نمط الاستيثاق الذي تحتاجه هي فهم استراتيجية إحضار البيانات التي تريدها. يمكنك بعد ذلك تحديد مزود خدمة الاستيثاق الذي يدعم هذه الاستراتيجية. ستجد عمومًا نمطين أساسيين:
- استخدام التوليد الساكن ليصيَّر الخادم حالة تحميل يليها إحضار بيانات المستخدم من جانب العميل.
- إحضار بيانات المستخدم من جانب الخادم.
الاستيثاق في صفحات التوليد الساكن
تقرر Next.js تلقائيًا إن كانت الصفحة ساكنة وذلك إن لم تتطلب أية بيانات محجوبة. أي بمعنى آخر غياب الدالتين getServerSideProps
و getInitialProps
في هذه الصفحة. يمكن لهذه الصفحة تصيير حالة تحميل loading state من الخادم بالتزامن مع تنفيذ عملية إحضار بيانات المستخدم إلى طرف العميل. ومن ميزات هذه النمط أنه يسمح بتقديم الصفحات من شبكة توصيل محتوى CDN عامة وإعادة تحميلها باستخدام المكوّن 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
يمكنك الاطلاع على هذا المثال العملي، وتحقق من من مثال with-iron-session
لمزيد من التفاصيل حول كيفية عملها.
الاستيثاق من صفحات يصيّرها الخادم
إن صُدّرت الدالة غير المتزامنة 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 المخصص لهذا الغرض.
أمثلة
- with-iron-session
- next-auth-example
- Auth0
- Clerk
- Firebase
- Magic
- Nhost
- Ory
- Supabase
- Supertokens
- Userbase
المصادر
- الصفحة Authentication من توثيق Next.js الرسمي.