Hướng dẫn tích hợp EMM

Hướng dẫn này giúp các nhà cung cấp dịch vụ quản lý di động dành cho doanh nghiệp (EMM) tích hợp quy trình thiết lập tự động vào bảng điều khiển của họ. Hãy tiếp tục đọc để tìm hiểu thêm về việc đăng ký và xem lời khuyên về các phương pháp hay nhất để giúp bạn cung cấp DPC (đơn vị kiểm soát chính sách thiết bị) của bạn. Nếu có DPC, bạn sẽ tìm hiểu các phương pháp hay nhất khi cấp phép cho thiết bị cũng như nhận lời khuyên để giúp phát triển và kiểm thử.

Tính năng dành cho quản trị viên CNTT

Sử dụng API khách hàng để giúp quản trị viên CNTT thiết lập quy trình thiết lập tự động ngay trên bảng điều khiển của bạn. Sau đây là một số công việc mà một quản trị viên CNTT có thể hoàn thành trong bảng điều khiển của bạn:

  • Tạo, chỉnh sửa và xoá các cấu hình thiết lập tự động dựa trên chính sách của bạn cho thiết bị di động.
  • Hãy đặt cấu hình mặc định để DPC cấp phép cho các thiết bị trong tương lai mà tổ chức mua hàng.
  • Áp dụng từng cấu hình cho các thiết bị hoặc xoá thiết bị khỏi quy trình đăng ký tự động.

Để tìm hiểu thêm về quy trình thiết lập tự động, hãy đọc bài viết tổng quan.

Điều kiện tiên quyết

Trước khi thêm quy trình thiết lập tự động vào bảng điều khiển EMM, hãy xác nhận rằng giải pháp của bạn hỗ trợ những tính năng sau:

  • Giải pháp EMM của bạn cần cấp phép cho thiết bị chạy Android 8.0 trở lên (Pixel 7.1 trở lên) thuộc quyền sở hữu của công ty ở chế độ được quản lý hoàn toàn. Thiết bị chạy Android 10 trở lên do công ty sở hữu có thể được cấp phép là được quản lý hoàn toàn hoặc có hồ sơ công việc.
  • Vì quy trình thiết lập tự động sẽ tự động tải xuống và cài đặt DPC, nên DPC của bạn phải có sẵn trên Google Play. Chúng tôi duy trì danh sách DPC tương thích mà quản trị viên CNTT có thể định cấu hình bằng API khách hàng hoặc cổng thông tin. Gửi yêu cầu sửa đổi sản phẩm thông qua Cộng đồng nhà cung cấp EMM để thêm DPC của bạn vào danh sách.
  • Khách hàng của bạn cần có tài khoản thiết lập tự động để gọi API khách hàng. Đại lý đối tác sẽ thiết lập tài khoản cho tổ chức của quản trị viên CNTT khi tổ chức này mua thiết bị của họ.
  • Thiết bị phải tương thích với Các dịch vụ của Google dành cho thiết bị di động (GMS) và phải luôn bật Dịch vụ Google Play để quy trình thiết lập tự động hoạt động đúng cách.

Gọi API

Người dùng bảng điều khiển của bạn (sử dụng Tài khoản Google của họ) cho phép các yêu cầu API của bạn đến API khách hàng. Quy trình này khác với hoạt động uỷ quyền mà bạn thực hiện cho các API EMM khác. Hãy đọc bài viết Uỷ quyền để tìm hiểu cách thực hiện việc này trong ứng dụng của bạn.

Xử lý Điều khoản dịch vụ

Người dùng cần chấp nhận Điều khoản dịch vụ (ToS) mới nhất trước khi gọi API. Nếu lệnh gọi API trả về một mã trạng thái HTTP 403 Forbidden và nội dung phản hồi chứa TosError, hãy nhắc người dùng chấp nhận Điều khoản dịch vụ bằng cách đăng nhập vào cổng thiết lập tự động. Ví dụ bên dưới cho thấy một trong những cách mà bạn có thể thực hiện việc này:

Java

// Authorize this method call as a user that hasn't yet accepted the ToS.
final String googleApiFormatHttpHeader = "X-GOOG-API-FORMAT-VERSION";
final String googleApiFormatVersion = "2";
final String tosErrorType =
      "type.googleapis.com/google.android.device.provisioning.v1.TosError";

try {
  // Send an API request to list all the DPCs available including the HTTP header
  // X-GOOG-API-FORMAT-VERSION with the value 2. Import the  exception:
  // from googleapiclient.errors import HttpError
  AndroidProvisioningPartner.Customers.Dpcs.List request =
        service.customers().dpcs().list(customerAccount);
  request.getRequestHeaders().put(googleApiFormatHttpHeader, googleApiFormatVersion);
  CustomerListDpcsResponse response = request.execute();
  return response.getDpcs();

} catch (GoogleJsonResponseException e) {
  // Get the error details. In your app, check details exists first.
  ArrayList<Map> details = (ArrayList<Map>) e.getDetails().get("details");
  for (Map detail : details) {
    if (detail.get("@type").equals(tosErrorType)
          && (boolean) detail.get("latestTosAccepted") != true) {
      // Ask the user to accept the ToS. If they agree, open the portal in a browser.
      // ...
    }
  }
  return null;
}

.NET

// Authorize this method call as a user that hasn't yet accepted the ToS.
try
{
    var request = service.Customers.Dpcs.List(customerAccount);
    CustomerListDpcsResponse response = request.Execute();
    return response.Dpcs;
}
catch (GoogleApiException e)
{
    foreach (SingleError error in e.Error?.Errors)
    {
        if (error.Message.StartsWith("The user must agree the terms of service"))
        {
            // Ask the user to accept the ToS. If they agree, open the portal in a browser.
            // ...
        }
    }
}

Python

# Authorize this method call as a user that hasn't yet accepted the ToS.
tos_error_type = ('type.googleapis.com/'
                  'google.android.device.provisioning.v1.TosError')
portal_url = 'https://partner.android.com/zerotouch'

# Send an API request to list all the DPCs available including the HTTP
# header X-GOOG-API-FORMAT-VERSION with the value 2. Import the exception:
# from googleapiclient.errors import HttpError
try:
  request = service.customers().dpcs().list(parent=customer_account)
  request.headers['X-GOOG-API-FORMAT-VERSION'] = '2'
  response = request.execute()
  return response['dpcs']

except HttpError as err:
  # Parse the JSON content of the error. In your app, check ToS exists first.
  error = json.loads(err.content)
  tos_error = error['error']['details'][0]

  # Ask the user to accept the ToS (not shown here). If they agree, then open
  # the portal in a browser.
  if (tos_error['@type'] == tos_error_type
      and tos_error['latestTosAccepted'] is not True):
    if raw_input('Accept the ToS in the zero-touch portal? y|n ') == 'y':
      webbrowser.open(portal_url)

Nếu ứng dụng API của Google hỗ trợ các lỗi chi tiết (yêu cầu Java, Python hoặc HTTP), hãy đưa tiêu đề HTTP X-GOOG-API-FORMAT-VERSION có giá trị 2 vào yêu cầu của bạn. Nếu ứng dụng của bạn không hỗ trợ các lỗi chi tiết (.NET và các lỗi khác), hãy so khớp thông báo lỗi đó.

Khi chúng tôi cập nhật Điều khoản dịch vụ trong tương lai, nếu bạn làm theo phương pháp này, ứng dụng sẽ hướng dẫn người dùng chấp nhận lại Điều khoản dịch vụ mới.

Quản trị viên CNTT sử dụng cổng thiết lập tự động để quản lý người dùng cho tổ chức của họ — bạn không thể cung cấp dịch vụ này thông qua API khách hàng. Quản trị viên CNTT cũng có thể quản lý thiết bị và cấu hình bằng cổng thông tin. Nếu bạn cần liên kết đến cổng thông tin từ bảng điều khiển hoặc trong tài liệu của mình, hãy sử dụng URL sau:

https://partner.android.com/zerotouch

Bạn nên thông báo cho quản trị viên CNTT rằng họ được nhắc đăng nhập bằng Tài khoản Google của họ.

Đăng ký thiết bị

Thiết lập tự động là một cơ chế đăng ký thiết bị và cũng giống như đăng ký NFC hoặc đăng ký bằng mã QR. Bảng điều khiển của bạn cần hỗ trợ các thiết bị được quản lý và DPC của bạn phải có thể chạy ở chế độ thiết bị được quản lý hoàn toàn.

Thiết lập tự động có trên các thiết bị được hỗ trợ chạy Android 8.0 trở lên. Quản trị viên CNTT phải mua các thiết bị được hỗ trợ từ đại lý đối tác. Bảng điều khiển của bạn có thể theo dõi thiết bị nào của quản trị viên CNTT hiện có để thiết lập tự động bằng cách gọi customers.devices.list.

Sau đây là thông tin tóm tắt về cách hoạt động của quy trình đăng ký:

  1. Một thiết bị sẽ đăng ký với máy chủ Google trong lần khởi động đầu tiên (hoặc sau khi đặt lại về trạng thái ban đầu) để thiết lập tự động.
  2. Nếu quản trị viên CNTT đã áp dụng cấu hình cho thiết bị, thì quy trình đăng ký tự động sẽ chạy trình hướng dẫn thiết lập Android của thiết bị được quản lý toàn bộ và cá nhân hoá màn hình bằng siêu dữ liệu từ cấu hình.
  3. Quy trình thiết lập tự động sẽ tải xuống và cài đặt DPC của bạn qua Google Play.
  4. DPC của bạn nhận được ý định ACTION_PROVISION_MANAGED_DEVICE và cấp phép cho thiết bị.

Nếu không có kết nối Internet, quá trình kiểm tra sẽ diễn ra khi có kết nối. Để tìm hiểu thêm về việc cấp phép thiết bị bằng quy trình thiết lập tự động, hãy xem phần Cấp phép bên dưới.

Cấu hình mặc định

Thiết lập tự động hỗ trợ quản trị viên CNTT nhất khi họ đặt cấu hình mặc định áp dụng cho mọi thiết bị mới mà tổ chức của họ mua. Quảng bá việc đặt một cấu hình mặc định từ bảng điều khiển nếu chưa đặt cấu hình này. Bạn có thể kiểm tra giá trị của customers.configurations.isDefault để tìm hiểu xem tổ chức đã đặt cấu hình mặc định hay chưa.

Ví dụ bên dưới cho thấy cách bạn có thể đặt một cấu hình hiện có làm mặc định:

Java

// Send minimal data with the request. Just the 2 required fields.
// targetConfiguration is an existing configuration that we want to make the default.
Configuration configuration = new Configuration();
configuration.setIsDefault(true);
configuration.setConfigurationId(targetConfiguration.getConfigurationId());

// Call the API, including the FieldMask to avoid setting other fields to null.
AndroidProvisioningPartner.Customers.Configurations.Patch request = service
      .customers()
      .configurations()
      .patch(targetConfiguration.getName(), configuration);
request.setUpdateMask("isDefault");
Configuration results = request.execute();

.NET

// Send minimal data with the request. Just the 2 required fields.
// targetConfiguration is an existing configuration that we want to make the default.
Configuration configuration = new Configuration
{
    IsDefault = true,
    ConfigurationId = targetConfiguration.ConfigurationId,
};

// Call the API, including the FieldMask to avoid setting other fields to null.
var request = service.Customers.Configurations.Patch(configuration,
                                                     targetConfiguration.Name);
request.UpdateMask = "IsDefault";
Configuration results = request.Execute();

Python

# Send minimal data with the request. Just the 2 required fields.
# target_configuration is an existing configuration we'll make the default.
configuration = {
    'isDefault': True,
    'configurationId': target_configuration['configurationId']}

# Call the API, including the FieldMask to avoid setting other fields to null.
response = service.customers().configurations().patch(
    name=target_configuration['name'],
    body=configuration, updateMask='isDefault').execute()

Đang tham chiếu DPC của bạn

Bạn nên sử dụng tên tài nguyên API customers.dpcs.name để xác định DPC của mình và sử dụng tên này trong cấu hình. Tên tài nguyên chứa giá trị nhận dạng duy nhất và không thay đổi của DPC. Gọi customers.dpcs.list để nhận danh sách tất cả các DPC được hỗ trợ. Vì tên tài nguyên cũng bao gồm mã khách hàng, hãy lọc danh sách bằng cách sử dụng thành phần đường dẫn cuối cùng để tìm một thực thể Dpc phù hợp. Ví dụ dưới đây cho thấy cách so khớp DPC của bạn và duy trì để sử dụng sau này trong cấu hình:

Java

// Return a customer Dpc instance for the specified DPC ID.
String myDpcIdentifier = "AH6Gbe4aiS459wlz58L30cqbbXbUa_JR9...xMSWCiYiuHRWeBbu86Yjq";
final int dpcIdIndex = 3;
final String dpcComponentSeparator = "/";
// ...
for (Dpc dpcApp : dpcs) {
    // Because the DPC name is in the format customers/{CUST_ID}/dpcs/{DPC_ID}, check the
    // fourth component matches the DPC ID.
    String dpcId = dpcApp.getName().split(dpcComponentSeparator)[dpcIdIndex];
    if (dpcId.equals(myDpcIdentifier)) {
        System.out.format("My DPC is: %s\n", dpcApp.getDpcName());
        return dpcApp;
    }
}
// Handle the case when the DPC isn't found...

.NET

// Return a customer Dpc instance for the specified DPC ID.
var myDpcIdentifer = "AH6Gbe4aiS459wlz58L30cqbbXbUa_JR9...fE9WdHcxMSWCiYiuHRWeBbu86Yjq";
const int dpcIdIndex = 3;
const String dpcComponentSeparator = "/";
// ...
foreach (Dpc dpcApp in dpcs)
{
    // Because the DPC name is in the format customers/{CUST_ID}/dpcs/{DPC_ID}, check the
    // fourth component matches the DPC ID.
    String dpcId = dpcApp.Name.Split(dpcComponentSeparator)[dpcIdIndex];
    if (dpcId.Equals(myDpcIdentifer))
    {
        Console.WriteLine("Matched DPC is: {0}", dpcApp.DpcName);
        return dpcApp;
    }
}
// Handle the case when the DPC isn't found...

Python

# Return a customer Dpc instance for the specified DPC ID.
my_dpc_id = 'AH6Gbe4aiS459wlz58L30cqb...fE9WdHcxMSWCiYiuHRWeBbu86Yjq'
# ...
for dpc_app in dpcs:
  # Because the DPC name is in the format customers/{CUST_ID}/dpcs/{DPC_ID},
  # check the fourth component matches the DPC ID.
  dpc_id = dpc_app['name'].split('/')[3]
  if dpc_id == my_dpc_id:
    return dpc_app

# Handle the case when the DPC isn't found...

Nếu bạn cần hiện tên DPC trong giao diện người dùng của bảng điều khiển, hãy hiện giá trị được trả về từ customers.dpcs.dpcName.

Cung cấp

Hãy tận dụng cơ hội này để mang đến trải nghiệm tuyệt vời cho người dùng khi cấp phép cho thiết bị. Tên người dùng và mật khẩu phải là tất cả những gì cần thiết để cấp phép cho thiết bị. Hãy nhớ rằng người bán lại có thể trực tiếp gửi thiết bị cho người dùng từ xa. Bao gồm mọi chế độ cài đặt khác, chẳng hạn như máy chủ EMM hoặc đơn vị tổ chức trong customers.configuration.dpcExtras.

Đoạn mã JSON dưới đây cho thấy một phần của cấu hình mẫu:

{
  "android.app.extra.PROVISIONING_LOCALE": "en_GB",
  "android.app.extra.PROVISIONING_TIME_ZONE": "Europe/London",
  "android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED": true,
  "android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE": {
    "workflow_type": 3,
    "default_password_quality": 327680,
    "default_min_password_length": 6,
    "company_name": "XYZ Corp",
    "organizational_unit": "sales-uk",
    "management_server": "emm.example.com",
    "detail_tos_url": "https://www.example.com/policies/terms/",
    "allowed_user_domains": "[\"example.com\", \"example.org\", \"example.net\"]"
    }
}

Quy trình thiết lập tự động sẽ cài đặt và khởi chạy DPC của bạn bằng Android Intent. Hệ thống sẽ gửi các giá trị trong thuộc tính JSON android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE tới DPC của bạn dưới dạng bổ sung trong ý định. DPC của bạn có thể đọc các chế độ cài đặt cấp phép từ PersistableBundle bằng chính các khoá đó.

Nên dùng – hãy sử dụng các ý định bổ sung sau đây để thiết lập DPC:

Không nên – đừng thêm các dữ liệu bổ sung sau đây mà bạn có thể sử dụng trong các phương thức đăng ký khác:

Để tìm hiểu cách trích xuất và sử dụng các chế độ cài đặt này trong DPC, hãy đọc bài viết Cấp phép cho các thiết bị của khách hàng.

Phát triển và kiểm thử

Để phát triển và kiểm thử các tính năng thiết lập tự động của bảng điều khiển, bạn cần có:

  • một thiết bị được hỗ trợ
  • tài khoản thiết lập tự động cho khách hàng

Phát triển và kiểm thử bằng các thiết bị hỗ trợ quy trình đăng ký tự động, chẳng hạn như Google Pixel. Bạn không phải mua thiết bị phát triển từ đối tác đại lý.

Liên hệ với chúng tôi để lấy tài khoản khách hàng thử nghiệm và quyền truy cập vào cổng thiết lập tự động. Gửi email cho chúng tôi từ địa chỉ email công ty được liên kết với một Tài khoản Google. Hãy cho chúng tôi biết nhà sản xuất và số IMEI của một hoặc hai thiết bị, chúng tôi sẽ thêm những thiết bị này vào tài khoản phát triển của bạn.

Hãy lưu ý rằng vì quy trình thiết lập tự động sẽ tự động tải xuống và cài đặt DPC, nên DPC của bạn phải có sẵn trên Google Play thì bạn mới có thể kiểm thử cấp phép. Bạn không thể kiểm tra bằng phiên bản phát triển của DPC.

Dịch vụ hỗ trợ dành cho quản trị viên CNTT

Nếu bạn cần trợ giúp quản trị viên CNTT trong giao diện của bảng điều khiển hoặc tài liệu của mình, hãy xem bài viết Thiết lập tự động cho quản trị viên CNTT để được hướng dẫn. Bạn cũng có thể hướng người dùng bảng điều khiển của mình đến bài viết đó trong trung tâm trợ giúp.

Tài liệu đọc thêm

Hãy đọc các tài liệu sau đây để biết cách tích hợp quy trình thiết lập tự động vào bảng điều khiển của bạn: