Auth0 Next.js SDK เป็นไลบรารีสำหรับการนำการรับรองความถูกต้องของผู้ใช้ไปใช้ในแอปพลิเคชัน Next.js
เอกสารประกอบ - การเริ่มต้นใช้งาน - การอ้างอิง API - คำติชม
QuickStart- คำแนะนำในการเพิ่ม Auth0 ให้กับแอป Next.js ของคุณ
คำถามที่พบบ่อย - คำถามที่พบบ่อยเกี่ยวกับ nextjs-auth0
ตัวอย่าง - ตัวอย่างมากมายสำหรับกรณีการใช้งานที่แตกต่างกันของคุณ
ความปลอดภัย - ประกาศด้านความปลอดภัยที่สำคัญบางประการที่คุณควรตรวจสอบ
สถาปัตยกรรม - ภาพรวมทางสถาปัตยกรรมของ SDK
การทดสอบ - ความช่วยเหลือในการทดสอบแอปพลิเคชัน nextjs-auth0 ของคุณ
การปรับใช้ - วิธีที่เราปรับใช้แอปตัวอย่างของเรากับ Vercel
ไซต์เอกสาร - สำรวจไซต์เอกสารของเราและเรียนรู้เพิ่มเติมเกี่ยวกับ Auth0
ใช้ npm:
npm ติดตั้ง @auth0/nextjs-auth0
ไลบรารีนี้ต้องใช้ Node.js 16 LTS และ LTS เวอร์ชันที่ใหม่กว่า
สร้าง แอปพลิเคชันเว็บปกติ ในแดชบอร์ด Auth0
หากคุณใช้แอปพลิเคชันที่มีอยู่ ให้ตรวจสอบว่าคุณได้กำหนดการตั้งค่าต่อไปนี้ในแอปพลิเคชันเว็บปกติของคุณ:
คลิกที่แท็บ "การตั้งค่า" ของหน้าแอปพลิเคชันของคุณ
เลื่อนลงและคลิกที่ลิงค์ "แสดงการตั้งค่าขั้นสูง"
ใต้ "การตั้งค่าขั้นสูง" คลิกแท็บ "OAuth"
ตรวจสอบว่าได้ตั้งค่า "JsonWebToken Signature Algorithm" เป็น
RS256
และเปิดใช้ "OIDC Conformant" แล้ว
จากนั้น กำหนดค่า URL ต่อไปนี้สำหรับแอปพลิเคชันของคุณในส่วน "URI ของแอปพลิเคชัน" ของหน้า "การตั้งค่า":
URL โทรกลับที่อนุญาต : http://localhost:3000/api/auth/callback
URL การออกจากระบบที่อนุญาต : http://localhost:3000/
จดบันทึก รหัสลูกค้า , ความลับของลูกค้า และค่า โดเมน ในส่วน "ข้อมูลพื้นฐาน" คุณจะต้องใช้ค่าเหล่านี้ในขั้นตอนถัดไป
คุณต้องอนุญาตให้แอปพลิเคชัน Next.js สื่อสารกับ Auth0 ได้อย่างถูกต้อง คุณสามารถทำได้โดยการสร้างไฟล์ .env.local
ใต้ไดเร็กทอรีโปรเจ็กต์รากของคุณซึ่งกำหนดค่าการกำหนดค่า Auth0 ที่จำเป็นดังต่อไปนี้:
# ค่าลับแบบยาวที่ใช้ในการเข้ารหัสคุกกี้เซสชันAUTH0_SECRET='LONG_RANDOM_VALUE'# URL พื้นฐานของแอปพลิเคชันของคุณAUTH0_BASE_URL='http://localhost:3000'# URL ของโดเมนผู้เช่า Auth0 ของคุณAUTH0_ISSUER_BASE_URL='https://YOUR_AUTH0_DOMAIN.auth0 .com'# ไคลเอนต์แอปพลิเคชัน Auth0 ของคุณ IDAUTH0_CLIENT_ID='YOUR_AUTH0_CLIENT_ID'# ความลับไคลเอ็นต์ของแอปพลิเคชัน Auth0 ของคุณAUTH0_CLIENT_SECRET='YOUR_AUTH0_CLIENT_SECRET'
คุณสามารถดำเนินการคำสั่งต่อไปนี้เพื่อสร้างสตริงที่เหมาะสมสำหรับค่า AUTH0_SECRET
:
โหนด -e "console.log(crypto.randomBytes(32).toString('hex'))"
คุณสามารถดูรายการตัวเลือกการกำหนดค่า Auth0 ทั้งหมดได้ในส่วน "คุณสมบัติการกำหนดค่า" ของเอกสาร "การกำหนดค่าโมดูล"
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการโหลดตัวแปรสภาพแวดล้อมใน Next.js โปรดไปที่เอกสาร "ตัวแปรสภาพแวดล้อม"
เพิ่ม handleAuth()
ให้กับแอปของคุณ ซึ่งสร้างตัวจัดการเส้นทางต่อไปนี้ภายใต้ประทุนที่ทำหน้าที่ส่วนต่างๆ ของขั้นตอนการตรวจสอบสิทธิ์:
/api/auth/login
: แอปพลิเคชัน Next.js ของคุณเปลี่ยนเส้นทางผู้ใช้ไปยังผู้ให้บริการข้อมูลประจำตัวของคุณเพื่อให้พวกเขาเข้าสู่ระบบ (คุณสามารถเลือกส่งพารามิเตอร์ returnTo
เพื่อกลับไปยัง URL ที่เกี่ยวข้องที่กำหนดเองหลังจากเข้าสู่ระบบได้ เช่น /api/auth/login?returnTo=/profile
)
/api/auth/callback
: ผู้ให้บริการข้อมูลระบุตัวตนของคุณเปลี่ยนเส้นทางผู้ใช้ไปยังเส้นทางนี้หลังจากที่พวกเขาเข้าสู่ระบบสำเร็จ
/api/auth/logout
: แอปพลิเคชัน Next.js ของคุณออกจากระบบผู้ใช้
/api/auth/me
: คุณสามารถดึงข้อมูลโปรไฟล์ผู้ใช้ในรูปแบบ JSON
ตั้งค่าต่อโดยขึ้นอยู่กับเราเตอร์ของคุณ:
เราเตอร์เพจ
แอพเราเตอร์
สร้างตัวจัดการเส้นทาง API แบบไดนามิกภายใต้ไดเร็กทอรี /pages/api
:
สร้างไดเร็กทอรี auth
ภายใต้ไดเร็กทอรี /pages/api/
สร้างไฟล์ [auth0].js
ภายใต้ไดเร็กทอรี auth
ที่สร้างขึ้นใหม่
เส้นทางไปยังไฟล์เส้นทาง API แบบไดนามิกของคุณจะเป็น /pages/api/auth/[auth0].js
เติมไฟล์ดังกล่าวดังนี้:
นำเข้า { handleAuth } จาก '@auth0/nextjs-auth0'; ส่งออกค่าเริ่มต้น handleAuth();
ล้อมส่วนประกอบของ pages/_app.js
ด้วยส่วนประกอบ UserProvider
:
// หน้า/_app.jsimport โต้ตอบจาก 'react'; นำเข้า { UserProvider } จาก '@auth0/nextjs-auth0/client'; ส่งออกแอปฟังก์ชันเริ่มต้น ({ Component, pageProps }) { กลับ (<UserProvider> <ส่วนประกอบ {...pageProps} /></UserProvider> -
ตอนนี้คุณสามารถระบุได้ว่าผู้ใช้ได้รับการรับรองความถูกต้องหรือไม่โดยตรวจสอบว่ามีการกำหนดอ็อบเจ็กต์ user
ที่ส่งคืนโดยตะขอ useUser()
คุณยังสามารถเข้าสู่ระบบหรือออกจากระบบผู้ใช้ของคุณจากเลเยอร์ส่วนหน้าของแอปพลิเคชัน Next.js ของคุณโดยเปลี่ยนเส้นทางไปยังเส้นทางที่สร้างขึ้นโดยอัตโนมัติที่เหมาะสม:
// หน้า/index.jsimport { useUser } จาก '@auth0/nextjs-auth0/client'; ส่งออกฟังก์ชันเริ่มต้น Index() { const { ผู้ใช้, ข้อผิดพลาด, isLoading } = useUser(); ถ้า (isLoading) กลับ <div>กำลังโหลด...</div>; ถ้า (ข้อผิดพลาด) ส่งคืน <div>{error.message}</div>; ถ้า (ผู้ใช้) {return ( <div>ยินดีต้อนรับ {user.name}! <a href="/api/auth/logout">ออกจากระบบ</a> </div>); - กลับ <a href="/api/auth/login">เข้าสู่ระบบ</a>;}
กฎ Linting ถัดไปอาจแนะนำให้ใช้คอมโพเนนต์
Link
แทนแท็ก Anchor ส่วนประกอบLink
มีไว้เพื่อทำการเปลี่ยนระหว่างเพจฝั่งไคลเอ็นต์ เนื่องจากลิงก์ชี้ไปที่เส้นทาง API ไม่ใช่หน้า คุณควรเก็บลิงก์เหล่านั้นไว้เป็นแท็กจุดยึด
ลองใช้ SDK นี้กับส่วนประกอบเซิร์ฟเวอร์ React ก่อนดำเนินการต่อ
สร้างตัวจัดการเส้นทาง API แบบไดนามิกที่รับทั้งหมดภายใต้ไดเร็กทอรี /app/api
(พูดอย่างเคร่งครัด คุณไม่จำเป็นต้องใส่เส้นทาง API ไว้ใต้ /api
แต่เรายังคงรักษาแบบแผนเพื่อความเรียบง่าย):
สร้างไดเร็กทอรี api
ภายใต้ไดเร็กทอรี /app/
สร้างไดเร็กทอรี auth
ภายใต้ไดเร็กทอรี /app/api/
ที่สร้างขึ้นใหม่
สร้างไดเร็กทอรี [auth0]
ภายใต้ไดเร็กทอรี auth
ที่สร้างขึ้นใหม่
สร้างไฟล์ route.js
ภายใต้ไดเร็กทอรี [auth0]
ที่สร้างขึ้นใหม่
เส้นทางไปยังไฟล์เส้นทาง API แบบไดนามิกของคุณจะเป็น /app/api/auth/[auth0]/route.js
เติมไฟล์ดังกล่าวดังนี้:
นำเข้า { handleAuth } จาก '@auth0/nextjs-auth0'; ส่งออก const GET = handleAuth();
UserProvider
ให้กับเลย์เอาต์ของคุณ ล้อมองค์ประกอบ app/layout.js
ของคุณด้วยองค์ประกอบ UserProvider
:
// app/layout.jsimport React from 'react';import { UserProvider } from '@auth0/nextjs-auth0/client'; ส่งออกฟังก์ชันเริ่มต้นของแอป ({ Children }) { กลับ (<UserProvider> <body>{children}</body></UserProvider> -
ตอนนี้คุณสามารถระบุได้ว่าผู้ใช้ได้รับการรับรองความถูกต้องหรือไม่โดยตรวจสอบว่ามีการกำหนดอ็อบเจ็กต์ user
ที่ส่งคืนโดยตะขอ useUser()
คุณยังสามารถเข้าสู่ระบบหรือออกจากระบบผู้ใช้ของคุณจากเลเยอร์ส่วนหน้าของแอปพลิเคชัน Next.js ของคุณโดยเปลี่ยนเส้นทางไปยังเส้นทางที่สร้างขึ้นโดยอัตโนมัติที่เหมาะสม:
// หน้า/index.js'use client';นำเข้า { useUser } จาก '@auth0/nextjs-auth0/client';ส่งออกฟังก์ชันเริ่มต้น Index() { const { ผู้ใช้, ข้อผิดพลาด, isLoading } = useUser(); ถ้า (isLoading) กลับ <div>กำลังโหลด...</div>; ถ้า (ข้อผิดพลาด) ส่งคืน <div>{error.message}</div>; ถ้า (ผู้ใช้) {return ( <div>ยินดีต้อนรับ {user.name}! <a href="/api/auth/logout">ออกจากระบบ</a> </div>); - กลับ <a href="/api/auth/login">เข้าสู่ระบบ</a>;}
กฎ Linting ถัดไปอาจแนะนำให้ใช้คอมโพเนนต์
Link
แทนแท็ก Anchor ส่วนประกอบLink
มีไว้เพื่อทำการเปลี่ยนระหว่างเพจฝั่งไคลเอ็นต์ เนื่องจากลิงก์ชี้ไปที่เส้นทาง API ไม่ใช่เพจ คุณควรเก็บลิงก์เหล่านั้นไว้เป็นแท็กจุดยึด
ส่วนประกอบเซิร์ฟเวอร์ใน App Directory (รวมถึงหน้าและเค้าโครง) ไม่สามารถ เขียนลงในคุกกี้ได้
หากคุณอาศัยส่วนประกอบเซิร์ฟเวอร์ เพียงอย่างเดียว ในการอ่านและอัปเดตเซสชันของคุณ คุณควรคำนึงถึงสิ่งต่อไปนี้:
หากคุณมีเซสชันต่อเนื่อง (ค่าเริ่มต้นสำหรับ SDK นี้) การหมดอายุจะไม่ได้รับการอัปเดตเมื่อผู้ใช้เยี่ยมชมไซต์ของคุณ ดังนั้นเซสชันอาจหมดอายุเร็วกว่าที่คุณคาดไว้ (คุณสามารถใช้ withMiddlewareAuthRequired
เพื่อลดปัญหานี้ได้)
หากคุณรีเฟรชโทเค็นการเข้าถึง โทเค็นการเข้าถึงใหม่จะไม่คงอยู่ในเซสชัน ดังนั้นการพยายามรับโทเค็นการเข้าถึงในภายหลังจะส่งผลให้มีการรีเฟรชโทเค็นการเข้าถึงที่หมดอายุในเซสชันเสมอ
หากคุณทำการอัปเดตอื่นใดในเซสชัน การอัปเดตเหล่านั้นจะไม่คงอยู่ระหว่างคำขอ
คุกกี้ สามารถ เขียนได้จากมิดเดิลแวร์ ตัวจัดการเส้นทาง และการดำเนินการของเซิร์ฟเวอร์
สำหรับตัวอย่างที่ครอบคลุมอื่นๆ โปรดดูเอกสาร EXAMPLES.md
import * from @auth0/nextjs-auth0
import * from @auth0/nextjs-auth0/edge
ตัวเลือกการกำหนดค่าและตัวแปรสภาพแวดล้อม
initAuth0
จัดการการตรวจสอบสิทธิ์
จัดการเข้าสู่ระบบ
จัดการการโทรกลับ
จัดการออกจากระบบ
จัดการโปรไฟล์
จำเป็นต้องมี ApiAuth
จำเป็นต้องมี PageAuth
รับเซสชั่น
อัปเดตเซสชั่น
getAccessToken
withMiddlewareAuthRequired (Edge เท่านั้น)
import * from @auth0/nextjs-auth0/client
UserProvider
useUser
จำเป็นต้องมี PageAuth
import * from @auth0/nextjs-auth0/testing
สร้าง SessionCookie
ไปที่เอกสาร API ที่สร้างขึ้นอัตโนมัติเพื่อดูรายละเอียดเพิ่มเติม
คุกกี้ทั้งหมดจะถูกตั้งค่าเป็น HttpOnly, SameSite=Lax
และจะถูกตั้งค่าเป็น Secure
หาก AUTH0_BASE_URL
ของแอปพลิเคชันคือ https
การตั้งค่า HttpOnly
จะทำให้แน่ใจว่า JavaScript ฝั่งไคลเอ็นต์ไม่สามารถเข้าถึงคุกกี้ได้ เพื่อลดพื้นที่การโจมตีของการโจมตี XSS
การตั้งค่า SameSite=Lax
จะช่วยลดการโจมตี CSRF เรียนรู้เพิ่มเติมเกี่ยวกับ SameSite โดยการอ่านบล็อกโพสต์ "การเปลี่ยนแปลงพฤติกรรมเบราว์เซอร์ที่กำลังจะมีขึ้น: สิ่งที่นักพัฒนาจำเป็นต้องรู้"
ผู้ให้บริการโฮสติ้งหลายรายเสนอให้แคชเนื้อหาของคุณที่ Edge เพื่อให้บริการข้อมูลแก่ผู้ใช้ของคุณโดยเร็วที่สุด ตัวอย่างเช่น Vercel จะแคชเนื้อหาของคุณบน Vercel Edge Network สำหรับเนื้อหาคงที่และฟังก์ชันไร้เซิร์ฟเวอร์ทั้งหมด หากคุณระบุส่วนหัวแคชที่จำเป็นในการตอบกลับของคุณ
โดยทั่วไป เป็นความคิดที่ดีที่จะแคชการตอบสนองใดๆ ที่ต้องมีการรับรองความถูกต้อง แม้ว่าเนื้อหาของการตอบสนองจะดูปลอดภัยที่จะแคช แต่อาจมีข้อมูลอื่นในการตอบกลับที่ไม่เป็นเช่นนั้น
SDK นี้เสนอเซสชันต่อเนื่องตามค่าเริ่มต้น ซึ่งหมายความว่าการตอบสนองใดๆ ที่อ่านเซสชันนั้นจะมีส่วนหัว Set-Cookie
เพื่ออัปเดตการหมดอายุของคุกกี้ Vercel และผู้ให้บริการโฮสติ้งรายอื่นๆ อาจรวมส่วนหัว Set-Cookie
ในการตอบกลับที่แคชไว้ ดังนั้นแม้ว่าคุณจะคิดว่าเนื้อหาของการตอบกลับสามารถแคชแบบสาธารณะได้ แต่ส่วนหัว Set-Cookie
การตอบกลับไม่สามารถทำได้
ตรวจสอบกฎการแคชของผู้ให้บริการโฮสติ้งของคุณ แต่โดยทั่วไปแล้ว คุณ ไม่ ควรแคชการตอบสนองที่จำเป็นต้องมีการรับรองความถูกต้อง หรือแม้แต่แตะเซสชันเพื่อตรวจสอบการรับรองความถูกต้อง (เช่น เมื่อใช้ withApiAuthRequired
, withPageAuthRequired
หรือแม้แต่ getSession
หรือ getAccessToken
)
ข้อผิดพลาดที่มาจาก Auth0 ในการเรียกกลับของ redirect_uri
อาจประกอบด้วยการป้อนข้อมูลของผู้ใช้ที่สะท้อนผ่าน error
OpenID Connect และพารามิเตอร์แบบสอบถาม error_description
ด้วยเหตุนี้ เราจึงทำการ Escape เบื้องต้นเกี่ยวกับคุณสมบัติ message
, error
และ error_description
ของ IdentityProviderError
แต่ถ้าคุณเขียนตัวจัดการข้อผิดพลาดของคุณเอง คุณ ไม่ ควรแสดง message
แสดงข้อผิดพลาด หรือคุณสมบัติ error
และ error_description
โดยไม่ใช้กลไกการสร้างเทมเพลตที่จะหลีกเลี่ยงข้อความแสดงข้อผิดพลาดสำหรับบริบท HTML อื่น ๆ ก่อน
ด้วย Next.js คุณสามารถปรับใช้แอปพลิเคชัน Next.js ภายใต้เส้นทางย่อยของโดเมนโดยใช้ Base Path และให้บริการเส้นทางสากล (i18n) โดยใช้ Internationalized Routing
หากคุณใช้คุณสมบัติเหล่านี้ URL ของแอปพลิเคชันของคุณจะเปลี่ยนไป และ URL ไปยังเส้นทาง nextjs-auth0 จะเปลี่ยนไป เพื่อรองรับสิ่งนี้ มีที่ต่างๆ ใน SDK ที่คุณสามารถปรับแต่ง URL ได้
ตัวอย่างเช่น หาก basePath: '/foo'
คุณควรเติมสิ่งนี้ไว้หน้า loginUrl
และ profileUrl
ที่ระบุใน Auth0Provider
ของคุณ :
// _app.jsxfunction แอป ({ ส่วนประกอบ, pageProps }) { กลับ (<UserProvider loginUrl="/foo/api/auth/login" profileUrl="/foo/api/auth/me"> <ส่วนประกอบ {...pageProps} /></UserProvider> -
นอกจากนี้ ลิงก์ใด ๆ สำหรับการเข้าสู่ระบบหรือออกจากระบบควรมี basePath
:
<a href="/foo/api/auth/login">เข้าสู่ระบบ</a><br /><a href="/foo/api/auth/logout">ออกจากระบบ</a>
คุณควรกำหนดค่า baseUrl (หรือตัวแปรสภาพแวดล้อม AUTH0_BASE_URL
) ตัวอย่างเช่น:
# .env.localAUTH0_BASE_URL=http://localhost:3000/foo
สำหรับเพจใดๆ ที่ได้รับการปกป้องด้วย Server Side withPageAuthRequired คุณควรอัปเดตพารามิเตอร์ returnTo
โดยขึ้นอยู่กับ basePath
และ locale
หากจำเป็น
// ./pages/my-ssr-page.jsxexport เริ่มต้น MySsrPage = () => <></>;const getFullReturnTo = (ctx) => { // สิ่งที่ต้องทำ: ใช้ getFullReturnTo ตาม ctx.resolvedUrl, ctx.locale // และการตั้งค่า basePath และ i18n ของ next.config.js ของคุณ return '/foo/en-US/my-ssr-page';};ส่งออก const getServerSideProps = (ctx) => { const returnTo = getFullReturnTo(ctx.req); กลับด้วยPageAuthRequired({ returnTo })(ctx);};
นอกจากนี้เรายังมี Auth0 React SDK, auth0-react ซึ่งอาจเหมาะสมกับแอปพลิเคชัน Next.js ของคุณอีกด้วย
โมเดลการรักษาความปลอดภัยของ SPA ที่ใช้โดย auth0-react
แตกต่างจากโมเดลการรักษาความปลอดภัยของเว็บแอปพลิเคชันที่ใช้โดย SDK นี้ กล่าวโดยสรุป SDK นี้ปกป้องหน้าและเส้นทาง API ด้วยเซสชันคุกกี้ (ดู "คุกกี้และความปลอดภัย") ไลบรารี SPA เช่น auth0-react
จะจัดเก็บโทเค็น ID ของผู้ใช้และโทเค็นการเข้าถึงโดยตรงในเบราว์เซอร์ และใช้โทเค็นเหล่านี้เพื่อเข้าถึง API ภายนอกโดยตรง
คุณควรตระหนักถึงผลกระทบด้านความปลอดภัยของทั้งสองรุ่น อย่างไรก็ตาม auth0-react อาจเหมาะกับความต้องการของคุณมากกว่า หากคุณตรงตามสถานการณ์ใดๆ ต่อไปนี้:
คุณกำลังใช้การส่งออก HTML แบบคงที่กับ Next.js
คุณไม่จำเป็นต้องเข้าถึงข้อมูลผู้ใช้ในระหว่างการเรนเดอร์ฝั่งเซิร์ฟเวอร์
คุณต้องการรับโทเค็นการเข้าถึงและเรียก API ภายนอกโดยตรงจากเลเยอร์ส่วนหน้า แทนที่จะใช้เส้นทาง Next.js API เป็นพร็อกซีเพื่อเรียก API ภายนอก
ตามค่าเริ่มต้น SDK จะสร้างและจัดการอินสแตนซ์เดี่ยวเพื่อให้ทำงานตลอดอายุของแอปพลิเคชัน เมื่อทดสอบแอปพลิเคชัน คุณอาจต้องรีเซ็ตอินสแตนซ์นี้ เพื่อให้สถานะของอินสแตนซ์ไม่รั่วไหลระหว่างการทดสอบ
หากคุณใช้ Jest เราขอแนะนำให้ใช้ jest.resetModules()
หลังการทดสอบแต่ละครั้ง หรือคุณสามารถดูที่การสร้างอินสแตนซ์ SDK ของคุณเอง เพื่อให้สามารถสร้างใหม่ระหว่างการทดสอบได้
สำหรับการทดสอบตั้งแต่ต้นจนจบ โปรดดูวิธีที่เราใช้ผู้ให้บริการ OIDC จำลอง
สำหรับการปรับใช้ โปรดดูวิธีที่เราปรับใช้แอปตัวอย่างของเรากับ Vercel
เราขอขอบคุณข้อเสนอแนะและการมีส่วนร่วมใน repo นี้! ก่อนที่คุณจะเริ่มต้น โปรดอ่านข้อมูลต่อไปนี้:
หลักเกณฑ์การสนับสนุนทั่วไปของ Auth0
หลักเกณฑ์จรรยาบรรณของ Auth0
คู่มือการมีส่วนร่วมของ repo นี้
โปรดอย่ารายงานช่องโหว่ด้านความปลอดภัยในตัวติดตามปัญหา GitHub สาธารณะ โปรแกรมการเปิดเผยข้อมูลอย่างมีความรับผิดชอบ ให้รายละเอียดขั้นตอนในการเปิดเผยประเด็นด้านความปลอดภัย
Auth0 เป็นแพลตฟอร์มการรับรองความถูกต้องและการอนุญาตที่ใช้งานง่ายและปรับเปลี่ยนได้ หากต้องการเรียนรู้เพิ่มเติมในการชำระเงิน ทำไมต้อง Auth0?
โครงการนี้ได้รับอนุญาตภายใต้ใบอนุญาต MIT ดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม