আপনার নিজের API
একটি অ্যাপ আপনার কোনো API-এর জন্য অ্যাক্সেস টোকেন চাইতে পারে। এটি এমন একটি সাইন করা JWT পায় যার অডিয়েন্স কেবল সেই API, আর কিছু নয়, এবং আপনার API এটি আপনার এনভায়রনমেন্টের প্রকাশিত কী দিয়ে যাচাই করে, Usher-কে কল না করেই। এক API-এর টোকেন অন্য API-তে কোনো কাজে আসে না।
API-এর নাম দিন
Usher Console-এ এনভায়রনমেন্টটি খুলুন, তারপর অ্যাপ্লিকেশন → আপনার API → একটি API যোগ করুন। এটিকে একটি নাম ও একটি আইডেন্টিফায়ার দিন: একটি https:// ঠিকানা, যেমন https://api.example.com, বা একটি URN, যেমন urn:example:api:notes। আইডেন্টিফায়ার হলো যা অ্যাপটি চায় এবং যা টোকেনের aud ক্লেইমে লেখা থাকে (RFC 8707)।
তারপর যে অ্যাপগুলি API-টি কল করে সেগুলিকে এটি দিন: প্রতিটি অ্যাপ্লিকেশনের API। একটি অ্যাপ কেবল সেই API-গুলির টোকেন পায় যা তাকে দেওয়া হয়েছে, সে যা-ই চাক না কেন। একটি API সরিয়ে দিলে এটি আর টোকেন দেয় না; যেগুলি আগেই দেওয়া হয়েছে সেগুলির মেয়াদ কয়েক মিনিটের মধ্যে ফুরিয়ে যায়।
এটি চান
অ্যাপটি তার অথরাইজেশন অনুরোধ ও টোকেন অনুরোধে resource=<identifier> যোগ করে। মোবাইল SDK-গুলি আপনার হয়ে এটি করে:
let usher = UsherClient(configuration: .init(
issuer: URL(string: "https://login.example.com")!,
clientID: "…",
redirectURI: URL(string: "com.example.notes:/oauth/callback")!,
resources: ["urn:example:api:notes"]))
var request = URLRequest(url: URL(string: "https://api.example.com/notes")!)
try await usher.authorize(&request) // Authorization: Bearer <a JWT for the Notes API>val usher = Usher.client(context, UsherConfiguration(
issuer = "https://login.example.com",
clientId = "…",
redirectUri = "com.example.notes:/oauth/callback",
resources = listOf("urn:example:api:notes")))যে অ্যাপ আপনার দুটি API কল করে সেটি একসাথে দুটিই চাইতে পারে; তখন টোকেনের অডিয়েন্সে দুটিই থাকে।
আপনার API-তে এটি যাচাই করুন
প্রতিটি অনুরোধের টোকেনের কোনো কিছুতে ভরসা করার আগে সেটি যাচাই করুন:
- সিগনেচার, আপনার এনভায়রনমেন্টের ডিসকভারি ডকুমেন্টে থাকা
jwks_uri-এর কী-এর সাথে। অ্যালগরিদম কী থেকে নিন, কখনও টোকেনের হেডার থেকে নয়। issহুবহু আপনার এনভায়রনমেন্টের ইস্যুয়ার। এটি আপনার কনফিগারেশনে স্থির রাখুন; কখনও টোকেন থেকে পড়বেন না।aud-এ আপনার API-এর আইডেন্টিফায়ার আছে। (openidস্কোপ থাকলে এতে আপনার এনভায়রনমেন্টের userinfo ঠিকানাও থাকে।)- হেডারের
typহলোat+jwt, যাতে একটি ID টোকেনকে অ্যাক্সেস টোকেন বলে চালানো না যায়। expপেরিয়ে যায়নি। অ্যাক্সেস টোকেন 10 মিনিট টেকে; SDK-গুলি আপনার হয়ে সেগুলি রিফ্রেশ করে।
Node.js-এ, @usher/node এর সবটাই করে:
import { createVerifier } from '@usher/node'
const usher = await createVerifier({
issuer: 'https://login.example.com',
audience: 'urn:example:api:notes',
})
const claims = await usher.accessToken(bearerToken) // throws if any check failsASP.NET Core-এ:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(o =>
{
o.Authority = "https://login.example.com"; // discovery and keys come from here
o.MapInboundClaims = false;
o.TokenValidationParameters = new()
{
ValidIssuer = "https://login.example.com",
ValidAudience = "urn:example:api:notes",
ValidTypes = ["at+jwt"],
};
});টোকেন যা বলে
| ক্লেইম | |
|---|---|
sub | মানুষটি। iss-এর সাথে মিলিয়ে, তাঁকে চিহ্নিত করে রাখার চাবি। |
client_id, azp | যে অ্যাপ চেয়েছে। |
scope | মানুষটি অ্যাপকে যা করার সম্মতি দিয়েছেন। |
email, email_verified | email স্কোপ থাকলে: মানুষটির ঠিকানা, এবং Usher প্রমাণ করেছে কি না যে এটি তাঁরই। |
sid | তাঁর সাইন-ইন সেশন। |
org | organization স্কোপ থাকলে: তাঁর সক্রিয় প্রতিষ্ঠান ও ভূমিকা। |
যাঁদের আপনি আগে থেকেই চেনেন
আপনার API-তে যদি আগে থেকেই অ্যাকাউন্ট থাকে, কেউ প্রথমবার Usher টোকেন নিয়ে এলে আপনি তাঁর অ্যাকাউন্ট খুঁজে নিতে পারেন: email দিয়ে খুঁজুন, কেবল যখন email_verified হলো true, এবং তখন থেকে তাঁর অ্যাকাউন্টে iss ও sub রাখুন। এরপর তাঁকে খুঁজুন iss ও sub দিয়ে, কখনও ইমেল দিয়ে নয়: একটি ঠিকানা হাতবদল হতে পারে, একটি সাবজেক্ট কখনও হয় না।