از GoogleAuthUtil و Plus.API مهاجرت کنید

اگر در گذشته با استفاده از GoogleAuthUtil.getToken یا Plus.API با Google Sign-In ادغام شده اید، برای امنیت بیشتر و تجربه کاربری بهتر باید به جدیدترین Sign-In API مهاجرت کنید.

از ضد الگوی توکن دسترسی مهاجرت کنید

شما نباید نشانه‌های دسترسی به‌دست‌آمده با GoogleAuthUtil.getToken را به عنوان ادعای هویت به سرور پشتیبان خود بفرستید، زیرا نمی‌توانید به راحتی تأیید کنید که این توکن برای باطن شما صادر شده است، و شما را در مقابل درج نشانه دسترسی از سوی مهاجم آسیب‌پذیر می‌کند.

به عنوان مثال، اگر کد اندروید شما مانند مثال زیر است، باید برنامه خود را به بهترین روش های فعلی منتقل کنید.

کد اندروید

در مثال، درخواست‌های نشانه دسترسی از oauth2: به‌علاوه یک رشته دامنه به‌عنوان پارامتر scope برای فراخوانی GoogleAuthUtil.getToken استفاده می‌کنند ( oauth2:https://www.googleapis.com/auth/plus.login ).

به جای احراز هویت با یک نشانه دسترسی که با GoogleAuthUtil.getToken به دست آمده است، از جریان رمز شناسه یا جریان کد تأیید استفاده کنید.

به جریان رمز شناسه مهاجرت کنید

اگر تنها چیزی که نیاز دارید شناسه کاربر، آدرس ایمیل، نام یا نشانی اینترنتی تصویر نمایه کاربر است، از جریان رمز شناسه استفاده کنید.

برای انتقال به جریان توکن ID، تغییرات زیر را اعمال کنید:

سمت کلاینت اندروید

  • در صورت درخواست، مجوز GET_ACCOUNTS (مخاطبین) را حذف کنید
  • هر کدی را با استفاده از GoogleAuthUtil ، Plus.API ، AccountPicker.newChooseAccountIntent() یا AccountManager.newChooseAccountIntent() به Auth.GOOGLE_SIGN_IN_API با GoogleSignInOptions.Builder.requestIdToken(...) تغییر دهید.

سمت سرور

  • یک نقطه پایانی جدید برای اعتبار شناسه رمز ایجاد کنید
  • پس از انتقال برنامه های مشتری، نقطه پایانی قدیمی را خاموش کنید

به جریان کد تأیید اعتبار سرور مهاجرت کنید

اگر سرور شما نیاز به دسترسی به سایر APIهای Google، مانند Google Drive، Youtube یا Contacts دارد، از جریان کد احراز هویت سرور استفاده کنید.

برای انتقال به جریان کد احراز هویت سرور، تغییرات زیر را اعمال کنید:

سمت کلاینت اندروید

  • در صورت درخواست، مجوز GET_ACCOUNTS (مخاطبین) را حذف کنید
  • هر کدی را با استفاده از GoogleAuthUtil ، Plus.API ، AccountPicker.newChooseAccountIntent() یا AccountManager.newChooseAccountIntent() به Auth.GOOGLE_SIGN_IN_API با GoogleSignInOptions.Builder.requestServerAuthCode(...) تغییر دهید.

سمت سرور

  • یک نقطه پایانی جدید برای جریان کد احراز هویت سرور ایجاد کنید
  • پس از انتقال برنامه های مشتری، نقطه پایانی قدیمی را خاموش کنید

همچنان می‌توانید منطق دسترسی API را بین نقاط پایانی قدیمی و جدید خود به اشتراک بگذارید. مثلا:

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(...);
String accessToken = tokenResponse.getAccessToken();
String refreshToken = tokenResponse.getRefreshToken();
Long expiresInSeconds = tokenResponse.getExpiresInSeconds();

// Shared by your old and new implementation, old endpoint can pass null for refreshToken
private void driveAccess(String refreshToken, String accessToken, Long expiresInSeconds) {
   GoogleCredential credential = new GoogleCredential.Builder()
           .setTransPort(...)
           ...
           .build();
   credential.setAccessToken(accessToken);
   credential.setExpiresInSeconds(expiresInSeconds);
   credential.setRefreshToken(refreshToken);
}

از جریان توکن ID GoogleAuthUtil مهاجرت کنید

اگر از GoogleAuthUtil برای دریافت نشانه های شناسه استفاده می کنید، باید به جریان نشانه شناسه API Sign-In جدید منتقل شوید.

برای مثال، اگر کد اندروید شما مانند مثال زیر است، باید مهاجرت کنید:

کد اندروید

در مثال، درخواست‌های نشانه شناسه audience:server:client_id به‌علاوه شناسه مشتری برای سرور وب شما به‌عنوان پارامتر «scope» برای تماس GoogleAuthUtil.getToken استفاده می‌کنند ( audience:server:client_id:9414861317621.apps.googleusercontent.com ).

جریان رمز جدید Sign-In API ID دارای مزایای زیر است:

  • تجربه ورود به سیستم با یک ضربه ساده
  • سرور شما می تواند اطلاعات نمایه کاربر را بدون تماس شبکه اضافی دریافت کند

برای انتقال به جریان توکن ID، تغییرات زیر را اعمال کنید:

سمت کلاینت اندروید

  • در صورت درخواست، مجوز GET_ACCOUNTS (مخاطبین) را حذف کنید
  • هر کدی را با استفاده از GoogleAuthUtil ، Plus.API ، AccountPicker.newChooseAccountIntent() یا AccountManager.newChooseAccountIntent() به Auth.GOOGLE_SIGN_IN_API با GoogleSignInOptions.Builder.requestIdToken(...) تغییر دهید.

سمت سرور

Sign-In API جدید، بر خلاف GoogleAuthUtil.getToken ، که از قالب منسوخ استفاده می‌کند، نشانه‌های شناسه‌ای صادر می‌کند که با مشخصات OpenID Connect مطابقت دارند. به ویژه، صادرکننده اکنون https://accounts.google.com با طرحی https است.

در طول فرآیند مهاجرت، سرور شما باید کد شناسه را از کلاینت‌های قدیمی و جدید اندروید شما تأیید کند. برای تأیید هر دو فرمت نشانه، تغییری را انجام دهید که مربوط به کتابخانه مشتری مورد استفاده شما است (اگر از یکی استفاده می کنید):

  • جاوا (Google APIs Client Libraries): به 1.21.0 یا جدیدتر ارتقا دهید
  • PHP (Google APIs Client Libraries): اگر از v1 استفاده می کنید، آن را به 1.1.6 یا جدیدتر ارتقا دهید. اگر از نسخه 2 استفاده می کنید، به 2.0.0-RC1 یا جدیدتر ارتقا دهید
  • Node.js: به 0.9.7 یا جدیدتر ارتقا دهید
  • پایتون یا پیاده سازی های خودتان: هر دوی این صادرکنندگان را بپذیرید: https://accounts.google.com و accounts.google.com

از جریان کد احراز هویت سرور GoogleAuthUtil مهاجرت کنید

اگر از GoogleAuthUtil برای دریافت کد احراز هویت سرور استفاده می‌کنید، باید به جریان کد احراز هویت API جدید Sign-In مهاجرت کنید.

برای مثال، اگر کد اندروید شما مانند مثال زیر است، باید مهاجرت کنید:

کد اندروید

در مثال، درخواست‌های کد احراز هویت سرور oauth2:server:client_id + شناسه مشتری برای وب سرور شما به‌عنوان پارامتر scope برای تماس GoogleAuthUtil.getToken ( oauth2:server:client_id:9414861317621.apps.googleusercontent.com ) استفاده می‌کنند.

جریان کد احراز هویت جدید Sign-In API دارای مزایای زیر است:

  • تجربه ورود به سیستم با یک ضربه ساده
  • اگر از راهنمای انتقال زیر پیروی کنید، سرور شما می‌تواند هنگام تبادل کد احراز هویت، یک کد شناسه حاوی اطلاعات نمایه کاربر دریافت کند.

برای انتقال به جریان کد اعتبار جدید، تغییرات زیر را اعمال کنید:

سمت کلاینت اندروید

  • در صورت درخواست، مجوز GET_ACCOUNTS (مخاطبین) را حذف کنید
  • هر کدی را با استفاده از GoogleAuthUtil ، Plus.API ، AccountPicker.newChooseAccountIntent() یا AccountManager.newChooseAccountIntent() به Auth.GOOGLE_SIGN_IN_API با GoogleSignInOptions.Builder.requestServerAuthCode(...) تغییر دهید.

سمت سرور

کد فعلی خود را نگه دارید، اما در هنگام ساختن شیء GoogleAuthorizationCodeTokenRequest ، https://oauth2.googleapis.com/token به عنوان نقطه پایانی سرور نشانه مشخص کنید، تا بتوانید یک رمز شناسه با ایمیل، شناسه کاربر و اطلاعات نمایه کاربر بدون نیاز به تماس شبکه دیگری این نقطه پایانی کاملاً به عقب سازگار است و کد زیر برای کدهای تأیید اعتبار سرور که از هر دو پیاده‌سازی کلاینت اندروید قدیمی و جدید شما بازیابی شده‌اند کار می‌کند.

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(
                transport,
                jsonFactory,
                // Use below for tokenServerEncodedUrl parameter
                "https://oauth2.googleapis.com/token",
                clientSecrets.getDetails().getClientId(),
                clientSecrets.getDetails().getClientSecret(),
                authCode,
                REDIRECT_URI)
               .execute();

...

// You can also get an ID token from auth code exchange.
GoogleIdToken googleIdToken = tokenResponse.parseIdToken();
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        .setAudience(Arrays.asList(SERVER_CLIENT_ID))
        .setIssuer("https://accounts.google.com")
        .build();
// Refer to ID token documentation to see how to get data from idToken object.
GoogleIdToken idToken = verifier.verify(idTokenString);
...