Tổng quan
Vào ngày 16 tháng 2 năm 2022, chúng tôi đã thông báo kế hoạch tăng cường tính an toàn cho các hoạt động tương tác với Google OAuth bằng cách sử dụng các quy trình OAuth an toàn hơn. Hướng dẫn này giúp bạn hiểu rõ những thay đổi và bước cần thiết để di chuyển thành công từ quy trình địa chỉ IP lặp lại sang các phương án thay thế được hỗ trợ.
Đây là một biện pháp bảo vệ chống lại các cuộc tấn công lừa đảo và mạo danh ứng dụng trong quá trình tương tác với các điểm cuối uỷ quyền OAuth 2.0 của Google.
Quy trình Địa chỉ IP lặp lại là gì?
Luồng địa chỉ IP lặp lại hỗ trợ việc sử dụng địa chỉ IP lặp lại hoặc localhost làm thành phần máy chủ lưu trữ của URI chuyển hướng, nơi thông tin đăng nhập được gửi đến sau khi người dùng phê duyệt yêu cầu đồng ý OAuth.
Quy trình này dễ bị tấn công xen giữa, trong đó một ứng dụng độc hại truy cập vào cùng một giao diện lặp lại trên một số hệ điều hành có thể chặn phản hồi từ máy chủ uỷ quyền đến URI chuyển hướng đã cho và có quyền truy cập vào mã uỷ quyền.
Quy trình địa chỉ IP lặp lại sẽ ngừng hoạt động đối với các loại ứng dụng OAuth trên iOS, Android và Chrome, nhưng sẽ tiếp tục được hỗ trợ trên các ứng dụng dành cho máy tính.
Các mốc thời gian quan trọng cần tuân thủ
- Ngày 14 tháng 3 năm 2022 – chặn các ứng dụng OAuth mới sử dụng quy trình địa chỉ IP lặp lại
- Ngày 1 tháng 8 năm 2022 – thông báo cảnh báo dành cho người dùng có thể xuất hiện đối với các yêu cầu OAuth không tuân thủ
- Ngày 31 tháng 8 năm 2022 – chặn luồng Địa chỉ IP Loopback đối với các ứng dụng OAuth trên Android, ứng dụng Chrome và iOS được tạo trước ngày 14 tháng 3 năm 2022
- Ngày 21 tháng 10 năm 2022 – tất cả ứng dụng hiện có đều bị chặn (bao gồm cả ứng dụng được miễn trừ)
Thông báo lỗi dành cho người dùng sẽ xuất hiện đối với các yêu cầu không tuân thủ. Thông báo này sẽ cho người dùng biết rằng ứng dụng đã bị chặn, đồng thời hiển thị email hỗ trợ mà bạn đã đăng ký trong màn hình xin phép bằng OAuth trong Google Cloud Console.
Có hai bước chính cần hoàn tất để thực hiện quy trình di chuyển:
- Xác định xem bạn có bị ảnh hưởng hay không.
- Hãy chuyển sang một phương thức thay thế được hỗ trợ nếu bạn bị ảnh hưởng.
Xác định xem bạn có bị ảnh hưởng hay không
Xem lại loại ứng dụng OAuth
Chuyển đến trang Ứng dụng của Google Cloud Console rồi xem loại ứng dụng OAuth trong mục Mã ứng dụng khách OAuth 2.0. Đây sẽ là một trong những loại sau: Ứng dụng web, Android, iOS, Nền tảng Windows chung (UWP), Ứng dụng Chrome, TV và thiết bị đầu vào hạn chế, Ứng dụng dành cho máy tính.
Chuyển sang bước tiếp theo nếu loại ứng dụng của bạn là Android, ứng dụng Chrome hoặc iOS và bạn đang sử dụng quy trình địa chỉ IP lặp lại.
Bạn không cần làm gì liên quan đến việc ngừng sử dụng này nếu đang dùng quy trình địa chỉ IP lặp lại trên ứng dụng OAuth dành cho máy tính, vì việc sử dụng loại ứng dụng OAuth đó sẽ tiếp tục được hỗ trợ.
Cách xác định xem ứng dụng của bạn có đang sử dụng quy trình địa chỉ IP lặp lại hay không
Kiểm tra mã ứng dụng hoặc cuộc gọi mạng đi (trong trường hợp ứng dụng của bạn đang sử dụng thư viện OAuth) để xác định xem yêu cầu uỷ quyền Google OAuth mà ứng dụng của bạn đang thực hiện có sử dụng các giá trị URI chuyển hướng lặp lại hay không.
Kiểm tra mã xử lý ứng dụng
Xem lại phần mã xử lý ứng dụng mà bạn đang thực hiện lệnh gọi đến điểm cuối uỷ quyền của Google OAuth và xác định xem tham số redirect_uri có giá trị nào sau đây hay không:
redirect_uri=http://127.0.0.1:<port>(ví dụ:redirect_uri=http://127.0.0.1:3000)redirect_uri=http://[::1]:<port>(ví dụ:redirect_uri=http://[::1]:3000)redirect_uri=http://localhost:<port>(ví dụ:redirect_uri=http://localhost:3000)
Yêu cầu mẫu về luồng chuyển hướng địa chỉ IP lặp lại có dạng như sau:
https://accounts.google.com/o/oauth2/v2/auth? redirect_uri=http://localhost:3000& response_type=code& scope=<SCOPES>& state=<STATE>& client_id=<CLIENT_ID>
Kiểm tra lệnh gọi mạng đi
Phương thức kiểm tra lệnh gọi mạng sẽ khác nhau tuỳ thuộc vào loại ứng dụng của bạn.
- Ứng dụng web – kiểm tra hoạt động mạng trên Chrome
- Android – kiểm tra lưu lượng truy cập mạng bằng Trình kiểm tra mạng
- Ứng dụng Chrome
- Chuyển đến trang tiện ích Chrome
- Đánh dấu vào hộp Chế độ nhà phát triển ở góc trên cùng bên phải của trang tiện ích
- Chọn tiện ích bạn muốn theo dõi
- Nhấp vào đường liên kết trang nền trong phần Kiểm tra chế độ xem của trang tiện ích
- Hộp thoại Công cụ cho nhà phát triển sẽ mở ra, nơi bạn có thể theo dõi lưu lượng truy cập mạng trong thẻ Mạng
- iOS – Phân tích lưu lượng truy cập HTTP bằng Instruments
- Ứng dụng dành cho máy tính – sử dụng công cụ thu thập dữ liệu mạng có sẵn cho hệ điều hành mà ứng dụng được phát triển
Trong khi kiểm tra các lệnh gọi mạng, hãy tìm các yêu cầu được gửi đến điểm cuối uỷ quyền OAuth của Google và xác định xem tham số redirect_uri có giá trị nào sau đây hay không:
redirect_uri=http://127.0.0.1:<port>(ví dụ:redirect_uri=http://127.0.0.1:3000)redirect_uri=http://[::1]:<port>(ví dụ:redirect_uri=http://[::1]:3000)redirect_uri=http://localhost:<port>(ví dụ:redirect_uri=http://localhost:3000)
Yêu cầu mẫu về luồng chuyển hướng địa chỉ IP lặp lại có dạng như sau:
https://accounts.google.com/o/oauth2/v2/auth? redirect_uri=http://localhost:3000& response_type=code& scope=<SCOPES>& state=<STATE>& client_id=<CLIENT_ID>
Chuyển sang một phương thức thay thế được hỗ trợ
Ứng dụng di động (Android và iOS)
Nếu xác định rằng ứng dụng của bạn đang sử dụng quy trình địa chỉ IP lặp lại với loại ứng dụng OAuth Android hoặc iOS, thì bạn nên chuyển sang sử dụng các SDK được đề xuất (Android, iOS).
SDK giúp bạn truy cập vào các API của Google và xử lý tất cả lệnh gọi đến điểm cuối uỷ quyền OAuth 2.0 của Google.
Các đường liên kết đến tài liệu sau đây cung cấp thông tin về cách sử dụng SDK được đề xuất để truy cập vào API của Google mà không cần sử dụng URI chuyển hướng địa chỉ IP lặp lại.
Truy cập vào API của Google trên Android
Quyền truy cập phía máy khách
Ví dụ sau đây cho thấy cách truy cập vào API của Google ở phía máy khách trên Android bằng Thư viện Android của Dịch vụ nhận dạng của Google được đề xuất.
List<Scopes> requestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA);
AuthorizationRequest authorizationRequest =
AuthorizationRequest.builder()
.setRequestedScopes(requestedScopes)
.build();
Identity.getAuthorizationClient(activity)
.authorize(authorizationRequest)
.addOnSuccessListener(
authorizationResult -> {
if (authorizationResult.hasResolution()) {
// Access needs to be granted by the user
PendingIntent pendingIntent =
authorizationResult.getPendingIntent();
try {
startIntentSenderForResult(
pendingIntent.getIntentSender(),
REQUEST_AUTHORIZE, null, 0, 0, 0, null);
} catch (IntentSender.SendIntentException e) {
Log.e(
TAG,
"Couldn't start Authorization UI: "
+ e.getLocalizedMessage());
}
} else {
// Access already granted, continue with user action
saveToDriveAppFolder(authorizationResult);
}
})
.addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));
Truyền authorizationResult vào phương thức đã xác định để lưu nội dung vào thư mục trên Drive của người dùng. authorizationResult có phương thức getAccessToken() trả về mã truy cập.
Quyền truy cập phía máy chủ (ngoại tuyến)
Ví dụ sau đây cho thấy cách truy cập vào API của Google ở phía máy chủ trên Android.
List<Scopes> requestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA); AuthorizationRequest authorizationRequest = AuthorizationRequest.builder() .requestOfflineAccess(webClientId) .setRequestedScopes(requestedScopes) .build(); Identity.getAuthorizationClient(activity) .authorize(authorizationRequest) .addOnSuccessListener( authorizationResult -> { if (authorizationResult.hasResolution()) { // Access needs to be granted by the user PendingIntent pendingIntent = authorizationResult.getPendingIntent(); try { startIntentSenderForResult( pendingIntent.getIntentSender(), REQUEST_AUTHORIZE, null, 0, 0, 0, null); } catch (IntentSender.SendIntentException e) { Log.e( TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage()); } } else { String authCode = authorizationResult.getServerAuthCode(); } }) .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));
authorizationResult có phương thức getServerAuthCode() trả về mã uỷ quyền mà bạn có thể gửi đến phần phụ trợ để lấy mã truy cập và mã làm mới.
Truy cập vào API của Google trong ứng dụng iOS
Quyền truy cập phía máy khách
Ví dụ sau đây cho thấy cách truy cập vào API của Google ở phía máy khách trên iOS.
user.authentication.do { authentication, error in guard error == nil else { return } guard let authentication = authentication else { return } // Get the access token to attach it to a REST or gRPC request. let accessToken = authentication.accessToken // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for // use with GTMAppAuth and the Google APIs client library. let authorizer = authentication.fetcherAuthorizer() }
Sử dụng mã truy cập để gọi API, bằng cách thêm mã truy cập vào tiêu đề của yêu cầu REST hoặc gRPC (Authorization: Bearer <var>ACCESS_TOKEN</var>) hoặc bằng cách sử dụng trình uỷ quyền của trình tìm nạp (GTMFetcherAuthorizationProtocol) với thư viện ứng dụng API của Google cho Objective-C cho REST.
Xem hướng dẫn truy cập phía máy khách để biết cách truy cập vào API của Google ở phía máy khách.
Quyền truy cập phía máy chủ (ngoại tuyến)
Ví dụ sau đây cho thấy cách truy cập vào API của Google ở phía máy chủ để hỗ trợ ứng dụng iOS.
GIDSignIn.sharedInstance.signIn(
with: signInConfig, presenting: self
) { user, error in
guard error == nil else { return }
guard let user = user else { return }
// request a one-time authorization code that your server exchanges for
// an access token and refresh token
let authCode = user.serverAuthCode
}Xem hướng dẫn truy cập phía máy chủ để biết cách truy cập vào API của Google từ phía máy chủ.
Ứng dụng Chrome cho máy khách
Nếu xác định rằng ứng dụng của bạn đang sử dụng quy trình địa chỉ IP lặp lại trên ứng dụng khách Chrome, thì bạn nên chuyển sang sử dụng API Nhận dạng của Chrome.
Ví dụ sau đây cho thấy cách lấy tất cả thông tin liên hệ của người dùng mà không cần sử dụng URI chuyển hướng địa chỉ IP lặp lại.
window.onload = function() { document.querySelector('button').addEventListener('click', function() { // retrieve access token chrome.identity.getAuthToken({interactive: true}, function(token) { // .......... // the following example shows how to use a retrieved access token with an // appropriate scope to call the Google People API contactGroups.get endpoint fetch( 'https://people.googleapis.com/v1/contactGroups/all' + '?maxMembers=20&key=API_KEY', init) .then((response) => response.json()) .then(function(data) { console.log(data) }); }); }); };
Xem hướng dẫn về Chrome Identity API để biết thêm thông tin về cách xác thực người dùng và gọi các điểm cuối của Google bằng Chrome Identity API.