Di chuyển từ GoogleAuthUtil và Plus.API

Nếu trước đây bạn đã tích hợp tính năng Đăng nhập bằng Google bằng GoogleAuthUtil.getToken hoặc Plus.API, bạn nên chuyển sang phiên bản mới nhất API Đăng nhập giúp tăng cường bảo mật và nâng cao trải nghiệm người dùng.

Di chuyển từ mẫu chống mã thông báo truy cập

Bạn không được gửi mã truy cập nhận được bằng GoogleAuthUtil.getToken cho máy chủ phụ trợ của bạn như một lời khẳng định danh tính, vì bạn không thể dễ dàng xác minh mã thông báo đã được cấp đến phần phụ trợ của bạn, khiến bạn dễ bị chèn mã mã truy cập của kẻ tấn công.

Ví dụ: nếu mã Android của bạn trông giống như ví dụ dưới đây, bạn nên di chuyển ứng dụng của bạn sang các phương pháp hay nhất hiện tại.

Mã Android

Trong ví dụ này, các yêu cầu mã truy cập sử dụng oauth2: cùng với một chuỗi phạm vi làm tham số Tham số scope cho lệnh gọi GoogleAuthUtil.getToken (oauth2:https://www.googleapis.com/auth/plus.login).

Thay vì xác thực bằng mã truy cập có được bằng GoogleAuthUtil.getToken, sử dụng quy trình mã thông báo nhận dạng hoặc quy trình mã xác thực.

Di chuyển sang quy trình mã thông báo giá trị nhận dạng

Nếu tất cả những gì bạn cần là URL, địa chỉ email, tên hoặc ảnh hồ sơ của người dùng, hãy sử dụng quy trình mã thông báo mã nhận dạng.

Để di chuyển sang quy trình mã thông báo giá trị nhận dạng, hãy thực hiện các thay đổi sau:

Phía máy khách Android

  • Xoá quyền GET_ACCOUNTS (Danh bạ) nếu bạn yêu cầu
  • Chuyển đổi mã bất kỳ bằng GoogleAuthUtil, Plus.API AccountPicker.newChooseAccountIntent() hoặc AccountManager.newChooseAccountIntent() đến Auth.GOOGLE_SIGN_IN_API bằng Cấu hình GoogleSignInOptions.Builder.requestIdToken(...).

Phía máy chủ

Di chuyển sang quy trình mã xác thực máy chủ

Nếu máy chủ của bạn cần truy cập vào các API khác của Google, chẳng hạn như Google Drive, YouTube, hoặc Danh bạ, hãy sử dụng quy trình mã xác thực máy chủ.

Để di chuyển sang quy trình mã xác thực máy chủ, hãy thực hiện các thay đổi sau:

Phía máy khách Android

  • Xoá quyền GET_ACCOUNTS (Danh bạ) nếu bạn yêu cầu
  • Chuyển đổi mã bất kỳ bằng GoogleAuthUtil, Plus.API AccountPicker.newChooseAccountIntent() hoặc AccountManager.newChooseAccountIntent() đến Auth.GOOGLE_SIGN_IN_API bằng Cấu hình GoogleSignInOptions.Builder.requestServerAuthCode(...).

Phía máy chủ

Bạn vẫn có thể chia sẻ logic truy cập API giữa các điểm cuối cũ và mới. Ví dụ:

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

Di chuyển từ luồng mã thông báo mã nhận dạng GoogleAuthUtil

Nếu dùng GoogleAuthUtil để nhận mã thông báo nhận dạng, bạn nên chuyển sang phiên bản mới Quy trình mã thông báo mã nhận dạng API đăng nhập.

Ví dụ: nếu mã Android của bạn giống như ví dụ sau, bạn nên migrate:

Mã Android

Trong ví dụ này, các yêu cầu mã thông báo giá trị nhận dạng sử dụng audience:server:client_id cùng với client ID cho máy chủ web của bạn dưới dạng tham số 'phạm vi' cho Cuộc gọi GoogleAuthUtil.getToken (audience:server:client_id:9414861317621.apps.googleusercontent.com).

Quy trình mã thông báo mã nhận dạng API Đăng nhập mới có các lợi ích sau:

  • Trải nghiệm đăng nhập bằng một lần nhấn đơn giản hoá
  • Máy chủ của bạn có thể nhận thông tin hồ sơ người dùng mà không cần thêm lệnh gọi mạng

Để di chuyển sang quy trình mã thông báo giá trị nhận dạng, hãy thực hiện các thay đổi sau:

Phía máy khách Android

  • Xoá quyền GET_ACCOUNTS (Danh bạ) nếu bạn yêu cầu
  • Chuyển đổi mã bất kỳ bằng GoogleAuthUtil, Plus.API AccountPicker.newChooseAccountIntent() hoặc AccountManager.newChooseAccountIntent() đến Auth.GOOGLE_SIGN_IN_API bằng Cấu hình GoogleSignInOptions.Builder.requestIdToken(...).

Phía máy chủ

API đăng nhập mới phát hành mã thông báo ID tuân thủ với OpenID Connect không giống như GoogleAuthUtil.getToken (sử dụng định dạng không dùng nữa). Cụ thể, tài khoản phát hành hiện là https://accounts.google.com, có https giản đồ.

Trong quá trình di chuyển, máy chủ của bạn cần xác minh mã thông báo mã nhận dạng từ cả các ứng dụng Android cũ và mới của bạn. Để xác minh cả hai định dạng của mã thông báo, hãy thực hiện thay đổi tương ứng với thư viện ứng dụng bạn sử dụng (nếu bạn sử dụng):

  • Java (Thư viện ứng dụng API của Google): nâng cấp lên phiên bản 1.21.0 trở lên
  • PHP (Google APIs Client Libraries): nếu bạn sử dụng phiên bản v1, hãy nâng cấp lên 1.1.6 trở lên; nếu bạn sử dụng v2, nâng cấp lên 2.0.0-RC1 hoặc mới hơn
  • Node.js: nâng cấp lên 0.9.7 trở lên
  • Python hoặc các cách triển khai của riêng bạn: chấp nhận cả hai nhà phát hành sau: https://accounts.google.comaccounts.google.com

Di chuyển từ quy trình mã xác thực máy chủ GoogleAuthUtil

Nếu sử dụng GoogleAuthUtil để nhận mã xác thực máy chủ thì bạn nên chuyển sang quy trình mã uỷ quyền API Đăng nhập mới.

Ví dụ: nếu mã Android của bạn giống như ví dụ sau, bạn nên migrate:

Mã Android

Trong ví dụ này, các yêu cầu mã xác thực máy chủ sử dụng oauth2:server:client_id + client ID cho máy chủ web của bạn dưới dạng tham số scope cho Cuộc gọi GoogleAuthUtil.getToken (oauth2:server:client_id:9414861317621.apps.googleusercontent.com).

Quy trình mã xác thực mới của API Đăng nhập có các lợi ích sau:

  • Trải nghiệm đăng nhập bằng một lần nhấn đơn giản hoá
  • Nếu bạn làm theo hướng dẫn di chuyển bên dưới, máy chủ của bạn có thể nhận được mã thông báo giá trị nhận dạng chứa thông tin hồ sơ của người dùng khi bạn trao đổi mã xác thực

Để chuyển sang quy trình mã uỷ quyền mới, hãy thực hiện các thay đổi sau:

Phía máy khách Android

  • Xoá quyền GET_ACCOUNTS (Danh bạ) nếu bạn yêu cầu
  • Chuyển đổi mã bất kỳ bằng GoogleAuthUtil, Plus.API AccountPicker.newChooseAccountIntent() hoặc AccountManager.newChooseAccountIntent() đến Auth.GOOGLE_SIGN_IN_API bằng Cấu hình GoogleSignInOptions.Builder.requestServerAuthCode(...).

Phía máy chủ

Giữ mã hiện tại của bạn, nhưng chỉ định https://oauth2.googleapis.com/token làm điểm cuối của máy chủ mã thông báo khi tạo GoogleAuthorizationCodeTokenRequest để bạn có thể nhận mã thông báo giá trị nhận dạng có email, mã nhận dạng người dùng và thông tin hồ sơ của người dùng mà không cần cuộc gọi mạng. Điểm cuối này hoàn toàn tương thích ngược và có đoạn mã dưới đây sẽ hoạt động đối với mã xác thực máy chủ được truy xuất từ cả thiết bị Android cũ và mới khách hàng.

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