获取应用安装和许可详情

本指南提供了向 Google Workspace Marketplace API 发出请求和从该 API 收到响应的示例,以便您了解如何获取 Google Workspace Marketplace 应用的安装和许可详情。

应用尚未安装

LicenseNotification.list 请求

此请求会调用 licenseNotification.list 方法来检索特定应用的许可通知列表。

GET /appsmarket/v2/licenseNotification/{applicationId}

curl -H "Authorization: Bearer {TOKEN}" https://appsmarket.googleapis.com/appsmarket/v2/licenseNotification/{applicationId}

响应正文

由于应用尚未安装,因此对此请求的响应不包含任何许可通知。

{
  "kind": "appsmarket#licenseNotificationList",
  "nextPageToken": ""
}

单独安装应用

用户 user1@domain1.com 单独从 Google Workspace Marketplace 安装了该应用。

licenseNotification.list 请求

此请求会调用 licenseNotification.list 方法,并检索用户已安装的应用的许可通知列表。

GET /appsmarket/v2/licenseNotification/{applicationId}

curl -H "Authorization: Bearer {TOKEN}" https://appsmarket.googleapis.com/appsmarket/v2/licenseNotification/{applicationId}

响应正文

由于 user1@domain1.com 安装了应用,因此响应中包含一条许可通知。由于在 user1@domain1.com 安装应用时为其预配了新的许可,许可通知包含配置通知

{
  "kind": "appsmarket#licenseNotificationList",
  "notifications": [
    {
      "kind": "appsmarket#licenseNotification",
      "id": "{LICENSE_NOTIFICATION_ID}",
      "applicationId": "{APPLICATION_ID}",
      "customerId": "user1@domain1.com",
      "timestamp": "1641318266998",
      "provisions": [
        {
          "kind": "appsmarket#provisionNotification",
          "editionId": "default_edition",
          "seatCount": "1"
        }
      ]
    }
  ],
  "nextPageToken": "{NEXT_PAGE_TOKEN}"
}

应用由管理员安装

domain1.com 的管理员为组织中的所有人安装了该应用。

userLicense.get 请求

此请求会调用 userLicense.get 方法来获取 user1@domain1.com 的许可状态,并确定他们是否有权使用该应用。

GET /appsmarket/v2/userLicense/{applicationId}/{userId}

curl -H "Authorization: Bearer {TOKEN}" https://appsmarket.googleapis.com/appsmarket/v2/userLicense/{applicationId}/user1@domain1.com

响应正文

由于 domain1.com 由管理员安装了应用,因此响应会返回 user1@domain1.com 的用户许可,其中 enabledtrue,表示 domain1.com 的网域管理员已为此网域激活应用,stateACTIVE,表示 user1@domain1.com 拥有有效的许可,应获准使用该应用。

{
  "kind": "appsmarket#userLicense",
  "enabled": true,
  "state": "ACTIVE",
  "editionId": "default_edition",
  "customerId": "user1@domain1.com",
  "applicationId": "{APPLICATION_ID}",
  "id": "{USER_LICENSE_ID}",
  "userId": "user1@domain1.com"
}

customerLicense.get 请求

此请求会调用 customerLicense.get 方法来获取 domain1.com 的许可状态,以确定其是否有权访问该应用。

GET /appsmarket/v2/customerLicense/{applicationId}/{customerId}

curl -H "Authorization: Bearer {TOKEN}" https://appsmarket.googleapis.com/appsmarket/v2/customerLicense/{applicationId}/domain1.com

响应正文

响应会返回 domain1.com 的客户许可,其中 stateACTIVE,表示客户拥有有效的许可。

{
  "kind": "appsmarket#customerLicense",
  "id": "{CUSTOMER_LICENSE_ID}",
  "applicationId": "{APPLICATION_ID}",
  "customerId": "domain1.com",
  "state": "ACTIVE",
  "editions": [
    {
      "editionId": "default_edition",
      "seatCount": -1
    }
  ]
}

只有管理员为特定用户的组织部门 (OU) 安装了应用

现在,该应用仅由管理员为 user2@domain1.com 的 OU 安装。不再由管理员为组织中的所有人安装。

userLicense.get 请求

此请求会调用 userLicense.get 方法以获取 user3@domain1.com 的许可状态并确定他们是否有权使用该应用。

GET /appsmarket/v2/userLicense/{applicationId}/{userId}

curl -H "Authorization: Bearer {TOKEN}" https://appsmarket.googleapis.com/appsmarket/v2/userLicense/{applicationId}/user3@domain1.com

响应正文

由于该应用仅由管理员为 user2@domain1.com 安装,因此响应会为 user3@domain1.com 返回用户许可,其中 enabledfalse,表示 domain1.com 的网域管理员尚未为此网域激活应用,而 stateACTIVE,表示该用户拥有有效的许可,应获准使用该应用。

{
  "kind": "appsmarket#userLicense",
  "enabled": false,
  "state": "ACTIVE",
  "editionId": "default_edition",
  "customerId": "domain1.com",
  "applicationId": "{APPLICATION_ID}",
  "id": "{USER_LICENSE_ID}",
  "userId": "user3@domain1.com"
}

userLicense.get 请求

此请求会调用 userLicense.get 方法来获取 user2@domain1.com 的许可状态,并确定他们是否有权使用该应用。

GET /appsmarket/v2/userLicense/{applicationId}/{userId}

curl -H "Authorization: Bearer {TOKEN}" https://appsmarket.googleapis.com/appsmarket/v2/userLicense/{applicationId}/user2@domain1.com

响应正文

由于应用仅由管理员为 user2@domain1.com 安装,因此响应会为 user2@domain1.com 返回用户许可,其中 enabledtruestateACTIVE

{
  "kind": "appsmarket#userLicense",
  "enabled": true,
  "state": "ACTIVE",
  "editionId": "default_edition",
  "customerId": "domain1.com",
  "applicationId": "{APPLICATION_ID}",
  "id": "{USER_LICENSE_ID}",
  "userId": "user2@domain1.com"
}

系统会为组织中的所有人删除应用

已为组织中的所有人删除此应用。用户 user1@domain1.com 仍然有权访问该应用,因为他们之前单独安装了该应用。

userLicense.get 请求

此请求会调用 userLicense.get 方法来获取 user2@domain1.com 的许可状态,并确定他们是否有权使用该应用。

GET /appsmarket/v2/userLicense/{applicationId}/{userId}

curl -H "Authorization: Bearer {TOKEN}" https://appsmarket.googleapis.com/appsmarket/v2/userLicense/{applicationId}/user2@domain1.com

响应正文

由于系统已为组织中的所有用户删除该应用,因此响应会针对 user2@domain1.com 返回一个用户许可,其中 enabledfalsestateUNLICENSED,表示此用户所在网域的管理员未向此用户分配该应用的座位。

{
  "kind": "appsmarket#userLicense",
  "enabled": false,
  "state": "UNLICENSED",
  "applicationId": "{APPLICATION_ID}",
  "id": "{USER_LICENSE_ID}",
  "userId": "user2@domain1.com"
}

userLicense.get 请求

此请求会调用 userLicense.get 方法来获取 user1@domain1.com 的许可状态,并确定他们是否有权使用该应用。

GET /appsmarket/v2/userLicense/{applicationId}/{userId}

curl -H "Authorization: Bearer {TOKEN}" https://appsmarket.googleapis.com/appsmarket/v2/userLicense/{applicationId}/user1@domain1.com

响应正文

由于 user1@domain1.com 之前单独安装了该应用,因此仍然有权使用该应用。响应会返回用户许可,其中 enabledtruestateACTIVE

{
  "kind": "appsmarket#userLicense",
  "enabled": true,
  "state": "ACTIVE",
  "editionId": "default_edition",
  "customerId": "user1@domain1.com",
  "applicationId": "{APPLICATION_ID}",
  "id": "{USER_LICENSE_ID}",
  "userId": "user1@domain1.com"
}

上述所有操作的许可通知

licenseNotification.list 请求

licenseNotification.list 方法的请求会检索应用的所有许可通知。

GET /appsmarket/v2/licenseNotification/{applicationId}

curl -H "Authorization: Bearer {TOKEN}" https://appsmarket.googleapis.com/appsmarket/v2/licenseNotification/{applicationId}

响应正文

响应会针对上述执行的所有操作返回许可通知列表。

{
  "kind": "appsmarket#licenseNotificationList",
  "notifications": [
    {
      "kind": "appsmarket#licenseNotification",
      "id": "{LICENSE_NOTIFICATION_ID}",
      "applicationId": "{APPLICATION_ID}",
      "customerId": "user1@domain1.com",
      "timestamp": "1641318266998",
      "provisions": [
        {
          "kind": "appsmarket#provisionNotification",
          "editionId": "default_edition",
          "seatCount": "1"
        }
      ]
    },
    {
      "kind": "appsmarket#licenseNotification",
      "id": "{LICENSE_NOTIFICATION_ID}",
      "applicationId": "{APPLICATION_ID}",
      "customerId": "domain1.com",
      "timestamp": "1641318351038",
      "provisions": [
        {
          "kind": "appsmarket#provisionNotification",
          "editionId": "default_edition",
          "seatCount": "-1"
        }
      ]
    },
    {
      "kind": "appsmarket#licenseNotification",
      "id": "{LICENSE_NOTIFICATION_ID}",
      "applicationId": "{APPLICATION_ID}",
      "customerId": "domain1.com",
      "timestamp": "1641318858349",
      "deletes": [
        {
          "kind": "appsmarket#deleteNotification",
          "editionId": "default_edition",
        }
      ]
    },
  ],
  "nextPageToken": "{NEXT_PAGE_TOKEN}"
}