ข้ามไปยังเนื้อหา
เอกสาร · iOS และ Android

iOS และ Android

แอปเนทีฟพาผู้ใช้ลงชื่อเข้าผ่าน Lobby ของสภาพแวดล้อมในเบราว์เซอร์ของระบบ ไม่ใช่ใน Web View: ผู้ใช้จึงใช้พาสคีย์ รหัสผ่านที่บันทึกไว้ และเซสชัน Usher ของตัวเองได้ และแอปไม่เคยเห็นรหัสผ่าน SDK จัดการส่วนที่เหลือของ OpenID Connect ให้คุณ และเก็บโทเค็นไว้บนอุปกรณ์

ลงทะเบียนแอป

ใน Usher Console ให้เปิดสภาพแวดล้อม แล้วไปที่ แอปพลิเคชัน → แอปพลิเคชันใหม่ → มือถือหรือเดสก์ท็อป กำหนด Redirect แบบ private-use ที่สร้างจากโดเมนที่คุณเป็นเจ้าของ เช่น com.example.notes:/oauth/callback แอปจะได้ Client ID แต่ไม่มีข้อมูลลับ เพราะแอปบนโทรศัพท์เก็บข้อมูลลับไว้อย่างปลอดภัยไม่ได้ จึงใช้ PKCE แทน Console จะแสดงวิธีตั้งค่าสำหรับทั้งสองแพลตฟอร์ม

iOS และ macOS

swift
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)

โทเค็นถูกเก็บไว้ในพวงกุญแจ (Keychain) บนอุปกรณ์นี้เท่านั้น

Android

kotlin
// 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 ในทุกการลงชื่อเข้า รวมถึง Issuer ที่ระบุในการตอบกลับ (RFC 9207)
  • ลายเซ็นของโทเค็น ID กับคีย์ของสภาพแวดล้อม รวมถึง Issuer ผู้รับ และวันหมดอายุของโทเค็น
  • โทเค็นรีเฟรชหมุนเวียน: แต่ละโทเค็นใช้ได้ครั้งเดียว และการลงชื่อออกจะเพิกถอนโทเค็นที่ Usher
  • DPoP หากคุณเปิดใช้: โทเค็นที่ผูกกับคีย์บนอุปกรณ์ ซึ่งไร้ประโยชน์หากถูกคัดลอกไปที่อื่น

หากต้องการเรียก API ของคุณเองด้วยโทเค็นการเข้าถึง ให้ตั้งชื่อ API แล้วขอด้วย resources: ดู API ของคุณเอง