获取应用安装和许可详情

本指南提供了向 Google Workspace Marketplace 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 的组织部门安装了此应用。不再为组织中的所有人安装 Admin 工具。

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}"
}