اگر در گذشته با استفاده از 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
به عنوان نقطه پایانی سرور نشانه مشخص کنید، تا بتوانید یک رمز شناسه با ایمیل، شناسه کاربر و اطلاعات نمایه کاربر بدون نیاز به تماس شبکه دیگری این نقطه پایانی کاملاً به عقب سازگار است و کد زیر برای کدهای تأیید اعتبار سرور بازیابی شده از هر دو اجرای کلاینت Android قدیمی و جدید شما کار خواهد کرد.
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); ...