開発者ユーザーグラフと招待

対象読者:組織、プロジェクト、チームアクセスを設計する backend と console 開発者。

Alpha account の user_typedeveloper または system_admin です。developer は登録、ログイン、organization 作成、project 作成、Project Key 発行を行います。Project Key は Public API の GET /v1/sdk/configPOST /v1/feedback/reports、consent で制限された attachment route を使えますが、/admin/v1/* には access できません。account type と tenant authorization は独立しており、organization と project への access は常に membership によって決まります。

最小例

flowchart LR
  User["authenticated user"] --> UserType["user_type"]
  UserType --> Developer["developer"]
  UserType --> SystemAdmin["system_admin"]
  User --> OrgMembership["organization membership"]
  User --> ProjectMembership["project membership"]
  OrgMembership --> Organization["organization"]
  ProjectMembership --> Project["project"]
  Organization --> Project["project"]
  SystemAdmin --> SystemUsers["GET /admin/v1/system/users"]
  Project --> ProjectKey["Project Key"]
  ProjectKey --> PublicAPI["Public API SDK config / feedback write"]
  Project --> FeedbackReport["feedback_report"]

AdminUser contract の user_typesystem_admindeveloper、user status は activedisabledpending_verification です。system administrator に追加される system-wide capability は read-only の /admin/v1/system/users だけです。これは tenant role ではなく、organization や project を自動的に公開しません。system administrator が tenant に参加した場合、response には実際の membership role が入り、membership がなければその tenant を指定した request は 403 になります。

Organization と Project response は membership role を必ず含み、値は owneradmindeveloperqaviewer だけです。member account の user_typedeveloper または system_admin ですが、その role は変わりません。E2E matrix は developer A が org/project/key を作成し、developer B が招待で参加して project を読めること、developer C が拒否されることを検証します。

GET /admin/v1/developer-graph は current user と、visible organization、project、organization membership、direct project membership をまとめて返す navigation aggregate です。canonical list GET ではなく、limit/offset を受け取らず、{ items, offset, limit, total, has_more } envelope も使いません。個別の organization、project、member collection endpoint は pagination contract を使います。

招待は canonical Alpha management API の一部です。Developer Console は /admin/v1/organizations/{organization_id}/developer-invitations で organization invitation を作成・一覧化します。招待側は一度だけ表示される token のみをコピーし、credential を含む link は作りません。受信者は credential を含まない /invitations/accept を開き、必要なら login または register を済ませ、戻ったページで token を貼り付けます。token は現在の form 内だけに存在し、JSON body で /admin/v1/invitations/accept に送ります。URL、return_to、browser storage、log に入れてはいけません。

project_id がない招待は organization membership を作成し、developer graph の memberships に表示されます。project_id がある招待は project membership のみを作成し、project_memberships に表示されます。受諾した developer はその project、feedback、attachments、comments にアクセスできますが、organization detail は読めず、organization member list にも表示されません。

Organization-scoped invitation:

curl -X POST "$ADMIN_API/admin/v1/organizations/$ORG_ID/developer-invitations" \
  -H "Authorization: Bearer $TOKEN_A" \
  -H "Content-Type: application/json" \
  -d '{"email":"developer-b@example.com","role":"developer"}'

curl -X POST "$ADMIN_API/admin/v1/invitations/accept" \
  -H "Authorization: Bearer $TOKEN_B" \
  -H "Content-Type: application/json" \
  -d '{"token":"enb_inv_..."}'

Project-scoped invitation:

curl -X POST "$ADMIN_API/admin/v1/projects/$PROJECT_ID/invitations" \
  -H "Authorization: Bearer $TOKEN_A" \
  -H "Content-Type: application/json" \
  -d '{"email":"developer-d@example.com","role":"qa"}'

curl -X POST "$ADMIN_API/admin/v1/invitations/accept" \
  -H "Authorization: Bearer $TOKEN_D" \
  -H "Content-Type: application/json" \
  -d '{"token":"enb_inv_..."}'

project-scoped invitation を受諾した後、招待された developer は GET /admin/v1/projects/{project_id} にアクセスできますが、GET /admin/v1/organizations/{organization_id}403 になります。project invitation list と revoke response には accept_token を含めず、create response だけが一度だけ表示します。revoke response には revoked_by_user_idrevoked_at が含まれ、invitation audit metadata に token value を含めてはいけません。

Alpha verification matrix では Developer B を organization-scoped invitation、Developer D を project-scoped invitation、Developer C を denied user として検証します。

よくある間違い

次のステップ

ローカル経路が動かない場合は トラブルシューティングを使ってください。