אימות בגאדג'טים לבישים

אפליקציות ל-Wear OS יכולות לפעול בנפרד, ללא אפליקציה נלווית. המשמעות היא אפליקציה ל-Wear OS צריכה לנהל את האימות בעצמה כשיש לה גישה נתונים מהאינטרנט. עם זאת, המסך הקטן של השעון קטן מדי יכולות הקלט מגבילות את אפשרויות האימות שבהן אפליקציית Wear OS יכולה להשתמש.

במדריך הזה מפורטות שיטות האימות המומלצות לאפליקציות ל-Wear OS, למשל וגם חלופות כאשר השיטות האלה לא מתאימות לתרחיש לדוגמה של אפליקציה.

כדי לקבל מידע נוסף על עיצוב חוויית כניסה טובה, אפשר לקרוא את חוויית המשתמש לכניסה guide.

מצב אורח

לא לדרוש אימות לכל הפונקציונליות. במקום זאת, מומלץ לספק כמה שיותר תכונות אפשרית למשתמש בלי לדרוש ממנו להיכנס לחשבון.

המשתמשים עשויים לגלות את אפליקציית Wear שלך ולהתקין אותה בלי להשתמש בנייד לכן יכול להיות שאין להם חשבון והם לא יודעים אילו תכונות מבצעים. חשוב לוודא שהפונקציונליות של מצב אורח מציגה באופן מדויק את תכונות האפליקציה.

יכול להיות שחלק מהמכשירים לא יינעלו יותר זמן

במכשירים נתמכים עם Wear OS 5 ואילך, המערכת מזהה אם המשתמש עונד את המכשיר על פרק כף היד שלו. אם המשתמש מכבה את פרק כף היד ואז מסיר את המכשיר מפרק כף היד שלהם, המערכת שומרת על שהמכשיר יינעל למשך פרק זמן ארוך יותר מכפי שהיה יכול להיות.

אם לאפליקציה נדרשת רמת אבטחה גבוהה יותר - למשל, במהלך הצגה מידע שעשוי להיות רגיש או פרטי – קודם צריך לבדוק אם התכונה 'זיהוי של פרק כף היד' מופעל:

val wristDetectionEnabled =
        isWristDetectionAutoLockingEnabled(applicationContext)

אם הערך המוחזר בשיטה הזו הוא false, מבקשים מהמשתמש להיכנס לפני הצגת תוכן ספציפי למשתמש.

שיטות אימות מומלצות

אפשר להשתמש בשיטות האימות הבאות כדי להפעיל אפליקציות עצמאיות ל-Wear OS: להשיג פרטי כניסה לאימות משתמש.

אסימוני העברה באמצעות שכבת הנתונים

האפליקציה הנלווית לטלפון יכולה להעביר באופן מאובטח נתוני אימות אל אפליקציית Wear OS באמצעות שכבת הנתונים הלבישת. העברת פרטי כניסה כהודעות או כפריטי נתונים.

אימות מהסוג הזה בדרך כלל לא מצריך פעולה כלשהי מהמשתמש. עם זאת, נמנעים לבצע אימות בלי להודיע למשתמש שהוא נכנס לחשבון. אפשר להציג למשתמש הודעה באמצעות מסך פשוט שניתן לסגור, שבו ניתן לראות שהחשבון שלו נמצא בתהליך סגירה הועבר מהנייד.

חשוב לדעת: אפליקציית Wear צריכה להציע שיטת אימות אחת נוספת לפחות, כי האפשרות הזאת פועלת רק שעונים מותאמים ל-Android כשהאפליקציה המתאימה לנייד מותקנת. עליך לספק חלופה שיטת אימות למשתמשים שאין להם את האפליקציה המתאימה לנייד או למשתמשים עם Wear OS מותאם למכשיר iOS.

העברת אסימונים באמצעות שכבת הנתונים מהאפליקציה לנייד, כפי שמוצג בדוגמה הבאה:

val token = "..." // Auth token to transmit to the wearable device.
val dataClient: DataClient = Wearable.getDataClient(context)
val putDataReq: PutDataRequest = PutDataMapRequest.create("/auth").run {
    dataMap.putString("token", token)
    asPutDataRequest()
}
val putDataTask: Task<DataItem> = dataClient.putDataItem(putDataReq)

האזנה לאירועי שינוי נתונים באפליקציית השעון כמו בדוגמה הבאה:

val dataClient: DataClient = Wearable.getDataClient(context)
dataClient.addListener{ dataEvents ->
    dataEvents.forEach { event ->
        if (event.type == DataEvent.TYPE_CHANGED) {
            val dataItemPath = event.dataItem.uri.path ?: ""
            if (dataItemPath.startsWith("/auth")) {
                val token = DataMapItem.fromDataItem(event.dataItem).dataMap.getString("token")
                // Display interstitial screen to notify the user they are being signed in.
                // Then, store the token and use it in network requests.
            }
        }
    }
}

מידע נוסף על השימוש בשכבת הנתונים הלבישים זמין בכתובת איך שולחים ומסנכרנים נתונים ב-Wear OS

שימוש ב-OAuth 2.0

ב-Wear OS יש תמיכה בשני תהליכי עבודה שמבוססים על OAuth 2.0, שמתוארים בקטעים. הבאים:

  • הענקת קוד הרשאה עם מפתח הוכחה עבור Code Exchange (PKCE), כפי שמוגדר ב- RFC 7636
  • הענקת הרשאת גישה למכשיר, כפי שמוגדר ב RFC 8628

הערה: כדי לוודא שהאפליקציה לא תיכבה כשהשעון עובר למצב רגישות לסביבה במצב 'פועל כל הזמן' באמצעות AmbientModeSupport.attach בפעילות שמבצעת אימות. למידע נוסף על שיטות מומלצות ב-Ambient Mode: ראה איך להשאיר את האפליקציה גלויה ב-Wear.

מפתח הוכחה ל-Code Exchange (PKCE)

כדי להשתמש ביעילות ב-PKCE, RemoteAuthClient

כדי לבצע בקשת אימות מהאפליקציה ל-Wear OS לספק OAuth, צריך ליצור OAuthRequest לאובייקט. האובייקט הזה מורכב מכתובת URL של נקודת הקצה ב-OAuth לצורך קבלת אסימון CodeChallenge לאובייקט. הקוד הבא מציג דוגמה ליצירה של בקשת אימות:

val request = OAuthRequest.Builder(this.applicationContext)
    .setAuthProviderUrl(Uri.parse("https://...."))
    .setClientId(clientId)
    .setCodeChallenge(codeChallenge)
    .build()

אחרי שיוצרים את בקשת ההרשאה, שולחים אותה לאפליקציה הנלווית באמצעות שיטת sendAuthorizationRequest():

val client = RemoteAuthClient.create(this)
client.sendAuthorizationRequest(request,
    { command -> command?.run() },
    object : RemoteAuthClient.Callback() {
        override fun onAuthorizationResponse(
            request: OAuthRequest,
            response: OAuthResponse
        ) {
            // Extract the token from the response, store it and use it in network requests.
        }

        override fun onAuthorizationError(errorCode: Int) {
            // Handle error
        }
    }
)

הבקשה הזו מפעילה שיחה לאפליקציה הנלווית, ואז מציגה ממשק משתמש להרשאה באתר בדפדפן בטלפון הנייד של המשתמש. ספק OAuth 2.0 מאמת את המשתמש ומקבל את הסכמת המשתמש להרשאות הנדרשות. התגובה נשלחת להפניה אוטומטית.

אחרי שההרשאה בוצעה בהצלחה או נכשלה, שרת OAuth 2.0 מפנה לכתובת ה-URL שצוינה בבקשה. אם המשתמש יאשר את בקשת הגישה, התשובה תכיל קוד הרשאה. אם המשתמש לא יאשר את הבקשה, התשובה תכיל שגיאה הודעה.

התגובה אמורה להיות במחרוזת שאילתה, ונראית כמו אחת מהדוגמאות הבאות:

  https://wear.googleapis.com/3p_auth/com.your.package.name?code=xyz
  https://wear.googleapis-cn.com/3p_auth/com.your.package.name?code=xyz

תתבצע טעינה של דף שמפנה את המשתמש לאפליקציה הנלווית. האפליקציה הנלווית מאמתת את של התגובה, ומעביר את התגובה לאפליקציית השעון של הצד השלישי באמצעות API של onAuthorizationResponse.

אפליקציית השעון יכולה להחליף את קוד ההרשאה באסימון גישה.

הערה: אחרי יצירת ה-OAuthRequest, תוכלו למצוא את כתובת ה-URL להפניה אוטומטית על ידי גישה redirectUrl.

הענקת הרשאת גישה למכשיר

כשמשתמשים ב'הענקת הרשאת גישה למכשיר', המשתמש פותח את ה-URI לאימות במכשיר אחר. לאחר מכן שרת ההרשאות מבקש ממנו לאשר או לדחות את הבקשה.

כדי להקל על התהליך, אפשר להשתמש RemoteActivityHelper כדי לפתוח דף אינטרנט בנייד המותאם של המשתמש, כמו בדוגמה הבאה:

// Request access from the authorization server and receive Device Authorization Response.
val verificationUri = "..." // Extracted from the Device Authorization Response.
RemoteActivityHelper.startRemoteActivity(
    this,
    Intent(Intent.ACTION_VIEW)
        .addCategory(Intent.CATEGORY_BROWSABLE)
        .setData(Uri.parse(verificationUri)),
    null
)
// Poll the authorization server to find out if the user completed the user authorization
// step on their mobile device.

אם יש לך אפליקציה ל-iOS, השתמש ב- קישורים אוניברסליים כדי לפענח את הכוונה הזו באפליקציה, במקום להסתמך על הדפדפן שיאשר את האסימון.

שיטות אימות אחרות

מערכת Wear OS תומכת בשיטות כניסה נוספות, שמפורטות בקטעים הבאים.

כניסה באמצעות חשבון Google

כניסה באמצעות חשבון Google מאפשרת למשתמשים להיכנס באמצעות חשבון Google הקיים. הוא כולל את חוויית המשתמש הכי טובה וקל לתמוך בה, במיוחד אם אתם כבר מיישמים אותו באפליקציות להחזקה ביד.

אחרי שיטות האימות המומלצות שתוארו למעלה, Google כניסה היא הפתרון המועדף הבא, כי היא פועלת היטב גם ב-iOS. הבאים שמתארת איך להשלים שילוב בסיסי של כניסה באמצעות חשבון Google.

דרישות מוקדמות

לפני שאפשר יהיה להתחיל בשילוב של הכניסה באמצעות חשבון Google באפליקציה ל-Wear OS, צריך להגדיר פרויקט במסוף Google API ומגדירים את פרויקט Android Studio. לקבלת מידע נוסף, ראה מתחילים לשלב כניסה באמצעות חשבון Google באפליקציה ל-Android.

אם אתם משתמשים ב'כניסה באמצעות חשבון Google' באמצעות אפליקציה או אתר שמאפשרים מתקשר עם שרת עורפי, יש שתי דרישות מוקדמות נוספות:

  • יצירת מזהה לקוח של אפליקציית אינטרנט OAuth 2.0 עבור את השרת העורפי. מזהה הלקוח הזה שונה ממזהה הלקוח של האפליקציה שלכם. לקבלת מידע נוסף מידע נוסף, ראה הפעלת גישה בצד השרת.
  • שליחת האסימון המזהה של המשתמש כדי לזהות את המשתמש שמחובר כרגע בשרת באופן מאובטח באמצעות HTTPS. אפשר לקבל מידע נוסף על אימות המשתמש בשרת העורפי אימות באמצעות שרת עורפי.

שילוב של כניסה באמצעות חשבון Google באפליקציה

בודקים את השלבים הבאים, שמפורטים בקטעים, ומיישמים אותם לאחר מכן, כדי לשלב את 'כניסה באמצעות חשבון Google' באפליקציה ל-Wear OS:

  1. מגדירים כניסה באמצעות חשבון Google.
  2. הוספת לחצן כניסה באמצעות חשבון Google
  3. מתחילים את תהליך הכניסה כשלחצן הכניסה מקישים.

הגדרת כניסה באמצעות חשבון Google ופיתוח אובייקט GoogleApiClient

בשיטה onCreate() של פעילות הכניסה, צריך להגדיר כניסה באמצעות חשבון Google כדי לשלוח בקשה נתוני המשתמש שנדרשים על ידי האפליקציה שלכם. לאחר מכן, צריך ליצור אובייקט GoogleApiClient עם גישה לממשק ה-API לכניסה באמצעות חשבון Google ולאפשרויות שציינת. השלבים הבאים מוצגות בדוגמה הבאה:

public class MyNewActivity extends AppCompatActivity {

    private static final int RC_SIGN_IN = 9001;

    private GoogleSignInClient mSignInClient;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        GoogleSignInOptions options =
                new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                        .build();

        mSignInClient = GoogleSignIn.getClient(this, options);
    }
}

כדאי להוסיף לחצן כניסה באמצעות חשבון Google לאפליקציה

כדי להוסיף לחצן כניסה באמצעות חשבון Google, יש לפעול לפי השלבים הבאים:

  1. מוסיפים את SignInButton לפריסה של האפליקציה:
  2.  <com.google.android.gms.common.SignInButton
     android:id="@+id/sign_in_button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
    
  3. בשיטה onCreate() של האפליקציה, צריך לרשום את הלחצן OnClickListener כדי להכניס את המשתמש אחרי שמקישים עליו:
  4. Kotlin

    findViewById<View>(R.id.sign_in_button).setOnClickListener(this)
    

    Java

    findViewById(R.id.sign_in_button).setOnClickListener(this);
    

צריך ליצור כוונת כניסה ולהתחיל את תהליך הכניסה

ביצוע הקשות על לחצן הכניסה במכשיר onCLick() באמצעות יצירה של Intent לכניסה getSignInIntent(). לאחר מכן מתחילים את ה-Intent עם startActivityForResult().

Intent intent = mSignInClient.getSignInIntent();
startActivityForResult(intent, RC_SIGN_IN);

המשתמש מתבקש לבחור חשבון Google כדי להיכנס. אם ביקשת היקפים מעבר לפרופיל, לאימייל ולמזהה פתוח, המשתמש גם יתבקש להעניק גישה במשאבי אנוש.

לבסוף, onActivityResult, מאחזרים את תוצאת הכניסה באמצעות getSignInResultFromIntent אחרי שמאחזרים את תוצאת הכניסה, אפשר לבדוק אם הכניסה הצליחה באמצעות isSuccess. אם הכניסה תצליח, ניתן לקרוא אל getSignInAccount כדי לקבל אובייקט GoogleSignInAccount שמכיל מידע על המשתמש שמחובר לחשבון משתמש, למשל שם המשתמש. השלבים האלה מוצגים בדוגמה הבאה:

Kotlin

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    super.onActivityResult(requestCode, resultCode, data)

    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...).
    if (requestCode == RC_SIGN_IN) {
        Auth.GoogleSignInApi.getSignInResultFromIntent(data)?.apply {
            if (isSuccess) {
                // Get account information.
                fullName = signInAccount?.displayName
                mGivenName = signInAccount?.givenName
                mFamilyName = signInAccount?.familyName
                mEmail = signInAccount?.email
            }
        }
    }
}

Java

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...).
    if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult signInResult = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (signInResult.isSuccess()) {
            GoogleSignInAccount acct = signInResult.getSignInAccount();

            // Get account information.
            fullName = acct.getDisplayName();
            givenName = acct.getGivenName();
            familyName = acct.getFamilyName();
            email = acct.getEmail();
        }
    }
}

כדי לראות אפליקציה לדוגמה שבה מוטמע 'כניסה באמצעות חשבון Google', אפשר לעיין דוגמת כניסה לחשבון Google של הורולוג/ית ב-GitHub.

אימות קוד בהתאמה אישית

כחלופה לשיטות האימות שתוארו למעלה, יכולה לדרוש מהמשתמש לבצע אימות ממכשיר אחר, כמו טלפון נייד או טאבלט, ולקבל קוד מספרי לטווח קצר. לאחר מכן המשתמש מזין את במכשיר Wear OS כדי לאמת את הזהות שלהם ולקבל אסימון אימות.

תהליך האימות הזה משתמש במודול ההתחברות של האפליקציה, או משלבת באופן ידני שיטת כניסה של ספק אימות של צד שלישי בקוד האפליקציה. למרות ששיטת האימות הזאת דורשת עבודה ידנית ומאמצים נוספים הוא מאובטח יותר. אפשר להשתמש בשיטה הזו אם צריך לבצע אימות בשלב מוקדם יותר באפליקציות העצמאיות ל-Wear OS.

תהליך האימות להגדרה הזו פועל כך:

  1. המשתמש מבצע פעולה באפליקציה ל-Wear OS שמחייבת הרשאה.
  2. אפליקציית Wear OS מציגה למשתמש מסך אימות ומורה המשתמש להזין קוד מכתובת URL מסוימת.
  3. המשתמש עובר למכשיר נייד, לטאבלט או למחשב PC, ולאחר מכן מפעיל דפדפן, עובר לכתובת ה-URL שצוינה באפליקציית Wear OS ומתחבר.
  4. המשתמש מקבל קוד מספרי לטווח קצר שהוא הזין באפליקציית Wear OS מסך אימות באמצעות המקלדת המובנית ב-Wear OS:

  5. מנקודה זו אפשר להשתמש בקוד שהוזן כהוכחה לכך משתמש ולהחליף את הקוד באסימון אימות שמאוחסן ומאובטח במכשיר Wear OS לשיחות מאומתות מאותו רגע והלאה.

הערה: הקוד שהמשתמש יוצר חייב להיות מספרי בלבד ולא יכול להכיל אותיות לטיניות תווים.

תהליך האימות מתואר בתרשים הבא: