واجهات API الخاصة بك
يمكن للتطبيق أن يطلب رمز وصول لإحدى واجهات API الخاصة بك. فيحصل على رمز JWT موقّع جمهوره (audience) تلك الواجهة لا غير، وتتحقق منه واجهتك بالمفاتيح المنشورة لبيئتك، دون الاتصال بـ Usher. والرمز المخصص لواجهة ما لا ينفع مع أخرى.
سمِّ واجهة 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، فلا يمكن تمرير رمز هوية على أنه رمز وصول.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 failsفي ASP.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، لا بالبريد الإلكتروني أبدًا: فالعنوان قد ينتقل إلى شخص آخر، أما المعرّف (subject) فلا يتغير أبدًا.