Xác thực cho Glassware GDK

Nếu GDK Glassware của bạn cần xác thực người dùng dựa trên một dịch vụ web, GDK sẽ cung cấp một API cho phép người dùng nhập thông tin xác thực của họ khi cài đặt Glassware của bạn.

Bằng cách sử dụng API này, bạn cung cấp trải nghiệm nhất quán cho người dùng Glass và tránh chi phí triển khai các lược đồ xác thực tuỳ chỉnh của riêng mình.

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

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

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

Để tạo tài khoản này, hãy làm như sau:

  1. Chuyển đến Google Developers Console.
  2. Nhấp vào nút Tạo dự án rồi nhập thông tin được yêu cầu.
  3. Sau khi tạo dự án, hãy ghi lại Số dự án mà bạn sẽ cần sau này.
  4. Trong API và xác thực, hãy nhấp vào API và bật Google Mirror API cho dự án mới của bạn.
  5. Trong API và xác thực, hãy nhấp vào Thông tin xác thực, sau đó nhấp vào Tạo mã ứng dụng khách mới. Đánh dấu vào hộp gắn nhãn Tài khoản dịch vụ để tạo mã ứng dụng khách OAuth 2.0 mới cho 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 máy tính 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 khoá riêng tư này xuống hoặc xem lại mật khẩu. Nếu họ bị mất, bạn phải tạo một mã mới.
  7. Ghi lại địa chỉ email của tài khoản dịch vụ mà bạn sẽ cần sau này để thực hiện lệnh gọi API.

Cung cấp siêu dữ liệu về Glassware của bạn

Khi đã sẵn sàng gửi Glassware, bạn cần cung cấp các thông tin sau. Điều 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 bạn triển khai.

  • URL xác thực mà người dùng được chuyển hướng đến khi họ bật Glassware của bạn trong MyGlass.
  • Loại tài khoản (chuỗi mà bạn sẽ sử dụng khi gọi API Android AccountManager trên thiết bị Glass)
  • Tên gói của ứng dụng từ AndroidManifest.xml của bạn
  • Mã dự án API dạng số của dự án mà bạn đã tạo ở trên
  • APK để tải lên trên MyGlass. Để thử nghiệm, bạn chỉ cần cung cấp tệp APK này một lần để xử lý tệp tải xuống ban đầu khi Glassware đượ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ị. Lưu ý rằng APK này cần đáp ứng các tiêu chí sau:
    • Phải được căn chỉnh zip.
    • Bạn không được thực hiện bất kỳ thay đổi nào đối với tên gói hoặc khoá ký riêng tư sau khi thay đổi này (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).
    • Tên phải nhỏ hơn 50 megabyte.
    • Bạn phải biên dịch mã này 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 cho thấy quy trình xác thực cơ bản cho Glassware GDK:

Để triển khai quy trình xác thực, hãy làm như sau:

  1. Khi người dùng bật Glassware của bạn trong MyGlass, họ sẽ được chuyển hướng đến 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 xác thực hợp lệ, hãy thực hiện lệnh gọi API Mirror đến phương thức mirror.accounts.insert. Phương thức này yêu cầu bạn chỉ định phạm vi https://www.googleapis.com/auth/glass.thirdpartyauth khi tạo đối tượng dịch vụ Mirror. Ví dụ về cách thực hiện lệnh gọi API này bằng HTTP thô hoặc Java sẽ được hiển thị trong ví dụ về 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 giống với thông tin bạn sẽ cung cấp cho AccountManager của Android nếu bạn tạo tài khoản trực tiếp 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 chuỗi Mật khẩu tài khoản (xem AccountManager.getPassword). Bạn không nên lưu trữ mật khẩu thực tế của người dùng trong trường này, mà nên lưu trữ mật khẩu riêng tư dài 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 liên kết với tài khoản này (xem AccountManager.getUserData).
    userData[].key chuỗi Khoá liên kết với một cặp khoá-giá trị dữ liệu người dùng cụ thể.
    userData[].value chuỗi Giá trị liên kết với một cặp khoá-giá trị dữ liệu người dùng cụ thể.
    authTokens[] danh sách đối tượng Một hoặc nhiều mã xác thực liên kết với tài khoản này (xem AccountManager.getAuthToken).
    authTokens[].type chuỗi Loại mã thông báo xác thực.
    authTokens[].authToken chuỗi Mã thông báo xác thực.
  4. Khi nhận được yêu cầu mirror.account.insert, API Mirror sẽ đẩy tài khoản đến(các) thiết bị Glass của người dùng. Tại đây, bạn có thể truy cập vào tài khoản bằng cách sử dụng lớp AccountManager.

Hãy thực hiện 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 cho thiết bị di động.
  • Nếu quy trình có phạm vi và người dùng huỷ các phạm vi đó, hãy tạo một thông báo lỗi được thiết kế hợp lý.
  • Đảm bảo phạm vi mà bạn yêu cầu đang được sử dụng thực sự trong Glassware.
  • 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 sẽ sao lưu lên đám mây.

Để duy trì tính nhất quán trong xác thực của Glassware, hãy sử dụng một trong các quy trình xác thực sau:

Phản chiếu hoặc kết hợp mà không có 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 đưa 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 đưa người dùng trực tiếp đến các 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 đến các 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ó một cách để tạo một tài khoản trong quy trình cài đặt.
  2. Người dùng chấp nhận các phạm vi.
    • Nếu Glassware của bạn có chế độ cài đặt có thể định cấu hình, hãy đưa người dùng tới trang cài đặt có các giá trị mặc định hợp lý được chọn.
    • Nếu Glassware của bạn không có chế độ cài đặt có thể định cấu hình, hãy đưa người dùng đến một trang xác nhận. Đóng cửa sổ bật lên nếu không cần định cấu hình bổ sung.

Kết hợp 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 đưa người dùng trực tiếp đến các 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 rồi gửi đến các 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 API phản chiếu để chèn Tài khoản GDK.
    • Đưa người dùng đến trang cài đặt đã chọn các giá trị 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ần thêm cấu hình.

Phản chiếu hoặc kết hợp với một 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 chuyển họ đến phạm vi nội bộ của bạ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 đến các phạm vi nội bộ của bạ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. 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 API phản chiếu để chèn Tài khoản GDK.
    • Đưa người dùng đến trang cài đặt đã chọn các giá trị 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ần thêm cấu hình.

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 đưa 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 các 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.
    • Nếu không, hãy đưa người dùng đến một quảng cáo xen kẽ để hướng dẫn họ tải ứng dụng xuố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

Việc bật/tắt Glassware trong MyGlass là tất cả những gì cần thiết cho quy trình này.

GDK 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 họ đế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ị trường đăng nhập, cho phép họ đăng nhập và chuyển họ đế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 API phản chiếu để chèn Tài khoản GDK.
  4. Hiện màn hình xác nhận và đóng màn hình sau khi hiển thị trong một khoảng thời gian ngắn.

Ví dụ về việc tạo tài khoản

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

Ví dụ về HTTP thô

Ví dụ bên dưới chỉ cho thấy URL của yêu cầu và một ví dụ về nội dung JSON mà yêu cầu dự kiến. Việc tạo yêu cầu HTTP thô thay mặt cho tài khoản dịch vụ phức tạp hơn nhiều (xem nội dung Sử dụng OAuth 2.0 cho ứng dụng từ máy chủ đến máy chủ để biết thông tin chi tiết đầy đủ), vì vậy, bạn nên sử dụng một trong các thư viện ứng dụng API của Google để có thể thực hiện 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 chuyển đến URL xác thực của bạn trong bước 1 của Triển khai quy trình xác thực.

Ví dụ về Java

Ví dụ này cho biết cách sử 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();
  }
}

Đang truy xuất tài khoản trên Glass

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

  1. Khai báo các quyền tệp kê khai sau 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 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);