GDK Glassware 身份验证

如果您的 GDK Glassware 需要针对某项网络服务对用户进行身份验证 GDK 提供了一个 API,供用户在 安装 Glassware。

通过使用此 API,您可以提供一致的用户 并避免自行部署 自定义身份验证方案。

创建 Google API 服务账号

正确设置身份验证后,您的 Web 应用的后端 Mirror API 将用户的将账号信息转移到 Glass 然后再通过您的服务进行身份验证

要访问此 API,请创建 Google API 项目,然后 为“服务账号”创建客户端 ID(而不是“Web 应用”)。修改者 使用服务账号时,用户无需单独授予您的 允许应用将自己的凭据推送到 Glass 同时显示 OAuth 权限页面和您自己的身份验证 页面。

如需创建此账号,请执行以下操作:

  1. 前往 Google Developers Console
  2. 点击创建项目按钮,然后输入所需信息。
  3. 创建项目后,记下项目编号, 稍后会用到的资料
  4. API 和auth,然后点击 API 并启用 Google Mirror API 创建新项目
  5. API 和auth,点击 Credentials,然后点击 Create New Client ID。选中服务账号复选框以创建新的 OAuth 2.0 项目的客户端 ID。
  6. 系统会显示一个弹出式窗口,告知您私钥正在下载 并向您提供该私钥的密码。 关闭此窗口后,您将无法再下载此私享视频 密钥或再次查看密码。如果丢失,您必须创建新的 一个。
  7. 记下服务账号的电子邮件地址 进行 API 调用

提供有关 Glassware 的元数据

在准备提交 Glassware 时,您需要提供 相关信息。这样我们就能设置您的 Glassware 正确进行身份验证。

  • 您的身份验证网址,用户在访问该网址时会被重定向到 就会在 MyGlass 中打开您的 Glass 软件
  • 账号类型(您在调用 Glass 设备上的 Android AccountManager API)
  • AndroidManifest.xml 中应用的软件包名称
  • 您创建的项目的 Google API 数字项目 ID 超出
  • 要在 MyGlass 中上传的 APK。对于测试,您只需提供 将此 APK 处理一次,以便在您的 Glassware 通过 MyGlass 启用;之后,你可以在本地进行迭代和调试 覆盖设备上的 APK。请注意,此 APK 必须满足 以下条件: <ph type="x-smartling-placeholder">
      </ph>
    • 它必须与邮政编码对齐。
    • 您不得对软件包名称或私密签名进行任何更改 密钥(Android 软件包管理器不允许升级) (如果执行上述任一更改)。
    • 必须小于 50 MB。
    • 必须使用最新版本的 GDK 进行编译。

实现身份验证流程

下图显示了 Vertex AI Workbench 中 GDK Glassware:

如需实现身份验证流程,请执行以下操作:

  1. 当用户在 MyGlass 中启用 Glassware 时,系统会将其重定向 添加到身份验证网址中。这些请求包含一个名为 userToken

  2. 用户需在您的身份验证页面上输入其凭据。

  3. 您的服务器会验证用户的凭据。如果凭据有效 对 mirror.accounts.insert 方法进行 Mirror API 调用。此方法 要求您指定 https://www.googleapis.com/auth/glass.thirdpartyauth 作用域。 镜像服务对象。使用原始 账号创建示例中显示了 HTTP 或 Java。

    您在下面提供的参数和请求正文 如果您向 Android AccountManager 提供任何信息, 是直接在设备上创建账号的用户。

    属性名称 说明
    features[] 字符串列表 功能列表(请参阅 <ph type="x-smartling-placeholder"></ph> AccountManager.hasFeatures).
    password 字符串 账号密码(请参阅 <ph type="x-smartling-placeholder"></ph> AccountManager.getPassword).我们建议 您没有将用户的实际密码存储在 该字段,而是用它来存储长期有效的私有 例如刷新令牌
    userData[] 对象列表 与账号关联的一对或多对用户数据 (请参阅 AccountManager.getUserData).
    userData[].key 字符串 与特定用户数据键值对相关联的键 配对。
    userData[].value 字符串 与特定用户数据键值对相关联的值 配对。
    authTokens[] 对象列表 与账号关联的一个或多个身份验证令牌 (请参阅 AccountManager.getAuthToken).
    authTokens[].type 字符串 身份验证令牌的类型。
    authTokens[].authToken 字符串 身份验证令牌。
  4. 收到 mirror.account.insert 请求后,Mirror API 将推送 将账号关联到用户的 Glass 设备 使用 AccountManager 类。

请遵循以下准则来实现方便用户使用的身份验证流程:

  • 针对移动设备优化您的流程。
  • 如果您的流程包含作用域,但用户取消了该作用域,则应制定一个精心设计的 错误消息。
  • 确保您的 Glassware 确实正在使用您请求的镜。
  • 如果可以关联某个用户账号,请确保关联该账号。
  • 请尽可能将用户数据备份到云端。

为确保 Glassware 身份验证的一致性,请使用以下方法之一 身份验证流程:

不登录账号,直接镜像或混合使用

  1. 在 MyGlass 中开启 Wi-Fi 后,系统会在弹出式窗口中打开您的身份验证网址。
  2. 这会直接将用户转到范围以接受。
  3. 在用户接受或取消范围后,关闭弹出式窗口。

镜像到账号

  1. 在 MyGlass 中开启 Wi-Fi 后,系统会在弹出式窗口中打开您的身份验证网址。
    • 如果该用户已经登录了您的服务,请直接将该用户转到 范围。
    • 如果用户没有登录,则显示登录字段,并允许用户登录 发送到您的服务,然后将其发送到作用域。
    • 如果用户没有账号,请提供创建 。用户必须能通过创建账号的方式, 安装流程。
  2. 用户接受范围。
    • 如果您的 Glassware 具有可配置的设置,请将用户转到 并选择了合理的默认设置
    • 如果您的 Glassware 没有可配置的设置,请将用户转到 确认页面。如果没有其他配置,请关闭弹出式窗口 必填字段。

混合搭配一个账号

  1. 在 MyGlass 中开启 Wi-Fi 后,系统会在弹出式窗口中打开您的身份验证网址。
    • 如果该用户已经登录了您的服务,请直接将该用户转到 范围。
    • 如果用户尚未登录,则显示登录字段,并允许用户登录 然后发送到作用域。
    • 如果用户没有账号,请提供创建账号的链接。
  2. 用户接受范围。
  3. 向 Mirror API 发送请求以插入 GDK 账号。
    • 将用户引导至选定的合理默认设置的设置页面。
    • 向用户发送确认页面。如没有其他内容,请关闭弹出式窗口 配置。

使用账号和自定义范围进行镜像或混合

  1. 在 MyGlass 中开启 Wi-Fi 后,系统会在弹出式窗口中打开您的身份验证网址。
    • 如果该用户已经登录了您的服务,请将该用户转到您的 内部范围
    • 如果用户尚未登录,则显示登录字段,并允许用户登录 然后将其发送到内部作用域
    • 如果用户没有账号,请提供创建账号的链接。
  2. 在用户接受您的自定义范围后,将用户转到 Google 的范围。
  3. 向 Mirror API 发送请求以插入 GDK 账号。
    • 将用户引导至选定的合理默认设置的设置页面。
    • 向用户发送确认页面。如没有其他内容,请关闭弹出式窗口 配置。

镜像或混合使用 Android/iPhone 应用

  1. 在 MyGlass 中开启 Wi-Fi 后,系统会在弹出式窗口中打开您的身份验证网址。
  2. 这会直接将用户转到范围以接受。
  3. 用户接受范围后: <ph type="x-smartling-placeholder">
      </ph>
    • 如果用户已安装配套应用并已通过身份验证,请关闭弹出式窗口 窗口。
    • 如果不是,请将用户引导至一个插页式广告,引导他们下载 Google Play 商店或 iOS 商店中的应用
  4. 安装应用并进行身份验证后,关闭弹出式窗口

GDK,但无账号

完成此流程需要在 MyGlass 中开启 Glassware。

登录 GDK

  1. 在 MyGlass 中开启 Wi-Fi 后,系统会在弹出式窗口中打开您的身份验证网址。
    • 如果该用户已经登录到您的服务,请将该用户转到 确认屏幕。
    • 如果用户没有登录,则显示登录字段,并允许用户 登录,然后将用户发送到确认屏幕。
    • 如果用户没有账号,请提供创建账号的链接。
  2. 用户接受范围。
  3. 向 Mirror API 发送请求以插入 GDK 账号。
  4. 显示确认屏幕,在显示确认屏幕后关闭屏幕 。

账号创建示例

使用客户端库 向 Mirror API 提供支持。这会使调用 mirror.accounts.insert 以便更轻松地创建账号。

原始 HTTP 示例

下例仅显示了请求的网址, 所需的 JSON 正文。代表服务发出原始 HTTP 请求 复杂得多(请参阅 针对“服务器到服务器”应用使用 OAuth 2.0 了解完整详情),因此我们建议您使用我们的 Google API 客户端库 以便简化这一过程。

请求方法和网址:

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

请求正文:

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

将请求网址中的 {userToken} 替换为传递给传递的令牌 您在第 1 步中的身份验证网址 实现身份验证流程

Java 示例

此示例展示了如何使用 Java 客户端库调用 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();
  }
}

检索 Glass 上的账号

检索和使用 Account 与使用标准 AccountManager.

  1. AndroidManifest.xml 文件中声明以下清单权限:

    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    
  2. 检索 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. 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);