Xác thực cho GDK Glassware

Nếu Phần mềm thuỷ tinh GDK của bạn cần xác thực người dùng với một dịch vụ web, GDK cung cấp một API cho phép người dùng nhập thông tin xác thực khi họ lắp đặt Đồ thuỷ tinh của bạn.

Bằng việc sử dụng API này, bạn mang đến cho bạn một người dùng nhất quán trải nghiệm của người dùng Glass và tránh được chi phí khi triển khai các giao thức xác thực tuỳ chỉnh.

Tạo tài khoản dịch vụ API của Google

Khi xác thực được thiết lập đúng cách, máy chủ phụ trợ của ứng dụng web sử dụng Mirror API để đẩy người dùng thông tin tài khoản đến Glass sau khi chúng xác thực với dịch vụ của bạn.

Để truy cập API này, hãy tạo một dự án Google API rồi sau đó tạo mã ứng dụng khách cho "tài khoản dịch vụ" (và không phải là "ứng dụng web"). Theo thông qua tài khoản dịch vụ, người dùng không phải cấp riêng quyền truy cập ứng dụng để đẩy thông tin đăng nhập của họ vào Glass và sẽ không bạn sẽ thấy cả trang quyền OAuth và phương thức xác thực của riêng mình .

Cách tạo tài khoản này:

  1. Truy cập Google Developers Console.
  2. Nhấp vào nút Create Project (Tạo dự án) rồi nhập thông tin theo yêu cầu.
  3. Sau khi tạo dự án, hãy ghi lại Project Number (Số dự án), mà bạn sẽ cần đến sau này.
  4. Trong API & xác thực, nhấp vào API rồi bật Google Mirror API cho dự án mới của bạn.
  5. Trong API & xác thực, nhấp vào Thông tin đăng nhập, sau đó nhấp vào Tạo ứng dụng mới mã nhận dạng. Đánh dấu vào hộp có nhãn Service account (Tài khoản dịch vụ) để tạo OAuth 2.0 mới mã ứng dụng khách của dự án.
  6. Cửa sổ bật lên sẽ thông báo cho bạn rằng khoá riêng tư đang được tải xuống vào máy tính của bạn và cung cấp cho bạn mật khẩu của khoá riêng tư đó. Sau khi đóng cửa sổ này, bạn sẽ không thể tải tệp riêng tư này xuống hoặc xem lại mật khẩu. Nếu chúng bị mất, bạn phải tạo một một.
  7. Ghi lại địa chỉ email của tài khoản dịch vụ mà bạn sẽ cần đến để thực hiện lệnh gọi API vào lúc khác.

Cung cấp siêu dữ liệu về Đồ thuỷ tinh của bạn

Khi đã sẵn sàng gửi Đồ thuỷ tinh của mình, bạn sẽ cần cung cấp sau đây. Việc này cho phép chúng tôi thiết lập Glassware của bạn để được xác thực chính xác khi triển khai.

  • URL xác thực, người dùng được chuyển hướng đến khi họ bật Đồ thuỷ tinh của bạn trong MyGlass.
  • Loại tài khoản (chuỗi mà bạn sẽ sử dụng khi gọi phương thức API Android AccountManager trên thiết bị Glass)
  • package name (Tên gói) của ứng dụng từ AndroidManifest.xml
  • Mã dự án Google API ở dạng số của dự án bạn đã tạo phía trên
  • APK để tải lên MyGlass. Để thử nghiệm, bạn chỉ cần cung cấp APK này một lần để xử lý lần tải xuống ban đầu khi Đồ thuỷ tinh của bạn bị được bật từ MyGlass; sau đó, bạn có thể lặp lại và gỡ lỗi cục bộ bằng cách ghi đè APK trên thiết bị. Xin lưu ý rằng APK này cần phải đáp ứng các tiêu chí sau:
    • Giá trị này phải căn chỉnh theo mã bưu chính.
    • Bạn không được thay đổi tên gói hoặc chữ ký riêng tư sau đó (trình quản lý gói Android không cho phép nâng cấp nếu một trong hai thay đổi này).
    • Kích thước tệp phải nhỏ hơn 50 megabyte.
    • Tệp này phải được biên dịch bằng phiên bản GDK mới nhất.

Triển khai quy trình xác thực

Sơ đồ dưới đây thể hiện quy trình xác thực cơ bản cho Đồ thuỷ tinh GDK:

Cách triển khai quy trình xác thực:

  1. Khi người dùng bật Đồ thuỷ tinh của bạn trong MyGlass, họ sẽ được chuyển hướng vào URL xác thực của bạn. Các yêu cầu này bao gồm một tham số truy vấn có tên userToken mà bạn cần sử dụng sau này.

  2. Người dùng nhập thông tin xác thực của họ trên trang xác thực của bạn.

  3. Máy chủ của bạn xác thực thông tin đăng nhập của người dùng. Nếu thông tin đăng nhập hợp lệ, thực hiện lệnh gọi API Mirror API đến phương thức mirror.accounts.insert. Phương thức này yêu cầu bạn chỉ định https://www.googleapis.com/auth/glass.thirdpartyauth phạm vi khi bạn tạo Đối tượng dịch vụ phản chiếu. Ví dụ về cách thực hiện lệnh gọi API này bằng cách sử dụng HTTP hoặc Java được trình bày trong các ví dụ tạo tài khoản.

    Các thông số và nội dung yêu cầu mà bạn cung cấp bên dưới thể hiện cùng một thông tin bạn sẽ cung cấp cho AccountManager của Android nếu bạn tạo tài khoản ngay trên thiết bị.

    Tên tài sản Giá trị Mô tả
    features[] danh sách chuỗi Danh sách các tính năng (xem AccountManager.hasFeatures).
    password string Mật khẩu của tài khoản (xem AccountManager.getPassword). Bạn nên mà bạn không lưu trữ mật khẩu thực của người dùng trường này mà thay vào đó hãy sử dụng nó để lưu trữ các tệp riêng tư chẳng hạn như mã làm mới.
    userData[] danh sách đối tượng Một hoặc nhiều cặp dữ liệu người dùng được liên kết với tài khoản (xem AccountManager.getUserData).
    userData[].key string Khoá liên kết với một khoá-giá trị dữ liệu người dùng cụ thể ghép nối.
    userData[].value string Giá trị được liên kết với một khoá-giá trị dữ liệu người dùng cụ thể ghép nối.
    authTokens[] danh sách đối tượng Một hoặc nhiều mã thông báo xác thực được liên kết với tài khoản (xem AccountManager.getAuthToken).
    authTokens[].type string Loại mã thông báo xác thực.
    authTokens[].authToken string Mã thông báo xác thực.
  4. Khi nhận được yêu cầu mirror.account.insert, Mirror API sẽ đẩy tài khoản vào(các) thiết bị Glass của người dùng, tại đó bạn hiện có thể truy cập tài khoản bằng cách sử dụng lớp AccountManager.

Hãy làm theo các nguyên tắc sau để triển khai quy trình xác thực thân thiện với người dùng:

  • Tối ưu hoá quy trình của bạn cho thiết bị di động.
  • Nếu quy trình của bạn có phạm vi và người dùng huỷ phạm vi, hãy thiết kế sao cho phù hợp .
  • Đảm bảo phạm vi mà bạn yêu cầu thực sự đang được dùng trong Đồ thuỷ tinh.
  • Nếu có thể kết nối tài khoản người dùng, hãy đảm bảo rằng bạn đã kết nối tài khoản đó.
  • Nếu có thể, dữ liệu người dùng nên sao lưu lên đám mây.

Để duy trì tính nhất quán trong quá trình xác thực Đồ thuỷ tinh, hãy sử dụng một trong các cách sau luồng xác thực:

Phản chiếu hoặc kết hợp mà không cần tài khoản

  1. Sau khi bật/tắt trong MyGlass, URL xác thực của bạn sẽ mở trong một cửa sổ bật lên.
  2. Thao tác này sẽ trực tiếp chuyển người dùng đến các phạm vi để chấp nhận.
  3. Sau khi người dùng chấp nhận hoặc huỷ phạm vi, hãy đóng cửa sổ bật lên.

Phản chiếu bằng tài khoản

  1. Sau khi bật/tắt trong MyGlass, URL xác thực của bạn sẽ mở trong một cửa sổ bật lên.
    • Nếu người dùng đã đăng nhập vào dịch vụ của bạn, hãy chuyển trực tiếp người dùng đó vào phạm vi.
    • Nếu người dùng chưa đăng nhập, hãy hiển thị các trường đăng nhập, cho phép họ đăng nhập vào dịch vụ của bạn, sau đó gửi chúng đến phạm vi.
    • Nếu người dùng chưa có tài khoản, hãy cung cấp đường liên kết để tạo tài khoản. Người dùng phải có cách thức để tạo tài khoản như một phần của của quy trình cài đặt.
  2. Người dùng chấp nhận các phạm vi.
    • Nếu Đồ thuỷ tinh của bạn có cài đặt có thể định cấu hình, hãy gửi người dùng đến với các giá trị mặc định hợp lý được chọn.
    • Nếu Đồ thuỷ tinh của bạn không có cài đặt có thể định cấu hình, hãy chuyển người dùng tới trang xác nhận. Đóng cửa sổ bật lên nếu không có cấu hình bổ sung nào là bắt buộc.

Kết hợp với tài khoản

  1. Sau khi bật/tắt trong MyGlass, URL xác thực của bạn sẽ mở trong một cửa sổ bật lên.
    • Nếu người dùng đã đăng nhập vào dịch vụ của bạn, hãy chuyển trực tiếp người dùng đó vào phạm vi.
    • Nếu người dùng chưa đăng nhập, hãy hiện các trường đăng nhập, cho phép họ ký rồi gửi đến phạm vi.
    • Nếu người dùng chưa có tài khoản, hãy cung cấp đường liên kết để tạo tài khoản.
  2. Người dùng chấp nhận các phạm vi.
  3. Gửi yêu cầu đến Mirror API để chèn Tài khoản GDK.
    • Đưa người dùng đến trang cài đặt đã chọn chế độ mặc định hợp lý.
    • Gửi cho người dùng một trang xác nhận. Đóng cửa sổ bật lên nếu không có thêm là bắt buộc.

Phản chiếu hoặc kết hợp với tài khoản và phạm vi tuỳ chỉnh

  1. Sau khi bật/tắt trong MyGlass, URL xác thực của bạn sẽ mở trong một cửa sổ bật lên.
    • Nếu người dùng đã đăng nhập vào dịch vụ của bạn, hãy gửi người dùng đến phạm vi nội bộ
    • Nếu người dùng chưa đăng nhập, hãy hiện các trường đăng nhập, cho phép họ ký rồi gửi đến phạm vi nội bộ
    • Nếu người dùng chưa có tài khoản, hãy cung cấp đường liên kết để tạo tài khoản.
  2. Khi người dùng chấp nhận phạm vi tuỳ chỉnh của bạn, hãy chuyển người dùng đến phạm vi của Google.
  3. Gửi yêu cầu đến Mirror API để chèn Tài khoản GDK.
    • Đưa người dùng đến trang cài đặt đã chọn chế độ mặc định hợp lý.
    • Gửi cho người dùng một trang xác nhận. Đóng cửa sổ bật lên nếu không có thêm là bắt buộc.

Phản chiếu hoặc kết hợp với ứng dụng Android/iPhone

  1. Sau khi bật/tắt trong MyGlass, URL xác thực của bạn sẽ mở trong một cửa sổ bật lên.
  2. Thao tác này sẽ trực tiếp chuyển người dùng đến các phạm vi để chấp nhận.
  3. Sau khi người dùng chấp nhận phạm vi:
    • Nếu người dùng có ứng dụng đồng hành và đã được xác thực, hãy đóng cửa sổ bật lên cửa sổ.
    • Nếu không, hãy đưa người dùng đến quảng cáo xen kẽ hướng dẫn họ tải xuống ứng dụng từ cửa hàng Google Play hoặc cửa hàng iOS
  4. Sau khi cài đặt ứng dụng và xác thực, hãy đóng cửa sổ bật lên

GDK và không có tài khoản

Bật/tắt Phần mềm thuỷ tinh trong MyGlass là tất cả những gì cần thiết cho quy trình này.

GDK với tài khoản

  1. Sau khi bật/tắt trong MyGlass, URL xác thực của bạn sẽ mở trong một cửa sổ bật lên.
    • Nếu người dùng đã đăng nhập vào dịch vụ của bạn, hãy chuyển người dùng đến màn hình xác nhận.
    • Nếu người dùng chưa đăng nhập, hãy hiển thị các trường đăng nhập, cho phép họ đăng nhập rồi gửi chúng đến màn hình xác nhận.
    • Nếu người dùng chưa có tài khoản, hãy cung cấp đường liên kết để tạo tài khoản.
  2. Người dùng chấp nhận các phạm vi.
  3. Gửi yêu cầu đến Mirror API để chèn Tài khoản GDK.
  4. Hiển thị màn hình xác nhận và đóng màn hình sau khi hiển thị màn hình trong một khoảng thời gian ngắn.

Ví dụ về cách tạo tài khoản

Dùng thư viện ứng dụng cho Mirror API khi có thể. Thao tác này giúp gọi mirror.accounts.insert để tạo tài khoản dễ dàng hơn.

Ví dụ về HTTP thô

Ví dụ dưới đây chỉ đưa ra URL của yêu cầu và một ví dụ về Nội dung JSON mà nó dự kiến. Tạo yêu cầu HTTP thô thay mặt cho dịch vụ tài khoản của bạn phức tạp hơn nhiều (xem Sử dụng OAuth 2.0 cho ứng dụng từ máy chủ đến máy chủ để biết toàn bộ chi tiết), vì vậy bạn nên sử dụng một trong các API của Google thư viện ứng dụng nếu có thể để làm việc này dễ dàng hơn.

Phương thức và URL yêu cầu:

POST https://www.googleapis.com/mirror/v1/accounts/{userToken}/com.example.myapp/username%40email.com

Nội dung yêu cầu:

{
    "features": ["a", "b", "c"],
    "userData": [
        { "key": "realName", "value": "Rusty Shackleford" },
        { "key": "foo", "value": "bar" }
    ],
    "authTokens": [
        { "type": "your_token_type", "authToken": "zT419Ma3X2pBr0L..." }
    ]
}

Thay thế {userToken} trong URL yêu cầu bằng mã thông báo đã được truyền đến URL xác thực của bạn trong bước 1 Triển khai quy trình xác thực.

Ví dụ về Java

Ví dụ này cho thấy cách dùng thư viện ứng dụng Java để gọi mirror.accounts.insert

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.services.mirror.Mirror;
import com.google.api.services.mirror.model.Account;
import com.google.api.services.mirror.model.AuthToken;
import com.google.common.collect.Lists;
...

/** Email of the Service Account */
private static final String SERVICE_ACCOUNT_EMAIL =
    "<some-id>@developer.gserviceaccount.com";

/** Path to the Service Account's Private Key file */
private static final String SERVICE_ACCOUNT_PKCS12_FILE_PATH =
    "/path/to/<public_key_fingerprint>-privatekey.p12";

/** The account type, usually based on your company or app's package. */
private static final String ACCOUNT_TYPE = "com.example.myapp";

/** The Mirror API scopes needed to access the API. */
private static final String MIRROR_ACCOUNT_SCOPES =
    "https://www.googleapis.com/auth/glass.thirdpartyauth";

/**
 * Build and returns a Mirror service object authorized with the service accounts.
 *
 * @return Mirror service object that is ready to make requests.
 */
public static Mirror getMirrorService() throws GeneralSecurityException,
    IOException, URISyntaxException {
  HttpTransport httpTransport = new NetHttpTransport();
  JacksonFactory jsonFactory = new JacksonFactory();
  GoogleCredential credential = new GoogleCredential.Builder()
      .setTransport(httpTransport)
      .setJsonFactory(jsonFactory)
      .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
      .setServiceAccountScopes(MIRROR_ACCOUNT_SCOPES)
      .setServiceAccountPrivateKeyFromP12File(
          new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
      .build();
  Mirror service = new Mirror.Builder(httpTransport, jsonFactory, null)
      .setHttpRequestInitializer(credential).build();
  return service;
}

/**
 * Creates an account and causes it to be synced up with the user's Glass.
 * This example only supports one auth token; modify it if you need to add
 * more than one, or to add features, user data, or the password field.
 *
 * @param mirror the service returned by getMirrorService()
 * @param userToken the user token sent to your auth callback URL
 * @param accountName the account name for this particular user
 * @param authTokenType the type of the auth token (chosen by you)
 * @param authToken the auth token
 */
public static void createAccount(Mirror mirror, String userToken, String accountName,
    String authTokenType, String authToken) {
  try {
    Account account = new Account();
    List<AuthToken> authTokens = Lists.newArrayList(
        new AuthToken().setType(authTokenType).setAuthToken(authToken));
    account.setAuthTokens(authTokens);
    mirror.accounts().insert(
        userToken, ACCOUNT_TYPE, accountName, account).execute();
  } catch (IOException e) {
    e.printStackTrace();
  }
}

Truy xuất tài khoản trên Glass

Truy xuất và sử dụng Account các đối tượng trên Glass tương tự như việc sử dụng Android tiêu chuẩn AccountManager.

  1. Khai báo các quyền truy cập tệp kê khai sau đây trong tệp AndroidManifest.xml:

    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    
  2. Truy xuất các tài khoản của Glassware:

    AccountManager accountManager = AccountManager.get(mContext);
    // Use your Glassware's account type.
    Account[] accounts = accountManager.getAccountsByType("com.example");
    
    // Pick an account from the list of returned accounts.
    
  3. Truy xuất mã thông báo xác thực từ Account:

    // Your auth token type.
    final String AUTH_TOKEN_TYPE = "oauth2:https://www.example.com/auth/login";
    
    accountManager.getAuthToken(account, AUTH_TOKEN_TYPE, null, activity, new AccountManagerCallback<Bundle>() {
        public void run(AccountManagerFuture<Bundle> future) {
            try {
                String token = future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
                // Use the token.
            } catch (Exception e) {
                // Handle exception.
            }
        }
    }, null);