আপনার অ্যাপের জন্য আইডেন্টিটি, মুক্ত মানদণ্ডের উপর
আপনাকে ভেতরে নিয়ে যায়।
একটি অ্যাকাউন্ট। প্রতিটি দরজা।
Usher Identity OpenID Connect ও OAuth 2.1 দিয়ে মানুষকে আপনার অ্যাপে সাইন ইন করায়: পাসকি, কোড, সোশ্যাল সাইন-ইন ও প্রতিষ্ঠান, আর প্রতিটি এনভায়রনমেন্ট বাকি সবগুলি থেকে আলাদা।
শুরু করা বিনামূল্যে। আপনার নিজের সার্ভারেও চলে।
- OpenID Connect
- OAuth 2.1
- PKCE
- WebAuthn
- JWKS
- DPoP
- TOTP
লবি
এমন একটি সাইন‑ইন পৃষ্ঠা যা জেরা করে না, স্বাগত জানায়।
লবি হলো সেই সাইন-ইন পৃষ্ঠা যা Usher Identity আপনার অ্যাপের জন্য হোস্ট করে। এটি সবসময় বলে মানুষটি কোথায় যাচ্ছেন, এবং যে অ্যাপই তাঁকে পাঠাক না কেন এটি দেখতে একই রকম, তাই মানুষ এতে ভরসা করতে শেখেন।
- আপনি যে পণ্যে যাচ্ছেন তার নাম বলে, প্রতিবার।
- পাসকি, ইমেলে পাঠানো কোড ও ম্যাজিক লিঙ্ক, আর পাসওয়ার্ড কেবল আপনি চাইলে।
- প্রতিটি পণ্যে একই শান্ত পৃষ্ঠা, লাইট বা ডার্ক।
এটি লবির একটি কার্যকর কপি। এটি এই পৃষ্ঠার ভেতরেই চলে, কিছুই পাঠায় না, এবং কাউকে সাইন ইন করায় না।
মানদণ্ড, আটকে রাখা নয়
আপনার স্ট্যাক যে প্রোটোকল আগে থেকেই জানে, সেগুলিতেই কথা বলে।
Usher Identity সবার আগে একটি OpenID Connect প্রোভাইডার। সুবিধা হলে আমাদের SDK ব্যবহার করুন, অথবা যেকোনো ভাষার যেকোনো OIDC লাইব্রেরি। কখনও ছেড়ে গেলে, আপনার অ্যাপগুলিকে মানুষকে সাইন ইন করানোর পদ্ধতি বদলাতে হবে না।
- OIDC Core · Discovery
OpenID Connect
প্রতিটি এনভায়রনমেন্টের জন্য একটি ডিসকভারি ডকুমেন্ট, ID টোকেন ও userinfo। যেকোনো সার্টিফায়েড ক্লায়েন্ট লাইব্রেরি কাজ করে।
- শুধু S256
PKCE সহ OAuth 2.1
প্রতিটি ক্লায়েন্টের জন্য PKCE সহ অথরাইজেশন কোড, পাবলিক হোক বা কনফিডেনশিয়াল। কোনো ইমপ্লিসিট ফ্লো নেই, টোকেন এন্ডপয়েন্টে কোনো পাসওয়ার্ড নেই।
- RS256 · ES256 · EdDSA
JWKS ও কী রোটেশন
প্রতিটি এনভায়রনমেন্ট নিজের কী দিয়ে সাইন করে, যা তার jwks_uri-তে প্রকাশিত। সাইন-ইন করা মানুষদের অসুবিধা না করেই এগুলি রোটেট করুন।
- RFC 7662 · RFC 7009
ইনট্রোস্পেকশন ও রিভোকেশন
একটি টোকেন এখনও বৈধ কি না জিজ্ঞেস করুন, অথবা এখনই সেটি শেষ করুন। Usher Identity প্রতিটি অনুরোধে নিজের সেশন যাচাই করে, তাই একটি সেশন শেষ করলে তা সঙ্গে সঙ্গে কার্যকর হয়।
RP-শুরু করা ও ব্যাক-চ্যানেল লগআউট
আপনার অ্যাপ থেকে সাইন আউট করুন, অথবা কোথাও কোনো সেশন শেষ হলে Usher Identity-কে দিয়ে প্রতিটি অ্যাপকে জানান।
- RFC 9449
DPoP
ক্লায়েন্টের কাছে থাকা একটি কী-এর সাথে টোকেন বেঁধে দিন, যাতে চুরি হওয়া টোকেন একা কোনো কাজে না আসে।
- WebAuthn
পাসকি
প্রথম শ্রেণির, কোনো অ্যাড-অন নয়। মানুষ আঙুলের ছাপ, মুখ বা সিকিউরিটি কী দিয়ে সাইন ইন করে, আর ফিশিং করার মতো কিছুই থাকে না।
- TOTP
অথেন্টিকেটর অ্যাপ
যেকোনো অথেন্টিকেটর থেকে সময়-ভিত্তিক কোড, ব্যাকআপ কোডসহ। দ্বিতীয় ফ্যাক্টরকে ঐচ্ছিক বা বাধ্যতামূলক করুন।
ম্যাজিক লিঙ্ক
ইনবক্স থেকে এক ট্যাপ। স্বল্পমেয়াদি, একবার ব্যবহারযোগ্য, এবং যে এনভায়রনমেন্ট পাঠিয়েছে তার সাথে বাঁধা।
ইমেল কোড
ছয় অঙ্ক, তাঁদের জন্য যাঁরা এক ডিভাইসে সাইন ইন করেন আর অন্য ডিভাইসে ইমেল পড়েন।
সোশ্যাল সাইন-ইন
Google, GitHub, Microsoft ও Apple। একটি অ্যাকাউন্ট কেবল তখনই লিঙ্ক হয় যখন তার ইমেল প্রমাণিত হয়েছে।
প্রতিষ্ঠান ও টিম
আপনার অ্যাপ ব্যবহার করে এমন ব্যবসাগুলির জন্য সদস্য, ভূমিকা ও আমন্ত্রণ।
- শীঘ্রই আসছে
SAML
আপনার গ্রাহকদের কর্মীদের আইডেন্টিটি প্রোভাইডারের সাথে সিঙ্গেল সাইন-অন।
- শীঘ্রই আসছে
SCIM
আপনার গ্রাহকদের ডিরেক্টরি থেকে প্রভিশনিং ও ডিপ্রভিশনিং।
একটি সাইন-ইন কীভাবে কাজ করে
পাঁচটি ধাপ, প্রতিটিই মানদণ্ড মেনে।
এটি OpenID Connect-এর PKCE সহ অথরাইজেশন কোড ফ্লো, যে ফ্লো প্রতিটি গুরুত্বপূর্ণ আইডেন্টিটি প্রোভাইডার ব্যবহার করে। স্ক্রল করে দেখুন।
- 01
আপনার অ্যাপ তাঁদের লবিতে পাঠায়।
কেউ Usher Identity দিয়ে চালিয়ে যান বেছে নিলে, আপনার অ্যাপ তাঁকে আপনার এনভায়রনমেন্টের অথরাইজেশন এন্ডপয়েন্টে রিডাইরেক্ট করে, একটি PKCE চ্যালেঞ্জ ও একটি 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
তাঁরা নিজেদের মতো করে সাইন ইন করেন।
পাসকি, ইমেলে পাঠানো কোড, ম্যাজিক লিঙ্ক, সোশ্যাল অ্যাকাউন্ট বা পাসওয়ার্ড: লবি কেবল সেগুলিই দেয় যা আপনার এনভায়রনমেন্ট অনুমতি দেয়, এবং সবসময় বলে তাঁরা কোন অ্যাপে যাচ্ছেন।
Usher IdentityUsher IdentityAcme-এ যাচ্ছেনআবার স্বাগতম।
পাসকি ব্যবহার করুনআমাকে ইমেলে একটি কোড পাঠান - 03
তাঁরা শেয়ার করতে সম্মতি দেন।
প্রথমবার, মানুষ দেখেন আপনার অ্যাপ কী চাইছে (তাঁদের প্রোফাইল, তাঁদের ইমেল, সাইন-ইন থাকা) এবং একবার সম্মতি দেন।
Acme যা করতে চায়:
- আপনার নাম ও ছবি দেখতে
- আপনার ইমেল ঠিকানা দেখতে
- আপনাকে সাইন-ইন রাখতে
বাতিল করুনঅনুমতি দিন - 04
Usher Identity একটি কোড ফেরত দেয়।
ব্রাউজার আপনার রিডাইরেক্ট URI-তে ফিরে আসে একটি একবার ব্যবহারযোগ্য কোড নিয়ে, যা পাঁচ মিনিট টেকে, এবং আপনার পাঠানো state নিয়ে, যা আপনার অ্যাপ যাচাই করে।
302 Found Location: https://app.acme.example/callback ?code=SplxlOBeZQQYbYS6WxSbIA &state=k3Jx…
- 05
আপনার অ্যাপ এটির বদলে টোকেন নেয়।
আপনার সার্ভার কোড ও PKCE ভেরিফায়ার টোকেন এন্ডপয়েন্টে পাঠায়। ফিরে আসে একটি 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 স্কিমা
- ভাগ করা টেবিলে টেন্যান্টের একটি কলাম নয়: এনভায়রনমেন্টের জন্যই তৈরি একটি স্কিমা, যাতে আর কিছুই নেই।
- নিজস্ব সাইনিং কী
- এক এনভায়রনমেন্টের টোকেন কখনও অন্যটির কী দিয়ে যাচাই হতে পারে না।
- নিজস্ব সিল করা সিক্রেট
- এনভায়রনমেন্টের নিজস্ব ডেটা কী দিয়ে সিল করা, যে কী নিজেও একটি মাস্টার কী দিয়ে মোড়ানো।
- নিজস্ব হোস্ট
- ইস্যুয়াররা Usher-এর সাইট ও Console থেকে আলাদা একটি ডোমেইনে থাকে, শুধু-হোস্ট কুকি নিয়ে।
usheridentity.com
সাইট, Usher Identity Console, Usher Identity অ্যাকাউন্ট
*.usherid.com
প্রতিটি এনভায়রনমেন্টের জন্য একটি ইস্যুয়ার, একটি আলাদা ডোমেইনে
ব্যবহারকারী, সেশন ও টোকেন থাকে এই এনভায়রনমেন্টের জন্য তৈরি একটি স্কিমায়। কোয়েরি চলে সেই স্কিমার উপর, কখনও টেন্যান্ট কলামসহ ভাগ করা টেবিলে নয়।
Acme প্রোডাকশন-এর সিল করা Google ক্লায়েন্ট সিক্রেট Northwind প্রোডাকশন-এ কপি করুন।
ডেভেলপারদের জন্য
আপনার প্রথম সাইন‑ইন, তিনভাবে।
SDK এলে সেটি বসিয়ে দিন, যে OIDC লাইব্রেরিতে আপনি আগে থেকেই ভরসা করেন সেটি ব্যবহার করুন, অথবা ডিসকভারি ডকুমেন্ট পড়ে শুরু করুন। ভেতরে সবই একই প্রোটোকল।
// 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 এজ এবং ইগ্রেস প্রক্সি। কন্টেইনারগুলি নতুন কোনো অধিকার পায় না, আর তাদের ক্ষমতাগুলি সরিয়ে দেওয়া থাকে।
Ubuntu
একটি সাধারণ Ubuntu সার্ভারই যথেষ্ট। Caddy TLS সামলায়, আর সিক্রেটগুলি কন্টেইনারকে ফাইল হিসেবে দেওয়া হয়, কখনও ইমেজের ভেতরে রাখা হয় না।
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সম্পূর্ণ সেলফ-হোস্টিং গাইড আসছে। উপরের কমান্ডগুলি তারই রূপরেখা।
আপনার ব্যবহারকারীদের ভেতরে নিয়ে আসুন।
একটি ওয়ার্কস্পেস ও একটি প্রজেক্ট তৈরি করুন, আর আপনার প্রথম এনভায়রনমেন্ট আসবে তার নিজস্ব ইস্যুয়ার, কী ও লবি নিয়ে।
একবার সাইন ইন করুন। সব জায়গায় স্বাগত।