控制存取

透過 IBM Cloud® App ID,您可以定義哪些使用者和應用程式可以存取特定功能或在應用程式中執行特定動作。 若要控制存取權,您可以建立範圍並將它們分組到角色中。 然後,將角色指派給一或多個應用程式使用者及應用程式。

範圍是應用程式中您向 App ID 登錄以建立存取權的執行時期動作。 角色是範圍的集合,可將各種許可權指派給不同類型的應用程式使用者及應用程式。 例如,如果您的公司雇用開發人員,他們可能會建立一個角色,讓他們可以讀取及寫入程式碼。 如果您採用審核員,則您可能具有僅檢視角色,如下列影像所示。

圖表顯示 App ID 存取控制工作流程的四個步驟:將執行時動作註冊為範圍、將範圍編譯為角色、將角色指派給使用者或應用程式,以及在執行時驗證存取權杖中的範圍
App ID 存取控制如何運作

  1. 使用 App ID登錄應用程式中可能發生的執行時期動作。
  2. 將範圍編譯成群組以形成角色。
  3. 透過將角色指派給使用者或應用程式來控制存取權。
  4. 配置您的應用程式,以驗證在執行時期在使用者存取記號中傳回的範圍 (如果用戶端認證流程,則在應用程式記號中傳回)。

如需應用程式的相關資訊,請參閱 應用程式身分及授權

開始之前

  • 您必須有申請表。
  • 請確定您瞭解每一種類型的角色和範圍如何影響您的應用程式。 因為您正在授與存取權,所以您想要確定您只將它授與需要它的人員。
  • 請注意已備妥的 限制

在主控台中建立作用域

範圍是應用程式中的執行時期動作,可由獲授與必要許可權來完成它們的使用者採取。 當您向 App ID登錄應用程式時,會建立範圍。 如果您的應用程式已登錄,您可以編輯它以包含範圍。

範圍名稱的值必須符合下列需求:

  • 為英數
  • 小寫
  • 開頭不是 appidopenid
  • 不含句點 (.) 或底線 (_) 以外的特殊字元
  • 少於 50 個字元。

若要建立範圍,您可以使用 App ID 使用者介面。

  1. 移至 App ID 儀表板中的 應用程式
  2. 按一下 新增應用程式,以開啟配置畫面。 如果您已有想要使用的認證,請從您要更新之列的「動作」功能表中按一下 編輯
  3. 為您的應用程式提供名稱,並選取您具有的應用程式類型。
  4. 輸入自訂範圍的值,然後按一下加號 (+)。範例範圍值可能是 readwrite
  5. 重複前一個步驟,直到您將所有範圍新增至應用程式為止。
  6. 按一下儲存

使用 API 建立作用域

範圍是應用程式中的執行時期動作,可由獲授與必要許可權來完成它們的使用者採取。 當您向 App ID登錄應用程式時,會建立範圍。 如果您的應用程式已登錄,您可以編輯它以包含範圍。

範圍名稱的值必須符合下列需求:

  • 為英數
  • 小寫
  • 開頭不是 appidopenid
  • 不含句點 (.) 或底線 (_) 以外的特殊字元
  • 少於 50 個字元。

若要建立範圍,您可以使用 App ID 使用者介面。

  1. /scopes 端點提出下列要求來建立範圍。

    curl -X PUT "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/applications/<clientID>/scopes"
    -H "accept: application/json"
    -H "Content-Type: application/json"
    -d "{\ "scopes":\ [\ <scopesObject>}" ]}"
    
    變數 說明
    region 在其中佈建 App ID 實例的地區。 進一步瞭解 可用地區
    tenantID App ID 實例的唯一 ID。 您可以在應用程式的認證中找到此值,因為它們列在服務儀表板的 應用程式 標籤中。
    clientID 您應用程式的唯一識別碼。 您可以在應用程式的認證中找到此值,因為它們列在服務儀表板的 應用程式 中。
    scopesObject 包含您要為應用程式建立之所有範圍的 JSON 物件。
    {:caption =“呼叫 /scopes 端點所需的變數”caption-side =“top”}
  2. 選用: 確認已建立範圍。

    curl -X GET "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/applications/<clientID>/scopes"
    -H "accept: application/json"
    -H "Content-Type: application/json"
    

在主控台中建立角色

角色是一組適用於相同使用者類型的範圍。 例如,如果您建立 admin 角色,則 scope 區段可能容許該角色執行讀取、寫入或建立動作。 但是,如果您建立另一個稱為 viewer 的角色,則獲指派該角色的使用者具有唯讀存取權。 若要建立角色,您可以使用 App ID 使用者介面。

  1. 移至 App ID 儀表板中的 人員資訊和角色> 角色

  2. 按一下 建立角色,以開啟配置畫面。

  3. 為角色提供名稱和說明。

  4. 透過使用您在前一節中建立的範圍,使用下列格式將範圍指派給角色。 按一下 + 以新增範圍。

    <appName>/<scope>
    

    如果您只有一個應用程式,則不需要指定應用程式名稱。 您可以自行新增範圍。

  5. 重複前一個步驟來新增更多範圍。

  6. 按一下儲存

使用 API 建立角色

角色是一組適用於相同使用者類型的範圍。 例如,如果您建立 admin 角色,則 scope 區段可能容許該角色執行讀取、寫入或建立動作。 但是,如果您建立另一個稱為 viewer 的角色,則獲指派該角色的使用者將具有唯讀存取權。 若要建立角色,您可以使用 App ID API。

  1. /roles 端點提出要求以建立角色。

    curl -X POST "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/roles"
    -H "accept: application/json"
    -H "Content-Type: application/json"
    -d { \"name\": \"<roleName>\", \"description\": \"<roleDescription>\", \"access\": [ { \"application_id\": \"<applicationID>\", \"scopes\": [ \"<scopes>" ] } ]}"
    
    變數 說明
    region 在其中佈建 App ID 實例的地區。 進一步瞭解 可用地區
    tenantID App ID 實例的唯一 ID。 您可以在應用程式的認證中找到此值,因為它們列在服務儀表板的 應用程式 標籤中。
    clientID 您應用程式的唯一識別碼。 您可以在應用程式的認證中找到此值,因為它們列在 應用程式中。
    roleName 您要指派給角色的名稱。
    roleDescription 此簡短詞組說明您的角色要執行的動作。
    applicationID 您應用程式的唯一識別碼。 您可以在應用程式的認證中找到此值,因為它們列在 應用程式中。
    scopes 您要套用至角色之所有範圍的 JSON 物件。
    {:caption =“呼叫 /scopes 端點所需的變數”caption-side =“top”}
  2. 選用: 確認已建立角色。

    curl -X GET "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/roles -H "accept: application/json"
    

    回應與以下範例相似:

    {
       "roles": [
       {
          "id": "12345678-1234-1234-1234-123456789012",
          "name": "admin",
          "description": "Can perform administrative tasks.",
          "access": [
             {
             "application_id": "de33d272-f8a7-4406-8fe8-ab28fd457be5",
             "scopes": [
                "create",
                "update",
                "write",
                "read"
             ]
             }
          ]
       }
       {
          "id": "123454231-1234-1234-3334-12345687012",
          "name": "developer",
          "description": "Can perform administrative tasks.",
          "access": [
             {
             "application_id": "de33d272-f8a7-4406-8fe8-ab28fd457be5",
             "scopes": [
                "write",
                "read"
             ]
             }
          ]
       }
       ]
    }
    

在主控台中為使用者指定角色

建立角色之後,您可以將它們指派給使用者的設定檔。 您也可以在建立未來使用者時指派角色。

  1. 移至 App ID 儀表板中的 設定檔和角色> 使用者設定檔
  2. 從您要指派角色之特定使用者列中的「動作」功能表,按一下 指派角色
  3. 從可用角色清單中選取您要新增的一或多個角色。
  4. 選用項目: 如果看不到您要尋找的角色,請按一下 建立角色,並提供資訊以新增另一個選項。
  5. 按一下儲存

使用 API 將角色指派給使用者

建立角色之後,您可以將它們指派給使用者的設定檔。 您也可以在建立未來使用者時指派角色。

  1. 透過使用識別查詢 (例如電子郵件位址) 來搜尋 App ID 使用者,以取得您的使用者 ID。

    curl -X GET "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/Users?query=<identifyingSearchQuery>" \
    -H "accept: application/json" \
    -H "authorization: Bearer <token>"
    

    範例:

    curl -X GET https://us-south.appid.cloud.ibm.com/management/v4/e19a2778-3262-4986-8875-8khjafsdkhjsdafkjh/cloud_directory/Users?query=example@domain.com
    -H "accept: application/json"
    -H "authorization: Bearer eyJraWQiOiIyMDE3MTEyOSIsImFsZ...."
    
  2. 選用: 取得角色 ID 或角色名稱。 如果您已知道您的角色 ID 或名稱,請跳至下一步。

    curl -X GET "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/roles" \
    -H "accept: application/json" \
    -H "authorization: Bearer <token>"
    
  3. 對包含您要指派之角色的 JSON 物件的 /roles 端點提出要求。

    curl -X PUT "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/users/<userID>/roles"
    -H "accept: application/json"
    -H "Content-Type: application/json"
    -d "{ \"roles\": { \"ids\": [ \"<roleIDs>\" ] }}"
    -H "authorization: Bearer <token>"
    

若要從使用者移除角色,請重新提出 PUT 要求,但移除角色 ID。

將使用者角色新增至記號

依預設,使用者記號中不會傳回角色。 建議您根據範圍來配置執行時期決策。 但是,如果您想要使用角色,則可以使用 自訂要求對映 將它們對映至記號。

當您鑑別時,請確定您將 username : client IDpassword : secret 用於您為其配置控制項的應用程式和使用者。

將角色指派給應用程式

建立角色之後,您可以使用 App ID API 將它們指派給應用程式。

應用程式角色僅在用戶端認證流程中有效。

  1. 查詢應用程式清單,以取得您的應用程式用戶端 ID。 您也可以從 App ID 使用者介面的 應用程式 標籤取得此值。

    curl -X GET "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/applications" \
    -H "accept: application/json" \
    -H "authorization: Bearer <token>"
    

    範例:

    curl -X GET https://us-south.appid.cloud.ibm.com/management/v4/e19a2778-3262-4986-8875-8khjafsdkhjsdafkjh/applications
    -H "accept: application/json"
    -H "authorization: Bearer eyJraWQiOiIyMDE3MTEyOSIsImFsZ...."
    
  2. 取得角色 ID。

    curl -X GET "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/roles" \
    -H "accept: application/json" \
    -H "authorization: Bearer <token>"
    
  3. 對包含您要指派之角色的 JSON 物件的 /roles 端點提出要求。 此要求會將現行角色取代為提供的角色 ID。 請確定您正在指派正確的角色。

    curl -X PUT "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/applications/<clientID>/roles"
    -H "accept: application/json"
    -H "Content-Type: application/json"
    -d "{ \"roles\": { \"ids\": [ \"<roleIDs>\" ] }}"
    -H "authorization: Bearer <token>"
    

若要從使用者移除角色,請重新提出 PUT 要求,但移除角色 ID。

在執行時期控制存取

當使用者或應用程式嘗試存取其中一個受保護資源時,App ID會建立並傳回記號。 指派給使用者或應用程式的任何範圍都會在存取記號中傳回。 您可以使用存取記號,在執行時期做出決策。 視您用來保護應用程式的策略而定,您如何驗證範圍可以不同。

使用 Web 應用程式策略時

您可以使用 Web 應用程式策略,利用 hasScope 方法來檢查要求是否包含任何範圍。 當具有已指派角色的使用者登入時,App ID 記號會授與他們存取權,該記號包含角色中定義的所有範圍。 例如,如果您使用 Node.js SDK,您的程式碼 Snippet 看起來會類似下列:

app.get("/protected", passport.authenticate(WebAppStrategy.STRATEGY_NAME), function(req, res){
    if(WebAppStrategy.hasScope(req, "read write")){
              res.json(req.user);
    }
    else {
        res.send("insufficient scopes");
    }
});

使用 API 策略時

您可以透過將範圍變數新增至 API 策略 程式碼,來定義存取特定端點所需的範圍。 例如,如果您有一個以 Node.js 撰寫的應用程式,且您正在使用 Node.js SDK,則程式碼 Snippet 可能如下所示。

app.get("/api/protected",
        passport.authenticate(APIStrategy.STRATEGY_NAME, {
                audience: "myApp",
                scope: "read write update"
        }),
        function(req, res) {
                res.send("Hello from protected resource");
        }
);
了解 API 策略中使用的變數
變數 說明
scope 以空格區隔的必要範圍。
audience 應用程式用戶端 ID。

移除存取權

您可以刪除任何不再需要的範圍或角色。

在控制台中刪除作用域

如果不再需要範圍,您可以使用 App ID 使用者介面來刪除它。

當您刪除範圍時,它會從其相關聯的所有角色中移除。

您可以使用 App ID 服務儀表板來刪除範圍。

  1. 移至 App ID 儀表板中的 應用程式
  2. 從您要編輯其範圍之應用程式列的「動作」功能表中,按一下 編輯
  3. 針對您要移除的範圍,按一下方框中的 X
  4. 按一下儲存

使用 API 刪除作用域

如果不再需要範圍,您可以使用 App ID API 來刪除它。 若要刪除範圍,請從 JSON 物件中移除它,並對 /scopes 端點提出新的 PUT 要求。

當您刪除範圍時,它會從其相關聯的所有角色中移除。

  1. 透過下列對 /scopes 端點的要求來變更或刪除範圍。 請務必將您的範圍 JSON 物件更新為只包含您要容許的範圍。

    curl -X PUT "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/applications/<clientID>/scopes"
    -H "accept: application/json"
    -H "Content-Type: application/json"
    -d "{\ "scopes":\ [\ <scopesObject>" ]}"
    

在主控台中刪除角色

如果您不再需要特定角色,則可以使用 App ID 使用者介面來刪除它。

刪除角色會從目前正在使用該角色的所有使用者及應用程式移除存取權。

  1. 移至服務儀表板中的 人員資訊及角色> 角色
  2. 在您要刪除之角色的列中,從「動作」功能表中選取 刪除
  3. 確認您瞭解刪除角色會影響目前正在使用該角色的所有使用者及應用程式。
  4. 按一下刪除

使用 API 刪除角色

如果您不再需要特定角色,則可以使用 App ID API 來刪除它。

刪除角色會從目前正在使用該角色的所有使用者及應用程式移除存取權。

  1. 取得角色 ID 或角色名稱。 如果您已知道您的角色 ID 或名稱,請跳至下一步。

    curl -X GET "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/roles"
    -H "accept: application/json"
    
  2. 對包含您要指派之角色的 JSON 物件的 /roles 端點提出要求。

    curl -X DELETE "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/roles/<roleID>"
    -H "accept: application/json"