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à mang lại trải nghiệm tốt hơn cho người dùng.
Di chuyển khỏi mẫu chống mã truy cập
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ã đã được cấp cho phần phụ trợ, khiến bạn dễ bị chèn mã truy cập từ kẻ tấn công.
Ví dụ: nếu mã Android của bạn giống như ví dụ dưới đây, bạn nên di chuyển ứng dụng sang các phương pháp hay nhất hiện tại.
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ố 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ã thông báo truy cập thu được bằng GoogleAuthUtil.getToken
, hãy 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 bạn chỉ cần 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 quy trình mã thông báo 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 mọi mã sử dụng
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
hoặcAccountManager.newChooseAccountIntent()
sangAuth.GOOGLE_SIGN_IN_API
bằng cấu hìnhGoogleSignInOptions.Builder.requestIdToken(...)
.
Phía máy chủ
- Tạo điểm cuối mới để xác thực mã thông báo giá trị nhận dạng
- Tắt điểm cuối cũ sau khi di chuyển ứng dụng khách
Di chuyển sang luồng 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:
Bên ứng dụng Android
- Xoá quyền
GET_ACCOUNTS
(Danh bạ) nếu bạn yêu cầu - Chuyển mọi mã sử dụng
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
hoặcAccountManager.newChooseAccountIntent()
sangAuth.GOOGLE_SIGN_IN_API
bằng cấu hìnhGoogleSignInOptions.Builder.requestServerAuthCode(...)
.
Phía máy chủ
- Tạo điểm cuối mới cho quy trình mã xác thực máy chủ
- Tắt điểm cuối cũ sau khi di chuyển ứng dụng khách
Bạn vẫn có thể chia sẻ logic truy cập API giữa đ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ừ quy trình mã thông báo nhận dạng GoogleAuthUtil
Nếu sử dụng GoogleAuthUtil
để lấy mã thông báo nhận dạng, bạn nên chuyển sang quy trình mã thông báo nhận dạng mới của API Đăng nhập.
Ví dụ: nếu mã Android của bạn có dạng như ví dụ sau, bạn nên di chuyển:
Trong ví dụ này, các yêu cầu mã thông báo nhận dạng sử dụng audience:server:client_id
cùng với mã ứng dụng 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ã thông báo mã nhận dạng API Đăng nhập mới có các lợi ích sau:
- Tinh giản trải nghiệm đăng nhập bằng một lần chạm
- 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 mọi mã sử dụng
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
hoặcAccountManager.newChooseAccountIntent()
sangAuth.GOOGLE_SIGN_IN_API
bằng cấu hìnhGoogleSignInOptions.Builder.requestIdToken(...)
.
Phía máy chủ
API đăng nhập mới phát hành mã thông báo nhận dạng tuân thủ thông số kỹ thuật của OpenID Connect, không giống như GoogleAuthUtil.getToken
sử dụng một định dạng không dùng nữa.
Cụ thể, đơn vị 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 nhận dạng từ cả ứng dụng Android cũ và mới. Để 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 mà bạn sử dụng (nếu có):
- 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 1, 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 phiên bản 0.9.7 trở lên
- Python hoặc cách triển khai của riêng bạn: chấp nhận cả hai trình phát hành này:
https://accounts.google.com
vàaccounts.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ã xác thực mới của API Đăng nhập.
Ví dụ: nếu mã Android của bạn có dạng như ví dụ sau, bạn nên di chuyển:
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 làm tham số scope
cho lệnh gọi GoogleAuthUtil.getToken
(oauth2:server:client_id:9414861317621.apps.googleusercontent.com
).
Quy trình mã xác thực API Đăng nhập mới có các lợi ích sau:
- Tinh giản trải nghiệm đăng nhập bằng một lần chạm
- 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 nhận dạng chứa thông tin hồ sơ của người dùng khi bạn thực hiện giao dịch 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 mọi mã sử dụng
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
hoặcAccountManager.newChooseAccountIntent()
sangAuth.GOOGLE_SIGN_IN_API
bằng cấu hìnhGoogleSignInOptions.Builder.requestServerAuthCode(...)
.
Phía máy chủ
Giữ mã hiện tại, 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 đối tượng GoogleAuthorizationCodeTokenRequest
để bạn có thể nhận mã thông báo 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 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 cho các mã uỷ quyền máy chủ được truy xuất từ cả quá trình triển khai ứng dụng Android cũ và mới.
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); ...