次の方法で共有


パブリック プロジェクトの拡張機能を開発する

Azure DevOps サービス

Azure DevOps Services では、プライベート プロジェクトとパブリック プロジェクトの両方がサポートされています。 プライベート プロジェクトでは、明示的なアクセス許可を持つ認証されたユーザーへのアクセスが制限されます。 パブリック プロジェクトを使用すると、メンバー以外のユーザーはプロジェクトの内容を読み取り専用の状態で表示できます。

メンバー以外のユーザーには、次のいずれかを指定できます。

  • 匿名: Azure DevOps Services に対して認証されない
  • パブリック: Azure DevOps Services に対して認証されますが、組織のメンバーではありません

メンバー以外のユーザーには認証されたユーザーと同じビューが表示されますが、Azure DevOps では、設定、アクション、ビルド キュー操作などの非パブリック機能が非表示または無効になります。

Important

プロジェクトを作成したり 、プロジェクト の可視性をパブリックに変更したりできるのは、[パブリック プロジェクトの許可] ポリシーが既に有効になっている組織だけです。 このポリシーは、まだ使用していない組織では使用できなくなりました。 Microsoft では、パブリック プロジェクトのすべてのニーズに GitHub を使用することをお勧めします。

メンバー以外のユーザーに拡張機能を表示するかどうかを決定する

拡張機能開発者は、メンバー以外のユーザーが拡張機能のすべてまたは一部を使用できるようにすることができます。 これらのユーザーは、パブリック プロジェクト内からのみ拡張機能を使用できます。 メンバー以外のユーザーが拡張機能を使用できないように選択した場合、変更は必要なく、パブリック プロジェクト内で拡張機能を使用するメンバーに影響はありません。

このチェックリストは、メンバー以外のユーザーが拡張機能を使用できるようにする必要があるかどうかを判断するのに役立ちます。

  • 拡張機能は、メンバー以外のユーザーに関連するデータを表示します
  • 拡張機能がプロジェクト レベルで機能を提供する
  • 拡張機能は、メンバー以外のユーザーがアクセスできる製品領域に貢献します
  • 拡張機能は、拡張機能データ サービスや特定の Azure DevOps Services REST API など、メンバー以外のユーザーがアクセスできない機能を拡張したり依存したりすることはありません。 詳細については、「 制限事項 」セクションを参照してください。

コントリビューションの可視性を構成する

既定では、Azure DevOps には組織のメンバーにのみ投稿が表示されます。 メンバー以外のユーザーにコントリビューションを表示できるようにするには、そのコントリビューションに restrictedTo 属性を設定します。 値は、投稿を表示する必要があるユーザー型を一覧表示する文字列配列です。 指定できる値は次のとおりです。

  • member: 組織のメンバーである認証済みユーザー
  • public: 組織のメンバー ではない 認証済みユーザー
  • anonymous: 認証されていないユーザー

ハブを匿名ユーザー、パブリック ユーザー、およびメンバー ユーザーに表示する

{
    "contributions": [
        {
            "id": "my-hub",
            "type": "ms.vss-web.hub",
            "targets": [
                "ms.vss-code-web.code-hub-group"
            ],
            "restrictedTo": [
                "member",
                "public",
                "anonymous"
            ],
            "properties": {
                ...            
            }
        }
    ]
}

拡張機能マニフェストのルートで restrictedTo 属性を設定することで、拡張機能のすべてのコントリビューションの既定の可視性を設定することもできます。 その後、個々の投稿でこの既定値をオーバーライドできます。

1 つを除くすべての投稿をすべてのユーザーに表示する

{
    "id:": "my-extension",
    "name": "My Extension",
    "version": "1.0.0",
    ...
    "restrictedTo": [
           "anonymous",
           "public",
           "member"
    ],
    "contributions": [
        {
            "id": "my-member-only-widget",
            "type": "ms.vss-dashboards-web.widget",
            "restrictedTo": [
                "member"
            ],
            "properties": {
                ...
            }
        },
        {
            "id": "my-hub",
            "type": "ms.vss-web.hub",
            "targets": [
                "ms.vss-code-web.code-hub-group"
            ],
            "properties": {  
                ...              
            }
        },
        {
            "id": "my-second-hub",
            "type": "ms.vss-web.hub",
            "targets": [
                "ms.vss-work-web.work-hub-group"
            ],
            "properties": {  
                ...              
            }
        }            
    ]
}

メンバー以外のユーザーの制限事項を理解する

投稿の一部またはすべての側面をパブリック ユーザーが利用できるようにする場合は、次の制限事項を考慮してください。

VSS SDK メソッドの制限

コア SDK スクリプト VSS.SDK.jsにより、Web 拡張機能は親フレームと通信して、通信の初期化や現在のユーザー コンテキスト情報の取得などの操作を実行できます。 次の VSS SDK メソッドは、メンバー以外のユーザーをサポートしていません。

  • VSS.getAccessToken()
  • VSS.getAppToken()

拡張データサービスの制約

拡張データ サービスは、プロジェクトに対してスコープ指定またはセキュリティ保護されていないデータを管理するため、メンバー以外のユーザーは、任意の種類の拡張データの読み取りまたは書き込みを行うことはできません。

データ アクセス エラーの処理

呼び出し元ユーザーによるアクセス許可の制限によりデータ サービスがデータにアクセスできない場合、 getValue の呼び出しから返された約束は拒否されます。 reject 関数に渡されるエラーには name プロパティがあり、呼び出しでデータの読み取りまたは書き込みに失敗した理由を理解するのに役立ちます。

VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService) {
    dataService.getValue("someKey").then(function(value) {
         // Process the value
    }, function(error) {
       if (error.name === "AccessCheckException") {
           alert(error.message);
       }
    });
});

REST API アクセス

Azure DevOps Services は、メンバー以外のユーザーに限られた REST API のセットを提供します。 これらの API には、メンバー以外のユーザーが一般的にアクセスできる機能のほとんどの組織レベルおよびプロジェクト レベルの API が含まれます。 この情報は、メンバー以外のユーザーが拡張機能を使用できるようにするかどうかを決定するときに考慮してください。

バージョン 5.0 以降の API を使用することをお勧めします。Azure DevOps では、特定の API はバージョン 5.0 以降のメンバー以外のユーザーのみが使用できるためです。

アイデンティティ参照

ほとんどの Azure DevOps Services REST API は、共通の "コントラクト" を使用してユーザーまたはグループを表します。 メール アドレスなどのメンバー情報を保護するために、Azure DevOps では、匿名ユーザーまたはパブリック ユーザーが REST API を呼び出すときに、 uniqueNameなどの特定のフィールドが省略されます。

ユーザーのアクセス許可を確認します

アクセス許可を使用して、拡張機能の機能を表示するか有効にするかを決定します。 Web 拡張機能コードの Security REST API を使用して、現在のユーザーがタスクを完了するためのアクセス許可を Azure DevOps Services に持っているかどうかを確認します。 このアプローチにより、ユーザーは何かを行う権限があると思い込んでしまうのを防ぎますが、実際にはそうではないことがわかるようになります。

ユーザーがビルドをキューに登録するアクセス許可を持っているかどうかを確認する

この例では、セキュリティ REST クライアントを使用して、ユーザーが現在のプロジェクトのビルドをキューに登録するアクセス許可を持っているかどうかを確認する方法を示します。 既定では、メンバー以外のユーザーにはこのアクセス許可がありません。

VSS.require(["VSS/Service", "VSS/security/RestClient"], function(VSS_Service, Security_RestClient) {
   var client = VSS_Service.getCollectionClient(Security_RestClient.SecurityHttpClient3);
 
   var securityToken = VSS.getWebContext().project.id;
 
   client.hasPermissionsBatch({
    evaluations: [
       {
           "securityNamespaceId": "33344D9C-FC72-4d6f-ABA5-FA317101A7E9",
           "token": securityToken,
           "permissions": 128 /* queue builds */
       }
    ],
    alwaysAllowAdministrators: true
}
).then(function(response) {
     console.log("Can user queue builds in this project? " + response.evaluations[0].value);
  });
});

ダッシュボード ウィジェットの要件を検討する

他の種類のコントリビューションと同様に、 restrictedTo コントリビューション プロパティはダッシュボード ウィジェットのコントリビューションの可視性を制御します。 たとえば、非メンバー ユーザーとメンバー ユーザーの両方にウィジェットを表示するには、次のようにします。

{
  "contributions": [
    {
      "id": "HelloWorldWidget",
      "type": "ms.vss-dashboards-web.widget",
      "targets": [
        "ms.vss-dashboards-web.widget-catalog"
      ],
      "restrictedTo": [
        "member",
        "public",
        "anonymous"
      ],
      "properties": {
          ...
      }
    }
  ]
}

ウィジェットの設定を構成する

メンバー以外のユーザーに対するウィジェットの表示を制御する場合、ダッシュボード フレームワークには、ウィジェット設定用のオプションのオープン フォームストレージメカニズムも用意されています。 2 つのメカニズムは、パブリック プロジェクトのメンバー以外のユーザーがウィジェット設定を使用できるかどうかを示します。

メンバー以外のユーザーに表示される構成可能な設定を持つウィジェットは、次のいずれかのパターンに従う 必要があります 。 これらのパターンに従わないと、ウィジェットがこれらのユーザーに表示されなくなります。

パターン 1: ウィジェットは、プロジェクト固有の設定のみを格納するインスタンスを宣言します

ウィジェットコントリビューションの canStoreCrossProjectSettings プロパティを falseに設定し、ウィジェット設定がプロジェクト固有であることを示します。

{
    "id:": "HelloWorldWidget",
    "type": "ms.vss-dashboards-web.widget",
    ...
    "properties": {
        "canStoreCrossProjectSettings": false
    }
}

パターン 2: ウィジェット インスタンスは、その設定がプロジェクト固有であることを宣言します

個々のウィジェット インスタンスは、設定がプロジェクト固有であり、メンバー以外のユーザーが使用できることを示すこともできます。 設定を保存するときに、ウィジェットは文字列化された JSON 文字列にhasCrossProjectSettingsfalseを設定する必要があります。

{
    "hasCrossProjectSettings": false,
    "hypotheticalWidgetOption": true,
    "backlogLevel": "Stories"
}

ビルドとリリースの要件を検討する

拡張機能がビルド タスクまたはリリース タスクを提供する場合、パブリック プロジェクトのパイプラインからそのタスクを使用するために変更を加える必要はありません。

作業項目の追跡に関する考慮事項を処理する

拡張機能は、パブリック プロジェクトのコンテキストでメンバー以外のユーザーに対しては、変更なしでは機能しません。 これには、作業項目フォーム、その他の作業項目エクスペリエンス、作業項目追跡 REST API との対話が含まれます。

作業項目フォームの制限事項

Azure DevOps では、メンバー以外のユーザーのすべての作業項目の更新または削除が失敗します。

ID の処理

Azure DevOps Services REST API バージョン 5.0 以降では、サービスは ID を文字列ではなく IdentityRef オブジェクトとして返します。 前述のように、Azure DevOps では、メンバー以外のユーザーが API 呼び出しを行った場合、これらのオブジェクトの特定のフィールド ( uniqueName など) は返されません。

API スコープの制限

拡張機能は、現在のユーザーが組織のメンバーでない場合にのみ、プロジェクト スコープの REST API を呼び出すことができます。 Azure DevOps は、プロジェクトにスコープが設定されていない REST API 呼び出しを拒否します。

クエリの制限事項

メンバー以外のユーザーは、作業項目クエリに関連する次の制限に直面します。

  • メンバー以外のユーザーは、ID またはパスでのみ既知のクエリを実行できます
  • クエリのスコープは、現在のプロジェクトに設定する必要があります。 Azure DevOps では、現在のプロジェクトに属していない作業項目は除外されます
  • メンバー以外のユーザーが新しいクエリを作成したり、WIQL クエリを実行したりすることはできません