Nếu Glassware GDK của bạn cần xác thực người dùng dựa trên một dịch vụ web, thì 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.
Bằng cách sử dụng API này, bạn có thể mang đến trải nghiệm nhất quán cho người dùng Glass và tránh được chi phí phát sinh khi 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 bạn thiết lập quy trình xác thực đú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 một dự án API của Google, 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"). Khi sử dụng tài khoản dịch vụ, người dùng không phải cấp quyền riêng cho ứng dụng của bạn để đẩy thông tin xác thực của họ đến Glass và sẽ không phải thấy lại cả trang quyền OAuth và trang xác thực của riêng bạn.
Cách tạo tài khoản này:
- Truy cập Google Developers Console.
- Nhấp vào nút Create Project (Tạo dự án) rồi nhập thông tin theo yêu cầu.
- Sau khi tạo dự án, hãy ghi lại Số dự án mà bạn sẽ cần dùng sau này.
- Trong phần API và xác thực, hãy nhấp vào API rồi bật Google Mirror API cho dự án mới của bạn.
- Trong phần 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 mới. Đánh dấu vào hộp có 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.
- Một 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 cho 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 mất mã xác minh, bạn phải tạo một mã xác minh mới.
- Ghi lại địa chỉ email của tài khoản dịch vụ. Bạn sẽ cần địa chỉ này sau này để thực hiện lệnh gọi API.
Cung cấp siêu dữ liệu về Đồ thuỷ tinh của bạn
Khi đã sẵn sàng gửi sản phẩm Thủy tinh, bạn cần cung cấp những thông tin sau. 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 bạn triển khai.
- URL xác thực của bạn, nơi người dùng được chuyển hướng đến khi họ bật Glassware trong MyGlass.
- Loại tài khoản (chuỗi bạn sẽ sử dụng khi gọi API
AccountManager
của Android trên thiết bị Glass) - Tên gói của ứng dụng từ
AndroidManifest.xml
- Mã dự án API Google ở dạng số của dự án mà bạn đã tạo ở trên
- APK để tải lên MyGlass. Để kiểm thử, bạn chỉ cần cung cấp tệp APK này một lần để xử lý lượt 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 đè tệp APK trên thiết bị. Xin lưu ý rằng APK này cần đáp ứng các tiêu chí sau:
- Tệp này phải được căn chỉnh theo zip.
- Bạn không được thay đổi tên gói hoặc khoá ký riêng tư sau đó (trình quản lý gói Android không cho phép nâng cấp nếu có bất kỳ thay đổi nào trong số 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 cho thấy quy trình xác thực cơ bản cho GDK Glassware:
Cách triển khai quy trình xác thực:
Khi người dùng bật Glassware 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 là
userToken
mà bạn cần sử dụng sau này.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.
Máy chủ của bạn xác thực thông tin xác thực 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 Mirror API đến phương thức
mirror.accounts.insert
. Phương thức này yêu cầu bạn chỉ định phạm vihttps://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 được trình bày trong ví dụ về cách 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 đại diện cho cùng một thông tin mà bạn sẽ cung cấp cho
AccountManager
của Android nếu bạn đang 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
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à thay vào đó, hãy sử dụng trường này để lưu trữ dữ liệu riêng tư lâu dài như mã thông báo 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
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 được liên kết với tài khoản (xem AccountManager.getAuthToken
).authTokens[].type
chuỗi Loại mã xác thực. authTokens[].authToken
chuỗi Mã thông báo xác thực. Khi nhận được yêu cầu
mirror.account.insert
, Mirror API sẽ đẩy tài khoản này vào(các) thiết bị Glass của người dùng. Tại đây, bạn hiện có thể truy cập tài khoản này bằng cách sử dụng lớpAccountManager
.
Quy trình xác thực được đề xuất
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 luồng của bạn có phạm vi và người dùng huỷ luồng đó, hãy thiết kế một thông báo lỗi 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 bạn kết nối tài khoản đó.
- Nếu có thể, dữ liệu người dùng phải được sao lưu lên đám mây.
Để duy trì tính nhất quán trong quá trình xác thực 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ần tài khoản
- 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.
- 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.
- Sau khi người dùng chấp nhận hoặc huỷ các phạm vi, hãy đóng cửa sổ bật lên.
Phản chiếu bằng một tài khoản
- 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 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 họ đế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ó cách tạo tài khoản trong quy trình cài đặt.
- Người dùng chấp nhận các phạm vi.
- Nếu Glassware của bạn có các chế độ cài đặt có thể định cấu hình, hãy chuyển người dùng đến trang cài đặt với các chế độ 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 chuyển người dùng đến trang xác nhận. Đóng cửa sổ bật lên nếu không cần cấu hình bổ sung.
Kết hợp với một tài khoản
- Sau khi bật trong MyGlass, URL xác thực của bạn sẽ mở ra 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 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 họ đế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 chấp nhận các phạm vi.
- Gửi yêu cầu đến Mirror API để chèn Tài khoản GDK.
- Chuyển người dùng đến trang cài đặt với các tuỳ chọn mặc định hợp lý đã được chọn.
- 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 cấu hình bổ sung.
Phản ánh hoặc kết hợp với một tài khoản và phạm vi tuỳ chỉnh
- 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 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ọ đăng nhập, sau đó gửi các trường đó đến 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.
- 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.
- Gửi yêu cầu đến Mirror API để chèn Tài khoản GDK.
- Chuyển người dùng đến trang cài đặt với các tuỳ chọn mặc định hợp lý đã được chọn.
- 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 cấu hình bổ sung.
Phản chiếu hoặc kết hợp với ứng dụng Android/iPhone
- Sau khi bật trong MyGlass, URL xác thực của bạn sẽ mở ra trong một cửa sổ bật lên.
- 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.
- 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.
- 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 ứng dụng xuống từ Cửa hàng Google Play hoặc Cửa hàng iOS
- 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ạn chỉ cần bật Glassware trong MyGlass là đã hoàn tất quy trình này.
GDK có tài khoản
- Sau khi bật trong MyGlass, URL xác thực của bạn sẽ mở ra 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, sau đó 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.
- Người dùng chấp nhận các phạm vi.
- Gửi yêu cầu đến Mirror API để chèn Tài khoản GDK.
- Hiển thị 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ề cách tạo tài khoản
Sử dụng thư viện ứng dụng cho Mirror API nếu có thể. Điều này giúp việc gọi mirror.accounts.insert
để tạo tài khoản trở nên dễ dàng hơn.
Ví dụ về HTTP thô
Ví dụ dưới đây chỉ cho thấy URL của yêu cầu và ví dụ về nội dung JSON mà yêu cầu đó dự kiến. Việc thực hiện các yêu cầu HTTP thô thay cho tài khoản dịch vụ sẽ phức tạp hơn nhiều (xem phần Sử dụng OAuth 2.0 cho ứng dụng từ máy chủ đến máy chủ để biết toàn bộ thông tin chi tiết), 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 nếu 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 truyền đến URL xác thực ở 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 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
Việc truy xuất và sử dụng các đối tượng Account
trên Glass cũng tương tự như việc sử dụng AccountManager
Android tiêu chuẩn.
Khai báo các quyền sau đây trong tệp kê khai
AndroidManifest.xml
:<uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" />
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.
Truy xuất mã 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);