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 độ 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 vòng lặp về các lựa chọ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 giả mạ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 Loopback là gì?
Luồng địa chỉ IP vòng lặp hỗ trợ việc sử dụng địa chỉ IP vòng lặp hoặclocalhost
làm thành phần máy chủ lưu trữ của URI chuyển hướng. Đây là 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 vòng lặp 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à giành quyền truy cập vào mã uỷ quyền.
Quy trình địa chỉ IP Loopback đang bị ngừng sử dụng cho các loại ứng dụng OAuth gốc 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 ngày quan trọng về việc tuân thủ
- Ngày 14 tháng 3 năm 2022 – các ứng dụng OAuth mới không được phép sử dụng quy trình địa chỉ IP Loopback
- Ngày 1 tháng 8 năm 2022 – người dùng có thể thấy thông báo cảnh báo đối với các yêu cầu OAuth không tuân thủ
- Ngày 31 tháng 8 năm 2022 – luồng địa chỉ IP Loopback bị chặn đối với các ứng dụng Android gốc, ứng dụng Chrome và ứng dụng OAuth trên 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ả các ứng dụng hiện có đều bị chặn (kể 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 trong khi hiển thị email hỗ trợ mà bạn đã đăng ký trong màn hình xin phép bằng OAuth trong Google API Console.
- Xác định xem bạn có bị ảnh hưởng hay không.
- Nếu bị ảnh hưởng, hãy chuyển sang một phương thức thay thế được hỗ trợ.
Xác định xem bạn có bị ảnh hưởng hay không
Xem lại loại mã ứng dụng OAuth
Chuyển đến Clients page của Google Cloud Console rồi xem loại mã ứng dụng OAuth của bạn trong phần Mã ứng dụng OAuth 2.0. Đó sẽ là một trong những ứng dụng sau: Ứng dụng web, Android, iOS, Nền tảng Windows đa năng (UWP), Ứng dụng Chrome, TV và thiết bị có chế độ đầ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 loopback.
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 sử dụng quy trình địa chỉ IP loopback trên ứng dụng OAuth dành cho ứng dụng máy tính vì việc sử dụng với 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 vòng lặp hay không
Kiểm tra mã ứng dụng hoặc lệnh gọi mạng đi (trong trường hợp ứng dụng của bạn đang dùng một 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ó đang dùng các giá trị URI chuyển hướng vòng lặp hay không.
Kiểm tra mã ứng dụng
redirect_uri
có giá trị nào trong số các giá trị 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
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 cuộc gọi mạng đi
- Ứ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 Công cụ kiểm tra mạng
-
Ứng dụng Chrome
- Chuyển đến trang tiện ích của Chrome
- Chọn hộp đánh dấu 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 mà 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 khung hiển thị của trang tiện ích
- Một cửa sổ bật lên Công cụ cho nhà phát triển sẽ mở ra để bạn có thể giám sát 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
- Universal Windows Platform (UWP) – Kiểm tra lưu lượng truy cập mạng trong Visual Studio
- Ứng dụng dành cho máy tính – sử dụng công cụ ghi lại lưu lượng truy cập mạng có sẵn cho hệ điều hành mà ứng dụng được phát triển
redirect_uri
có giá trị nào trong số các giá trị 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
https://accounts.google.com/o/oauth2/v2/auth? redirect_uri=http://localhost:3000& response_type=code& scope=<SCOPES>& state=<STATE>& client_id=<CLIENT_ID>
Di chuyển sang một phương thức thay thế được hỗ trợ
Ứng dụng di động (Android / 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 vòng lặp với loại ứng dụng OAuth Android hoặc iOS, bạn nên di chuyển sang sử dụng các SDK được đề xuất (Android, iOS).
SDK giúp bạn dễ dàng truy cập vào API của Google và xử lý tất cả các lệnh gọi đến các đ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 bên dưới cung cấp thông tin về cách sử dụng các 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 vòng lặp.
Truy cập vào các 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 các API của Google ở phía máy khách trên Android bằng Thư viện Dịch vụ nhận dạng của Google được đề xuất cho Android.
ListrequestedScopes = 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 mà bạn đã xác định để lưu nội dung vào thư mục ổ đĩa 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ủ (khi không có mạng)
Ví dụ sau đây cho thấy cách truy cập vào các API của Google ở phía máy chủ trên Android.ListrequestedScopes = 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 các API của Google trong một ứng dụng iOS
Quyền truy cập phía máy khách
Ví dụ bên dưới cho thấy cách truy cập vào các 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 ACCESS_TOKEN
) hoặc bằng cách sử dụng trình uỷ quyền trình tìm nạp (GTMFetcherAuthorizationProtocol
) với
Thư viện ứng dụng Google API cho Objective-C cho REST.
Xem hướng dẫn về quyền truy cập phía máy khách để biết cách truy cập vào các API của Google ở phía máy khách. về cách truy cập vào các API của Google ở phía máy khách.
Quyền truy cập phía máy chủ (khi không có mạng)
Ví dụ bên dưới cho thấy cách truy cập vào các API của Google ở phía máy chủ để hỗ trợ một ứ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 về quyền truy cập phía máy chủ để biết cách truy cập vào các API của Google từ phía máy chủ.
Ứng dụng Chrome Client
Nếu xác định rằng ứng dụng của bạn đang sử dụng quy trình địa chỉ IP vòng lặp trên ứng dụng Chrome, thì bạn nên di chuyển sang sử dụng Chrome Identity API.
Ví dụ bên dưới cho thấy cách lấy tất cả người 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 vòng lặp.
window.onload = function() { document.querySelector('button').addEventListener('click', function() { // retrieve access token chrome.identity.getAuthToken({interactive: true}, function(token) { // .......... // the example below 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) }); }); }); };
Hãy xem hướng dẫn về Chrome Identity API để biết thêm thông tin về cách truy cập vào người dùng xác thực và gọi các điểm cuối của Google bằng Chrome Identity API.