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, thì bạn nên chuyển sang API Đăng nhập mới nhất để tăng tính bảo mật và trải nghiệm người dùng tốt hơn.

Di chuyển từ mã truy cập chống mẫu

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

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

Mã Android

Ở ví dụ này, các yêu cầu mã truy cập sử dụng oauth2: cùng với chuỗi phạm vi làm 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 thu thập được bằng GoogleAuthUtil.getToken, hãy sử dụng quy trình mã thông báo giá trị nhận dạng hoặc quy trình mã xác thực.

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

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

Để di chuyển sang quy trình của mã thông báo giá trị nhận dạng, hãy thực hiện những 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 bất kỳ mã nào bằng cách sử dụng GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() hoặc AccountManager.newChooseAccountIntent() sang Auth.GOOGLE_SIGN_IN_API với cấu hình GoogleSignInOptions.Builder.requestIdToken(...).

Phía máy chủ

Di chuyển sang quy trình xác thực mã 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 xác thực mã 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 bất kỳ mã nào bằng cách sử dụng GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() hoặc AccountManager.newChooseAccountIntent() sang Auth.GOOGLE_SIGN_IN_API với 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 sử dụng GoogleAuthUtil để nhận mã thông báo nhận dạng, bạn nên chuyển sang quy trình mã thông báo mã nhận dạng của 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 di chuyển:

Mã Android

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

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

  • Đơn giản hoá trải nghiệm đăng nhập bằng một lần nhấn
  • 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ực hiện lệnh gọi mạng bổ sung

Để di chuyển sang quy trình của mã thông báo giá trị nhận dạng, hãy thực hiện những 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 bất kỳ mã nào bằng cách sử dụng GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() hoặc AccountManager.newChooseAccountIntent() sang Auth.GOOGLE_SIGN_IN_API với cấu hình GoogleSignInOptions.Builder.requestIdToken(...).

Phía máy chủ

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

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ả ứng dụng Android cũ và mới của bạn. Để xác minh cả hai định dạng mã thông báo, hãy thực hiện thay đổi tương ứng với thư viện ứng dụng mà bạn sử dụng (nếu bạn dùng một định 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 (Thư viện ứng dụng API của Google): nếu bạn sử dụng v1, hãy nâng cấp lên phiên bản 1.1.6 trở lên; nếu bạn sử dụng phiên bản 2, hãy nâng cấp lên phiên bản 2.0.0-RC1 trở lê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ừ luồng mã xác thực máy chủ GoogleAuthUtil

Nếu sử dụng GoogleAuthUtil để lấy mã xác thực máy chủ, bạn nên chuyển sang quy trình mã xác thực của 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 di chuyển:

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 + mã ứng dụng khách cho máy chủ web của bạn làm tham số scope cho lệnh gọi GoogleAuthUtil.getToken (oauth2:server:client_id:9414861317621.apps.googleusercontent.com).

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

  • Đơn giản hoá trải nghiệm đăng nhập bằng một lần nhấn
  • 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 mã 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

Để di chuyển sang quy trình mã xác thực 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 bất kỳ mã nào bằng cách sử dụng GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() hoặc AccountManager.newChooseAccountIntent() sang Auth.GOOGLE_SIGN_IN_API với cấu hình GoogleSignInOptions.Builder.requestServerAuthCode(...).

Phía máy chủ

Giữ lại mã hiện tại, nhưng chỉ định https://oauth2.googleapis.com/token làm điểm cuối máy chủ mã thông báo khi tạo đối tượng GoogleAuthorizationCodeTokenRequest để bạn có thể nhận được mã thông báo mã nhận dạng kèm theo 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 thực hiện một lệnh gọi mạng khác. Điểm cuối này hoàn toàn tương thích ngược và mã bên dưới sẽ hoạt động đối với các mã xác thực máy chủ được truy xuất từ cả quá trình triển khai ứng dụng Android cũ và mới của bạn.

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