احراز هویت برای GDK Glassware

اگر GDK Glassware شما نیاز به احراز هویت کاربران در برابر یک سرویس وب داشته باشد، GDK یک API ارائه می دهد که به کاربر اجازه می دهد اعتبار خود را هنگام نصب Glassware شما وارد کند.

با استفاده از این API، تجربه کاربری ثابتی را برای کاربران Glass فراهم می‌کنید و از هزینه‌های سربار اجرای طرح‌های احراز هویت سفارشی خود اجتناب می‌کنید.

ایجاد یک حساب سرویس Google API

وقتی احراز هویت به درستی تنظیم شود، قسمت پشتی برنامه وب شما از Mirror API استفاده می کند تا اطلاعات حساب کاربران را پس از تأیید اعتبار با سرویس شما به Glass منتقل کند.

برای دسترسی به این API، یک پروژه Google API ایجاد کنید و سپس یک شناسه مشتری برای یک «حساب سرویس» (و نه یک «برنامه وب») ایجاد کنید. با استفاده از یک حساب سرویس، کاربران مجبور نیستند به طور جداگانه به برنامه شما اجازه دهند تا اطلاعات کاربری خود را به Glass منتقل کنند و دیگر هم صفحه مجوزهای OAuth و هم صفحه تأیید هویت شما ارائه نمی شوند.

برای ایجاد این حساب کاربری:

  1. به Google Developers Console بروید.
  2. روی دکمه Create Project کلیک کرده و اطلاعات درخواستی را وارد کنید.
  3. پس از ایجاد پروژه، شماره پروژه را یادداشت کنید که بعداً به آن نیاز خواهید داشت.
  4. در بخش APIs & auth ، روی APIs کلیک کنید و Google Mirror API را برای پروژه جدید خود فعال کنید.
  5. در بخش APIs & auth ، روی Credentials کلیک کنید، سپس روی Create New Client ID کلیک کنید. برای ایجاد شناسه مشتری OAuth 2.0 جدید برای پروژه، کادر با عنوان حساب سرویس را علامت بزنید.
  6. یک پنجره بازشو به شما اطلاع می دهد که کلید خصوصی در رایانه شما در حال دانلود است و رمز عبور آن کلید خصوصی را در اختیار شما قرار می دهد. پس از بستن این پنجره، دیگر نمی توانید این کلید خصوصی را دانلود کنید یا رمز عبور را مشاهده کنید. اگر آنها هرگز گم شدند، باید یک مورد جدید ایجاد کنید.
  7. آدرس ایمیل حساب سرویس را یادداشت کنید، که بعداً برای برقراری تماس API به آن نیاز خواهید داشت.

ارائه ابرداده در مورد Glassware شما

هنگامی که آماده ارسال ظروف شیشه ای خود هستید، باید اطلاعات زیر را ارائه دهید. این به ما امکان می‌دهد تا Glassware شما را طوری تنظیم کنیم که هنگام پیاده‌سازی آن به درستی احراز هویت شود.

  • URL احراز هویت شما، که کاربران وقتی Glassware شما را در MyGlass روشن می کنند به آن هدایت می شوند.
  • نوع حساب (رشته ای که هنگام تماس با API های Android AccountManager در دستگاه Glass استفاده می کنید)
  • نام بسته برنامه شما از AndroidManifest.xml شما
  • شناسه عددی پروژه Google API پروژه ای که در بالا ایجاد کردید
  • APK برای آپلود در MyGlass. برای آزمایش، فقط باید یک بار این APK را ارائه دهید تا زمانی که Glassware شما از MyGlass روشن است، دانلود اولیه را انجام دهید. پس از آن، می توانید با بازنویسی APK روی دستگاه خود، به صورت محلی تکرار و اشکال زدایی کنید. توجه داشته باشید که این APK باید معیارهای زیر را داشته باشد:
    • باید زیپ تراز شود.
    • پس از این نباید هیچ تغییری در نام بسته یا کلید امضای خصوصی ایجاد کنید (مدیر بسته Android در صورت هر یک از این تغییرات اجازه ارتقاء نمی‌دهد).
    • باید کمتر از 50 مگابایت باشد.
    • باید با استفاده از آخرین نسخه GDK کامپایل شود.

پیاده سازی جریان احراز هویت

نمودار زیر جریان اصلی احراز هویت را برای GDK Glassware نشان می دهد:

برای پیاده سازی جریان احراز هویت:

  1. وقتی کاربران Glassware شما را در MyGlass روشن می‌کنند، به URL احراز هویت شما هدایت می‌شوند. این درخواست ها شامل یک پارامتر پرس و جو به نام userToken است که باید بعداً از آن استفاده کنید.

  2. کاربر اعتبار خود را در صفحه احراز هویت شما وارد می کند.

  3. سرور شما اعتبار کاربر را تایید می کند. اگر اعتبارنامه ها معتبر هستند، یک فراخوانی Mirror API با متد mirror.accounts.insert برقرار کنید. این روش مستلزم آن است که هنگام ساخت شیء سرویس Mirror خود، محدوده https://www.googleapis.com/auth/glass.thirdpartyauth را مشخص کنید. نمونه هایی از برقراری این تماس API با استفاده از HTTP خام یا جاوا در نمونه های ایجاد حساب نشان داده شده است.

    پارامترها و بدنه درخواستی که در زیر ارائه می‌دهید، همان اطلاعاتی را نشان می‌دهند که اگر حساب را مستقیماً در دستگاه ایجاد می‌کردید، به AccountManager Android ارائه می‌کردید.

    نام ملک ارزش شرح
    features[] لیست رشته ها فهرستی از ویژگی ها (به AccountManager.hasFeatures مراجعه کنید).
    password رشته رمز عبور حساب (به 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 شما استفاده می شود.
  • اگر امکان اتصال یک حساب کاربری وجود دارد، مطمئن شوید که آن را متصل کرده اید.
  • در صورت امکان، اطلاعات کاربر باید در فضای ابری پشتیبان گیری شود.

برای حفظ ثبات در احراز هویت شیشه‌ای، از یکی از جریان‌های احراز هویت زیر استفاده کنید:

آینه ای یا هیبریدی بدون حساب

  1. پس از روشن شدن در MyGlass، URL احراز هویت شما در یک پاپ آپ باز می شود.
  2. این به طور مستقیم کاربر را به محدوده هایی برای پذیرش می فرستد.
  3. پس از اینکه کاربر دامنه ها را پذیرفت یا لغو کرد، پاپ آپ را ببندید.

آینه با حساب

  1. پس از روشن شدن در MyGlass، URL احراز هویت شما در یک پاپ آپ باز می شود.
    • اگر کاربر قبلاً وارد سرویس شما شده است، کاربر را مستقیماً به scopes ارسال کنید.
    • اگر کاربر وارد نشده است، فیلدهای ورود به سیستم را نشان دهید، به او اجازه دهید وارد سرویس شما شود و سپس آنها را به scopes ارسال کنید.
    • اگر کاربر حساب کاربری ندارد، پیوندی برای ایجاد حساب ارائه دهید. کاربران باید راهی برای ایجاد یک حساب به عنوان بخشی از فرآیند جریان نصب داشته باشند.
  2. کاربر محدوده ها را می پذیرد.
    • اگر Glassware شما دارای تنظیمات قابل تنظیم است، کاربر را با پیش فرض های معقول انتخاب شده به صفحه تنظیمات ارسال کنید.
    • اگر Glassware شما تنظیمات قابل تنظیم ندارد، کاربر را به صفحه تأیید ارسال کنید. اگر نیازی به پیکربندی اضافی نیست، پنجره بازشو را ببندید.

ترکیبی با حساب کاربری

  1. پس از روشن شدن در MyGlass، URL احراز هویت شما در یک پاپ آپ باز می شود.
    • اگر کاربر قبلاً وارد سرویس شما شده است، کاربر را مستقیماً به scopes ارسال کنید.
    • اگر کاربر وارد نشده است، فیلدهای ورود به سیستم را نشان دهید، به آنها اجازه ورود به سیستم را بدهید و سپس آنها را به scopes ارسال کنید.
    • اگر کاربر حساب کاربری ندارد، پیوندی برای ایجاد حساب ارائه دهید.
  2. کاربر محدوده ها را می پذیرد.
  3. برای درج حساب GDK درخواستی به Mirror API ارسال کنید.
    • کاربر را به صفحه تنظیمات با پیش فرض های معقول انتخاب شده ارسال کنید.
    • یک صفحه تایید برای کاربر ارسال کنید. اگر نیازی به پیکربندی اضافی نیست، پنجره بازشو را ببندید.

آینه ای یا ترکیبی با حساب کاربری و محدوده های سفارشی

  1. پس از روشن شدن در MyGlass، URL احراز هویت شما در یک پاپ آپ باز می شود.
    • اگر کاربر قبلاً وارد سرویس شما شده است، کاربر را به محدوده داخلی خود بفرستید
    • اگر کاربر وارد سیستم نشده است، فیلدهای ورود به سیستم را نشان دهید، به آنها اجازه ورود به سیستم را بدهید و سپس آنها را به محدوده داخلی خود ارسال کنید.
    • اگر کاربر حساب کاربری ندارد، پیوندی برای ایجاد حساب ارائه دهید.
  2. هنگامی که کاربر محدوده های سفارشی شما را می پذیرد، کاربر را به حوزه های Google ارسال کنید.
  3. برای درج حساب GDK درخواستی به Mirror API ارسال کنید.
    • کاربر را به صفحه تنظیمات با پیش فرض های معقول انتخاب شده ارسال کنید.
    • یک صفحه تایید برای کاربر ارسال کنید. اگر نیازی به پیکربندی اضافی نیست، پنجره بازشو را ببندید.

آینه یا ترکیبی با برنامه Android/iPhone

  1. پس از روشن شدن در MyGlass، URL احراز هویت شما در یک پاپ آپ باز می شود.
  2. این به طور مستقیم کاربر را به محدوده هایی برای پذیرش می فرستد.
  3. پس از پذیرش دامنه توسط کاربر:
    • اگر کاربر برنامه همراه را دارد و احراز هویت شده است، پنجره بازشو را ببندید.
    • در غیر این صورت، کاربر را به یک شبکه بین‌المللی بفرستید که او را راهنمایی می‌کند تا برنامه را از فروشگاه Google Play یا فروشگاه iOS بارگیری کند.
  4. پس از نصب برنامه و احراز هویت، پنجره پاپ آپ را ببندید

GDK و بدون حساب

روشن کردن Glassware در MyGlass تمام چیزی است که برای این جریان لازم است.

GDK با یک حساب

  1. پس از روشن شدن در MyGlass، URL احراز هویت شما در یک پاپ آپ باز می شود.
    • اگر کاربر قبلاً وارد سرویس شما شده است، کاربر را به صفحه تأیید ارسال کنید.
    • اگر کاربر وارد نشده است، فیلدهای ورود به سیستم را نمایش دهید، به آنها اجازه ورود به سیستم را بدهید و سپس آنها را به صفحه تأیید ارسال کنید.
    • اگر کاربر حساب کاربری ندارد، پیوندی برای ایجاد حساب ارائه دهید.
  2. کاربر محدوده ها را می پذیرد.
  3. برای درج حساب GDK درخواستی به Mirror API ارسال کنید.
  4. صفحه تایید را نشان دهید و پس از نمایش آن برای مدت کوتاهی صفحه را ببندید.

نمونه های ایجاد حساب کاربری

در صورت امکان از کتابخانه های سرویس گیرنده برای Mirror API استفاده کنید. این باعث می‌شود که برای ایجاد حساب کاربری آسان‌تر، mirror.accounts.insert تماس بگیرید.

مثال HTTP خام

مثال زیر فقط URL درخواست و نمونه ای از بدنه 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} را در URL درخواست با نشانه‌ای که در مرحله 1 پیاده‌سازی جریان احراز هویت به URL احراز هویت شما ارسال شده است، جایگزین کنید.

مثال جاوا

این مثال نحوه استفاده از کتابخانه سرویس گیرنده جاوا را برای فراخوانی 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();
  }
}

بازیابی اکانت ها روی شیشه

بازیابی و استفاده از اشیاء Account در Glass شبیه به استفاده از AccountManager استاندارد Android است.

  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);