iOS ও Android
নেটিভ অ্যাপ মানুষকে সাইন ইন করায় সিস্টেম ব্রাউজারে তাঁদের এনভায়রনমেন্টের লবির মাধ্যমে, কখনও ওয়েব ভিউতে নয়: মানুষ তাঁদের পাসকি, সংরক্ষিত পাসওয়ার্ড ও Usher সেশন ব্যবহার করেন, আর অ্যাপ কখনও কোনো পাসওয়ার্ড দেখে না। OpenID Connect-এর বাকি কাজ SDK-গুলি আপনার হয়ে করে, এবং টোকেন ডিভাইসেই রাখে।
অ্যাপটি রেজিস্টার করুন
Usher Console-এ এনভায়রনমেন্টটি খুলুন, তারপর অ্যাপ্লিকেশন → নতুন অ্যাপ্লিকেশন → মোবাইল বা ডেস্কটপ। আপনার মালিকানাধীন কোনো ডোমেইন থেকে তৈরি একটি প্রাইভেট-ইউজ রিডাইরেক্ট দিন, যেমন com.example.notes:/oauth/callback। এটি একটি ক্লায়েন্ট ID পায়, কোনো সিক্রেট নয়: ফোনের একটি অ্যাপ সিক্রেট গোপন রাখতে পারে না, তাই এর বদলে এটি PKCE ব্যবহার করে। Console দুটি প্ল্যাটফর্মেরই সেটআপ দেখায়।
iOS ও macOS
import UsherKit
let usher = UsherClient(configuration: .init(
issuer: URL(string: "https://login.example.com")!,
clientID: "…",
redirectURI: URL(string: "com.example.notes:/oauth/callback")!))
let session = try await usher.signIn()
var request = URLRequest(url: URL(string: "https://api.example.com/notes")!)
try await usher.authorize(&request)টোকেনগুলি কীচেইনে রাখা হয়, কেবল এই ডিভাইসে।
Android
// build.gradle.kts: manifestPlaceholders["usherRedirectScheme"] = "com.example.notes"
val usher = Usher.client(context, UsherConfiguration(
issuer = "https://login.example.com",
clientId = "…",
redirectUri = "com.example.notes:/oauth/callback"))
val session = usher.signIn(Usher.customTabs(activity))সাইন-ইন একটি Custom Tab-এ খোলে। সেশনটি Android Keystore-এর একটি কী দিয়ে এনক্রিপ্ট করা থাকে।
SDK-গুলি যা যাচাই করে
- প্রতিটি সাইন-ইনে PKCE, state ও nonce, এবং উত্তরে উল্লেখ করা ইস্যুয়ার (RFC 9207)।
- আপনার এনভায়রনমেন্টের কী-এর সাথে ID টোকেনের সিগনেচার, এবং এর ইস্যুয়ার, অডিয়েন্স ও মেয়াদ।
- রিফ্রেশ টোকেন রোটেট হয়: প্রতিটি একবার ব্যবহার হয়। সাইন আউট করলে Usher-এ এটি বাতিল হয়।
- DPoP, আপনি চালু করলে: ডিভাইসের একটি কী-এর সাথে বাঁধা টোকেন, অন্য কোথাও কপি করলে অকেজো।
অ্যাক্সেস টোকেন দিয়ে আপনার নিজের API কল করতে, API-এর নাম দিন এবং resources দিয়ে সেটি চান: দেখুন আপনার নিজের API।