ข้อมูลประจำตัวสำหรับแอปของคุณ บนมาตรฐานเปิด
เชิญด้านใน
บัญชีเดียว ทุกประตู
Usher Identity พาผู้คนลงชื่อเข้าแอปของคุณด้วย OpenID Connect และ OAuth 2.1 ทั้งพาสคีย์ รหัส การลงชื่อเข้าด้วยบัญชีโซเชียล และองค์กร โดยแยกทุกสภาพแวดล้อมออกจากกันอย่างสิ้นเชิง
เริ่มต้นได้ฟรี และรันบนเซิร์ฟเวอร์ของคุณเองได้ด้วย
- OpenID Connect
- OAuth 2.1
- PKCE
- WebAuthn
- JWKS
- DPoP
- TOTP
Lobby
หน้าลงชื่อเข้าที่ต้อนรับ ไม่ใช่สอบสวน
Lobby คือหน้าลงชื่อเข้าที่ Usher Identity โฮสต์ให้แอปของคุณ หน้านี้บอกเสมอว่าผู้ใช้กำลังจะไปที่ใด และมีหน้าตาเหมือนเดิมไม่ว่าแอปใดจะส่งผู้ใช้มา ผู้คนจึงเรียนรู้ที่จะไว้ใจหน้านี้
- บอกชื่อผลิตภัณฑ์ที่คุณกำลังจะไปทุกครั้ง
- พาสคีย์ รหัสทางอีเมล และลิงก์ลงชื่อเข้า โดยมีรหัสผ่านเฉพาะเมื่อคุณต้องการ
- หน้าที่สงบแบบเดียวกัน ทั้งธีมสว่างและธีมมืด ในทุกผลิตภัณฑ์
นี่คือ Lobby จำลองที่ใช้งานได้จริง ทำงานอยู่ในหน้านี้ ไม่ส่งข้อมูลใดๆ และไม่ได้ลงชื่อเข้าให้ใคร
มาตรฐาน ไม่ใช่การผูกขาด
ใช้โปรโตคอลเดียวกับที่สแต็กของคุณรู้จักอยู่แล้ว
Usher Identity เป็นผู้ให้บริการ OpenID Connect ก่อนสิ่งอื่นใด ใช้ SDK ของเราเมื่อเหมาะกับคุณ หรือใช้ไลบรารี OIDC ใดก็ได้ในภาษาใดก็ได้ หากวันหนึ่งคุณย้ายออก แอปของคุณก็ไม่ต้องเปลี่ยนวิธีลงชื่อเข้าให้ผู้ใช้
- OIDC Core · Discovery
OpenID Connect
เอกสาร Discovery สำหรับแต่ละสภาพแวดล้อม โทเค็น ID และ userinfo ไลบรารีไคลเอ็นต์ที่ได้รับการรับรองตัวใดก็ใช้ได้
- S256 เท่านั้น
OAuth 2.1 พร้อม PKCE
รหัสการอนุญาตพร้อม PKCE สำหรับทุกไคลเอ็นต์ ไม่ว่าจะเป็นแบบสาธารณะหรือแบบลับ ไม่มี implicit flow และไม่มีการส่งรหัสผ่านไปยังเอนด์พอยต์โทเค็น
- RS256 · ES256 · EdDSA
JWKS และการหมุนเวียนคีย์
แต่ละสภาพแวดล้อมลงนามด้วยคีย์ของตัวเอง ซึ่งเผยแพร่ไว้ที่ jwks_uri ของสภาพแวดล้อมนั้น หมุนเวียนคีย์ได้โดยไม่ทำให้ผู้ที่ลงชื่อเข้าอยู่หลุดออก
- RFC 7662 · RFC 7009
Introspection และการเพิกถอน
ถามได้ว่าโทเค็นยังใช้ได้อยู่หรือไม่ หรือยุติโทเค็นทันที Usher Identity ตรวจสอบเซสชันของตัวเองในทุกคำขอ การยุติเซสชันจึงมีผลทันที
การลงชื่อออกที่เริ่มจาก RP และผ่าน Back-channel
ลงชื่อออกจากแอปของคุณ หรือให้ Usher Identity แจ้งทุกแอปเมื่อเซสชันสิ้นสุดลง ไม่ว่าจะที่ใดก็ตาม
- RFC 9449
DPoP
ผูกโทเค็นไว้กับคีย์ที่ไคลเอ็นต์ถือครอง โทเค็นที่ถูกขโมยไปจึงใช้ไม่ได้หากไม่มีคีย์นั้น
- WebAuthn
พาสคีย์
เป็นฟีเจอร์หลัก ไม่ใช่ส่วนเสริม ผู้คนลงชื่อเข้าด้วยลายนิ้วมือ ใบหน้า หรือกุญแจความปลอดภัย และไม่มีสิ่งใดให้ฟิชชิงได้
- TOTP
แอปยืนยันตัวตน
รหัสตามเวลาจากแอปยืนยันตัวตนใดก็ได้ พร้อมรหัสสำรอง กำหนดให้ปัจจัยที่สองเป็นตัวเลือกหรือบังคับใช้ก็ได้
ลิงก์ลงชื่อเข้า
แตะครั้งเดียวจากกล่องจดหมาย มีอายุสั้น ใช้ได้ครั้งเดียว และผูกกับสภาพแวดล้อมที่ส่งลิงก์นั้น
รหัสทางอีเมล
ตัวเลขหกหลัก สำหรับผู้ที่ลงชื่อเข้าบนอุปกรณ์หนึ่งแต่อ่านอีเมลบนอีกอุปกรณ์หนึ่ง
การลงชื่อเข้าด้วยบัญชีโซเชียล
Google, GitHub, Microsoft และ Apple บัญชีจะถูกเชื่อมโยงก็ต่อเมื่อพิสูจน์อีเมลของบัญชีนั้นแล้วเท่านั้น
องค์กรและทีม
สมาชิก บทบาท และคำเชิญ สำหรับธุรกิจที่ใช้แอปของคุณ
- เร็วๆ นี้
SAML
Single Sign-On กับผู้ให้บริการข้อมูลประจำตัวสำหรับพนักงานของลูกค้าคุณ
- เร็วๆ นี้
SCIM
การเพิ่มและนำผู้ใช้ออกโดยอัตโนมัติจากไดเรกทอรีของลูกค้าคุณ
การลงชื่อเข้าทำงานอย่างไร
ห้าขั้นตอน ทุกขั้นตอนเป็นไปตามมาตรฐาน
นี่คือโฟลว์รหัสการอนุญาตพร้อม PKCE ของ OpenID Connect ซึ่งเป็นโฟลว์เดียวกับที่ผู้ให้บริการข้อมูลประจำตัวที่จริงจังทุกรายใช้ เลื่อนดูได้เลย
- 01
แอปของคุณส่งผู้ใช้ไปที่ Lobby
เมื่อมีคนเลือก “ดำเนินการต่อด้วย Usher Identity” แอปของคุณจะเปลี่ยนเส้นทางเขาไปยังเอนด์พอยต์การอนุญาตของสภาพแวดล้อม พร้อม PKCE challenge และค่า state ที่แอปจะตรวจสอบในภายหลัง
GET acme.usherid.com/api/auth/oauth2/authorize ?response_type=code &client_id=acme_web &redirect_uri=https://app.acme.example/callback &scope=openid profile email offline_access &state=k3Jx… &code_challenge=E9Mel…cM &code_challenge_method=S256
- 02
ผู้ใช้ลงชื่อเข้าในแบบของตัวเอง
พาสคีย์ รหัสทางอีเมล ลิงก์ลงชื่อเข้า บัญชีโซเชียล หรือรหัสผ่าน: Lobby เสนอเฉพาะวิธีที่สภาพแวดล้อมของคุณอนุญาต และบอกเสมอว่าผู้ใช้กำลังจะไปที่แอปใด
Usher IdentityUsher Identityกำลังไปที่ Acmeยินดีต้อนรับกลับมา
ใช้พาสคีย์ส่งรหัสทางอีเมล - 03
ผู้ใช้ยินยอมให้แชร์ข้อมูล
ในครั้งแรก ผู้ใช้จะเห็นว่าแอปของคุณขออะไรบ้าง (โปรไฟล์ อีเมล และการลงชื่อเข้าค้างไว้) แล้วยินยอมเพียงครั้งเดียว
Acme ต้องการ:
- ดูชื่อและรูปภาพของคุณ
- ดูที่อยู่อีเมลของคุณ
- ให้คุณลงชื่อเข้าค้างไว้
ยกเลิกอนุญาต - 04
Usher Identity ส่งรหัสกลับมา
เบราว์เซอร์กลับไปยัง Redirect URI ของคุณพร้อมรหัสที่ใช้ได้ครั้งเดียวและมีอายุห้านาที รวมถึงค่า state ที่คุณส่งไป ซึ่งแอปของคุณจะตรวจสอบ
302 Found Location: https://app.acme.example/callback ?code=SplxlOBeZQQYbYS6WxSbIA &state=k3Jx…
- 05
แอปของคุณแลกรหัสเป็นโทเค็น
เซิร์ฟเวอร์ของคุณส่งรหัสและ PKCE verifier ไปยังเอนด์พอยต์โทเค็น แล้วจะได้รับโทเค็น ID ที่บอกว่าผู้ใช้คือใคร โทเค็นการเข้าถึงสำหรับ API ของคุณ และโทเค็นรีเฟรชเพื่อให้ลงชื่อเข้าค้างไว้
POST acme.usherid.com/api/auth/oauth2/token grant_type=authorization_code&code=Splx… &code_verifier=dBjftJeZ4CVP… { "token_type": "Bearer", "access_token": "eyJhbGciOiJSUzI1NiIs…", "id_token": "eyJhbGciOiJSUzI1NiIs…", "refresh_token": "8xLOxBtZp8…", "expires_in": 600 }
แยกส่วนตั้งแต่การออกแบบ
ทุกสภาพแวดล้อมคืออาคารที่เป็นของตัวเอง
สภาพแวดล้อมใช้งานจริงและสภาพแวดล้อมพัฒนาของคุณ รวมถึงของลูกค้ารายอื่นทุกราย ไม่ได้ใช้สิ่งสำคัญใดร่วมกันเลย ความผิดพลาดในที่หนึ่งไม่สามารถอ่าน ลงนามแทน หรือลงชื่อเข้าอีกที่หนึ่งได้
- สคีมา Postgres ของตัวเอง
- ไม่ใช่คอลัมน์ tenant ในตารางที่ใช้ร่วมกัน แต่เป็นสคีมาที่สร้างขึ้นสำหรับสภาพแวดล้อมนั้น และไม่มีสิ่งอื่นอยู่ในนั้น
- คีย์ลงนามของตัวเอง
- โทเค็นจากสภาพแวดล้อมหนึ่งไม่มีทางผ่านการตรวจสอบด้วยคีย์ของอีกสภาพแวดล้อมหนึ่งได้
- ข้อมูลลับที่ปิดผนึกของตัวเอง
- ปิดผนึกด้วยคีย์ข้อมูลของสภาพแวดล้อมนั้นเอง ซึ่งคีย์ข้อมูลก็ถูกห่อหุ้มด้วยคีย์หลักอีกชั้นหนึ่ง
- โฮสต์ของตัวเอง
- Issuer อยู่บนโดเมนที่แยกจากเว็บไซต์และ Console ของ Usher พร้อมคุกกี้แบบ host-only
usheridentity.com
เว็บไซต์ Usher Identity Console และบัญชี Usher Identity
*.usherid.com
หนึ่ง Issuer ต่อหนึ่งสภาพแวดล้อม บนโดเมนที่แยกต่างหาก
ผู้ใช้ เซสชัน และโทเค็นอยู่ในสคีมาที่สร้างขึ้นสำหรับสภาพแวดล้อมนี้ คิวรีทำงานกับสคีมานั้น ไม่เคยทำงานกับตารางที่ใช้ร่วมกันซึ่งมีคอลัมน์ tenant
คัดลอก Client secret ของ Google ที่ปิดผนึกไว้ของ Acme (ใช้งานจริง) ไปยัง Northwind (ใช้งานจริง)
สำหรับนักพัฒนา
การลงชื่อเข้าครั้งแรกของคุณ ได้สามวิธี
ใส่ SDK เมื่อพร้อมใช้งาน ใช้ไลบรารี OIDC ที่คุณไว้ใจอยู่แล้ว หรือเริ่มจากอ่านเอกสาร Discovery เบื้องหลังทั้งหมดคือโปรโตคอลเดียวกัน
// app/layout.tsx
import { UsherProvider } from '@usher/nextjs'
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>
<UsherProvider>{children}</UsherProvider>
</body>
</html>
)
}
// app/page.tsx
import { SignIn, UserButton, currentUser } from '@usher/nextjs'
export default async function Page() {
const user = await currentUser()
return user ? <UserButton /> : <SignIn />
}โฮสต์เอง
เซิร์ฟเวอร์ของคุณ คีย์ของคุณ
ใช้ Usher Identity แบบบริการ หรือรันแพลตฟอร์มเดียวกันบนเซิร์ฟเวอร์ของคุณเอง ด้วยคีย์และฐานข้อมูลของคุณเอง
Docker
ไฟล์ Compose ไฟล์เดียว: แอปต่างๆ, Postgres, Valkey, Caddy ที่ขอบเครือข่าย และพร็อกซีขาออก คอนเทนเนอร์ทำงานโดยไม่ได้รับสิทธิ์เพิ่ม และตัด capability ออกแล้ว
Ubuntu
เซิร์ฟเวอร์ Ubuntu ธรรมดาก็เพียงพอ Caddy จัดการ TLS และข้อมูลลับเป็นไฟล์ที่ส่งให้คอนเทนเนอร์ ไม่เคยฝังไว้ในอิมเมจ
Postgres
Postgres เก็บทุกอย่าง หนึ่งสคีมาต่อหนึ่งสภาพแวดล้อม ทั้ง Postgres และ Valkey อยู่บนเครือข่ายที่ไม่มีเส้นทางออกสู่อินเทอร์เน็ต
# on an Ubuntu server with Docker Engine and the Compose plugin
bash infra/scripts/setup-env.sh --prod \
--domain usher.example --tenant-domain usherid.example
docker compose -f compose.yaml -f compose.prod.yaml \
--profile core --profile apps --profile edge up -d --wait
pnpm db:migrate # applies the database migrationsคู่มือการโฮสต์เองฉบับเต็มกำลังจะมา คำสั่งด้านบนคือโครงร่างของคู่มือนั้น
เชิญผู้ใช้ของคุณเข้าด้านใน
สร้างเวิร์กสเปซและโปรเจกต์ แล้วสภาพแวดล้อมแรกของคุณจะมาพร้อม Issuer คีย์ และ Lobby ที่เป็นของตัวเอง
ลงชื่อเข้าครั้งเดียว ยินดีต้อนรับทุกที่