বিষয়বস্তুতে যান
ডকুমেন্টেশন · যেকোনো OIDC লাইব্রেরি

দ্রুত শুরু: যেকোনো OIDC লাইব্রেরি

Usher একটি মানক OpenID Connect প্রোভাইডার। আপনার ভাষায় যদি একটি সার্টিফায়েড OIDC ক্লায়েন্ট থাকে, তাহলে যা লাগে সবই আপনার কাছে আছে: এটিকে আপনার এনভায়রনমেন্টের ডিসকভারি ডকুমেন্টের দিকে নির্দেশ করুন এবং PKCE সহ অথরাইজেশন কোড ফ্লো ব্যবহার করুন।

সেটিংস

সেটিংমান
ইস্যুয়ারhttps://<handle>.usherid.com
ডিসকভারি URLhttps://<handle>.usherid.com/.well-known/openid-configuration
ফ্লোঅথরাইজেশন কোড (response_type=code)
PKCEবাধ্যতামূলক, code_challenge_method=S256
স্কোপopenid profile email offline_access
ক্লায়েন্ট অথেন্টিকেশনtoken_endpoint_auth_methods_supported-এ যেমন তালিকাভুক্ত

আপনার এনভায়রনমেন্টের হ্যান্ডেল Usher Console-এ, তার ইস্যুয়ারের পাশে আছে। ডেভেলপমেন্ট এনভায়রনমেন্ট একটি র‍্যান্ডম হ্যান্ডেল পায়, যেমন wise-otter-42; প্রোডাকশন এনভায়রনমেন্টের হ্যান্ডেল আপনার বেছে নেওয়া। একটি প্রোডাকশন এনভায়রনমেন্ট এর বদলে আপনার নিজের ডোমেইনেও থাকতে পারে, যেমন login.acme.com: একটি CNAME রেকর্ড দিয়ে ডোমেইনটি Usher-এর দিকে নির্দেশ করার পর, সেটিই হয় এর ইস্যুয়ার।

ডিসকভারি ডকুমেন্ট পড়ুন

আপনার ক্লায়েন্টের প্রয়োজনীয় প্রতিটি এন্ডপয়েন্ট ও কী এখানে তালিকাভুক্ত। আপনার কোডে URL কপি না করে আপনার লাইব্রেরিকে এটি পড়তে দিন।

টার্মিনাল
curl -s https://acme.usherid.com/.well-known/openid-configuration | jq
উত্তর (সংক্ষিপ্ত)
{
  "issuer": "https://acme.usherid.com",
  "authorization_endpoint": "https://acme.usherid.com/api/auth/oauth2/authorize",
  "token_endpoint": "https://acme.usherid.com/api/auth/oauth2/token",
  "userinfo_endpoint": "https://acme.usherid.com/api/auth/oauth2/userinfo",
  "jwks_uri": "https://acme.usherid.com/api/auth/jwks",
  "introspection_endpoint": "https://acme.usherid.com/api/auth/oauth2/introspect",
  "revocation_endpoint": "https://acme.usherid.com/api/auth/oauth2/revoke",
  "end_session_endpoint": "https://acme.usherid.com/api/auth/oauth2/end-session",
  "scopes_supported": ["openid", "profile", "email", "offline_access"],
  "response_types_supported": ["code"],
  "grant_types_supported": ["authorization_code", "refresh_token", "client_credentials"],
  "code_challenge_methods_supported": ["S256"]
}

ফ্লো

মানুষটিকে অথরাইজেশন এন্ডপয়েন্টে পাঠান

একটি র‍্যান্ডম PKCE ভেরিফায়ার তৈরি করুন এবং একটি র‍্যান্ডম state-সহ এমন জায়গায় রাখুন যেখানে কেবল এই ব্রাউজারের সেশন পৌঁছাতে পারে (একটি স্বল্পমেয়াদি, httpOnly কুকি ভালো কাজ করে)। তারপর রিডাইরেক্ট করুন response_type=code, আপনার client_id ও redirect_uri, উপরের স্কোপগুলি, state, এবং আপনার ভেরিফায়ারের S256 code_challenge দিয়ে।

তাঁকে সাইন ইন করতে দিন

এখান থেকে লবি দায়িত্ব নেয়: এটি আপনার অ্যাপের নাম বলে, আপনার এনভায়রনমেন্ট যে সাইন-ইন পদ্ধতিগুলি অনুমতি দেয় সেগুলি দেয়, এবং প্রথমবার সম্মতি চায়।

কলব্যাক যাচাই করুন

Usher code ও state নিয়ে আপনার redirect_uri-তে রিডাইরেক্ট করে। state আপনার সংরক্ষিত মানের সাথে না মিললে উত্তরটি প্রত্যাখ্যান করুন। কোডটি একবার ব্যবহারযোগ্য এবং পাঁচ মিনিট টেকে।

কোডের বদলে টোকেন নিন

আপনার সার্ভার থেকে, কোড ও PKCE ভেরিফায়ার টোকেন এন্ডপয়েন্টে পোস্ট করুন:

টোকেন অনুরোধ
curl -s -X POST https://acme.usherid.com/api/auth/oauth2/token \
-u "$CLIENT_ID:$CLIENT_SECRET" \
-d grant_type=authorization_code \
-d code="$CODE" \
-d redirect_uri=https://app.acme.example/callback \
-d code_verifier="$CODE_VERIFIER"

ID টোকেন যাচাই করুন

jwks_uri-এর কী-এর সাথে এর সিগনেচার যাচাই করুন, এবং দেখুন iss আপনার ইস্যুয়ার, aud আপনার ক্লায়েন্ট ID, আর exp ভবিষ্যতে। আপনার লাইব্রেরি আপনার হয়ে এটি করে; নিশ্চিত করুন যে এটি বন্ধ করা নেই।

Node.js-এ

openid-client উপরের সবকিছু করে, যাচাইসহ:

openid-client
import * as client from 'openid-client'

// discovery: every endpoint and key comes from the issuer
const config = await client.discovery(
  new URL('https://acme.usherid.com'),
  process.env.USHER_CLIENT_ID!,
  process.env.USHER_CLIENT_SECRET!,
)

// 1. send them to the Lobby, with PKCE (S256) and a state to check later
const codeVerifier = client.randomPKCECodeVerifier()
const state = client.randomState()
const url = client.buildAuthorizationUrl(config, {
  redirect_uri: 'https://app.acme.example/callback',
  scope: 'openid profile email offline_access',
  code_challenge: await client.calculatePKCECodeChallenge(codeVerifier),
  code_challenge_method: 'S256',
  state,
})
// keep codeVerifier and state in a short-lived httpOnly cookie, then redirect to url

// 2. back at /callback: swap the code for tokens
const tokens = await client.authorizationCodeGrant(config, new URL(request.url), {
  pkceCodeVerifier: codeVerifier,
  expectedState: state,
})
const { sub, email, name } = tokens.claims()!

অন্যান্য ভাষায়

এই বহুল ব্যবহৃত লাইব্রেরিগুলি সবই মানক OpenID Connect-এ কথা বলে এবং Usher-এর জন্য বিশেষ কিছু ছাড়াই Usher-এর সাথে কাজ করে:

ভাষালাইব্রেরি
PythonAuthlib
Gocoreos/go-oidc, golang.org/x/oauth2-এর সাথে
JavaSpring Security OAuth 2.0 Client
.NETMicrosoft.AspNetCore.Authentication.OpenIdConnect
Rubyomniauth_openid_connect
PHPjumbojett/openid-connect-php

সাইন-ইন থাকা

offline_access স্কোপ থাকলে, টোকেনের উত্তরে একটি রিফ্রেশ টোকেন থাকে। পুরনো অ্যাক্সেস টোকেনের মেয়াদ ফুরোলে নতুন একটি পেতে grant_type=refresh_token দিয়ে এটি ব্যবহার করুন। রিফ্রেশ টোকেন রোটেট হয়: প্রতিবার ব্যবহারে নতুন একটি আসে, আর পুরনোটি কাজ করা বন্ধ করে।

সাইন আউট

প্রথমে আপনার নিজের সেশন মুছুন, তারপর post_logout_redirect_uri (এবং থাকলে id_token_hint) দিয়ে end_session_endpoint-এ রিডাইরেক্ট করুন, যাতে লবিও মানুষটিকে ভুলে যায়।