OAuth ויישומי מפתחים
רישום וניהול של אפליקציות OAuth ב-Nodaro עם client.developerApps, והחלפת קודים, ביטול אסימונים וקריאת נתונים למסך ההסכמה עם client.oauth.
client.developerApps מנהל את אפליקציות ה-OAuth שבבעלותכם: אפליקציות שמאפשרות למשתמשי Nodaro אחרים לתת לתוכנה שלכם גישה לחשבונות שלהם. המשאב client.oauth מכסה את צד השרת של זרימת OAuth 2.0: הוא מחליף קוד הרשאה באסימון גישה, מבטל אסימונים ומחזיר את הנתונים הציבוריים שמסך ההסכמה מציג. זרימת ההסכמה המלאה מתוארת בדף אפליקציות OAuth.
מתודות
| מתודה | מה היא עושה |
|---|---|
developerApps.list() | רשימת האפליקציות שלכם |
developerApps.get(id) | קריאת אפליקציה אחת |
developerApps.create(input) | רישום אפליקציה וקבלת הסוד שלה |
developerApps.update(id, input) | שינוי אפליקציה |
developerApps.delete(id) | מחיקת אפליקציה |
developerApps.rotateSecret(id) | החלפת הסוד של אפליקציה בסוד חדש |
oauth.exchangeCode(input) | החלפת קוד הרשאה באסימון גישה |
oauth.revoke(token) | ביטול אסימון גישה |
oauth.getAppInfo(clientId, redirectUri?) | קריאת הנתונים הציבוריים של אפליקציה למסך הסכמה |
הרשאות
אפליקציה מבקשת הרשאות, ומשתמש מאשר אותן. השרת מקבל את ההרשאות האלה:
| הרשאה | מה היא מאפשרת |
|---|---|
workflows:read | קריאת תהליכים |
workflows:write | יצירה ושינוי של תהליכים |
workflows:execute | הרצת תהליכים |
jobs:read | קריאת משימות |
assets:read | קריאת דמויות, מיקומים, אובייקטים ונכסים אחרים |
assets:write | יצירה ושינוי של נכסים |
credits:read | קריאת יתרת הקרדיטים |
apps:read | קריאת אפליקציות שפורסמו |
pipelines:read | קריאת פייפליינים |
pipelines:execute | התחלה וביטול של פייפליינים |
pipelines:approve | אישור ודחייה של שלבים בפייפליין |
presets:read | קריאת ערכות שמורות |
workspaces:read | רשימת סביבות העבודה שהמשתמש חבר בהן |
workspaces:write | בחירת סביבת העבודה שבה האפליקציה פועלת |
הדף אפליקציות OAuth מציג מה כתוב במסך ההסכמה לכל הרשאה. קריאה בלי ההרשאה שהיא דורשת נכשלת עם ForbiddenError, והשדה missingScope של השגיאה מציין את ההרשאה החסרה. ראו את הסעיף הרשאות (scopes) והרשאות חסרות בדף אימות.
client.developerApps
רק הבעלים של אפליקציה יכולים לקבל את הפרטים שלה או לשנות אותה. סודות מוחזרים פעם אחת בדיוק.
developerApps.list()
מחזירה את רשימת האפליקציות שלכם.
list(): Promise<{ data: DeveloperApp[] }>const { data: apps } = await client.developerApps.list()
const mine = apps.filter((app) => (app.kind ?? "user") === "user")ל-DeveloperApp יש id, name, description, logoUrl, homepageUrl, redirectUris, allowedOrigins, scopesRequested, clientId, status (active, suspended או pending_review), kind, createdAt ו-updatedAt. הערך של kind הוא "user" באפליקציה שרשמתם. הערכים האחרים, dynamic_mcp, first_party_mcp ו-community_instance, מציינים לקוחות שרשמו את עצמם. רק אפליקציות מסוג "user" נספרות במגבלה של חמש אפליקציות.
developerApps.get(id)
מחזירה אפליקציה אחת. הסוד אף פעם לא כלול בתגובה.
get(id: string): Promise<{ data: DeveloperApp }>מאפיין
סוג
const { data: app } = await client.developerApps.get(appId)developerApps.create(input)
רושמת אפליקציה. התגובה כוללת את clientSecret. שמרו אותו עכשיו: השרת שומר רק גיבוב שלו.
create(input: CreateDeveloperAppInput): Promise<{ data: DeveloperApp & { clientSecret: string } }>מאפיין
סוג
const { data } = await client.developerApps.create({
name: "My integration",
redirectUris: ["https://example.com/oauth/callback"],
scopesRequested: ["workflows:read", "workflows:execute"],
})
console.log(data.clientId, data.clientSecret) // save both nowאפשר לרשום חמש אפליקציות. רישום של אפליקציה שישית נכשל עם 400 limit_reached.
developerApps.update(id, input)
משנה אפליקציה. שלחו רק את השדות שאתם משנים; הכללים של create() חלים על כל אחד מהם.
update(id: string, input: UpdateDeveloperAppInput): Promise<{ data: DeveloperApp }>מאפיין
סוג
await client.developerApps.update(appId, {
redirectUris: ["https://example.com/oauth/callback", "https://staging.example.com/oauth/callback"],
})developerApps.delete(id)
מוחקת אפליקציה.
delete(id: string): Promise<{ success: true }>מאפיין
סוג
await client.developerApps.delete(appId)כשהמזהה לא קיים או שהאפליקציה לא שלכם, המתודה זורקת NotFoundError.
developerApps.rotateSecret(id)
יוצרת סוד לקוח חדש, והסוד הישן מפסיק לעבוד מיד. הסוד החדש מוחזר פעם אחת בלבד.
rotateSecret(id: string): Promise<{ clientSecret: string }>מאפיין
סוג
const { clientSecret } = await client.developerApps.rotateSecret(appId)עדכנו מיד את הסוד בשרת שלכם, כי החלפות של קוד באסימון עם הסוד הישן מפסיקות לעבוד.
client.oauth
נקודות הקצה של OAuth 2.0 שהשרת של האפליקציה שלכם קורא להן. שמות השדות כתובים ב-snake_case, כמו בתקן OAuth.
oauth.exchangeCode(input)
מחליפה את קוד ההרשאה מההפניה של מסך ההסכמה באסימון גישה (POST /v1/oauth/token). ה-SDK מוסיף בשבילכם את grant_type: "authorization_code".
לעולם אל תקראו למתודה הזו מדפדפן. הבקשה כוללת את סוד הלקוח שלכם, שחייב להישאר בשרת שלכם.
exchangeCode(input: {
client_id: string
client_secret: string
code: string
redirect_uri: string
}): Promise<{ access_token: string; token_type: "Bearer"; scope: string; expires_in: number }>מאפיין
סוג
import { createClient, StaticTokenAuth } from "@nodaro/sdk"
const tokens = await client.oauth.exchangeCode({
client_id: process.env.NODARO_CLIENT_ID!,
client_secret: process.env.NODARO_CLIENT_SECRET!,
code: req.query.code as string,
redirect_uri: "https://example.com/oauth/callback",
})
// Act for the user who approved your app
const userClient = createClient({
baseUrl: "https://app.nodaro.ai",
auth: new StaticTokenAuth(tokens.access_token),
})השדה scope מפרט את ההרשאות שאושרו, מופרדות ברווחים, והשדה expires_in הוא משך התוקף של האסימון בשניות.
oauth.revoke(token)
מבטלת אסימון גישה (POST /v1/oauth/revoke, לפי RFC 7009). המתודה תמיד מחזירה { success: true }, גם לאסימון לא מוכר, כי התקן אוסר לחשוף אם אסימון היה תקף.
revoke(token: string): Promise<{ success: true }>מאפיין
סוג
await client.oauth.revoke(accessToken)oauth.getAppInfo(clientId, redirectUri?)
מחזירה את הנתונים הציבוריים של אפליקציה למסך הסכמה (GET /v1/oauth/app-info). המתודה לא צריכה אסימון.
getAppInfo(clientId: string, redirectUri?: string): Promise<OAuthAppInfo>מאפיין
סוג
const info = await client.oauth.getAppInfo(clientId, "https://yourapp.com/oauth/callback")
if (!info.redirectUriRegistered) throw new Error("Unregistered redirect URI")בתגובה יש name, description, logoUrl, homepageUrl, scopesRequested ו-redirectUriRegistered. הערך של redirectUriRegistered הוא true רק לכתובת שרשומה בדיוק כפי שהיא, ו-null כשלא שולחים redirectUri. כך מסך הסכמה יכול לדחות הפניה לכתובת שלא נרשמה, בלי לחשוף את רשימת הכתובות.
שאלות נפוצות
איך רושמים אפליקציית OAuth עם ה-SDK?
קראו ל-client.developerApps.create עם שם, עם כתובת הפניה אחת לפחות ועם ההרשאות שאתם צריכים. התגובה כוללת את clientId ואת clientSecret. הסוד מוצג פעם אחת בלבד, ולכן שמרו אותו מיד.
האם אפשר להחליף קוד OAuth באסימון בדפדפן?
לא. המתודה client.oauth.exchangeCode צריכה את סוד הלקוח שלכם, שחייב להישאר בשרת שלכם. בצעו את ההחלפה בקוד שרת, ותנו לדפדפן רק את מה שהוא צריך.
כמה אפליקציות OAuth אפשר לרשום?
חמש אפליקציות שאתם רושמים בעצמכם. רישום של אפליקציה שישית נכשל עם 400 limit_reached. אפליקציות שרשמו את עצמן, כגון לקוחות MCP, לא נספרות במגבלה.
מה קורה כשמחליפים את סוד הלקוח?
המתודה client.developerApps.rotateSecret יוצרת סוד חדש, והסוד הישן מפסיק לעבוד מיד. הסוד החדש מוחזר פעם אחת בלבד.
דפים קשורים
אפליקציות OAuth
אימות
אימות
שגיאות
עודכן לאחרונה