Tổng quan
Ngày 16 tháng 2 năm 2022, chúng tôi đã thông báo kế hoạch làm cho các hoạt động tương tác với OAuth của Google trở nên an toàn hơn bằng cách sử dụng các quy trình OAuth bảo mật hơn. Tài liệu hướng dẫn này giúp bạn hiểu được những thay đổi cần thiết và các bước để di chuyển thành công từ luồng ngoài phạm vi OAuth (OOB) sang phương án thay thế được hỗ trợ.
Nỗ lực này là 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 khi tương tác với các điểm cuối ủy quyền OAuth 2.0 của Google.
OOB là gì?
OAuth nằm ngoài băng tần (OOB), còn gọi là tùy chọn sao chép/dán thủ công, là một quy trình cũ được phát triển để hỗ trợ các ứng dụng gốc không có URI chuyển hướng để chấp nhận thông tin xác thực sau khi người dùng phê duyệt yêu cầu đồng ý OAuth. Luồng OOB gây ra nguy cơ lừa đảo từ xa và khách hàng phải chuyển sang một phương thức thay thế để bảo vệ chống lại lỗ hổng này.Chúng tôi sẽ ngừng cung cấp luồng OOB cho tất cả các loại ứng dụng, chẳng hạn như ứng dụng web, Android, iOS, Universal Windows Platform (UWP), ứng dụng Chrome, TV và các thiết bị đầu vào có giới hạn, ứng dụng cho máy tính.
Ngày tuân thủ chính
- Ngày 28 tháng 2 năm 2022 – Quy trình sử dụng OAuth mới bị chặn đối với luồng OOB
- Ngày 5 tháng 9 năm 2022 – một cảnh báo dành cho người dùng có thể xuất hiện trước những yêu cầu OAuth không tuân thủ chính sách
- Ngày 3 tháng 10 năm 2022 – Đối với các ứng dụng OAuth được tạo trước ngày 28 tháng 2 năm 2022, luồng OOB sẽ ngừng hoạt động
- Ngày 31 tháng 1 năm 2023 – tất cả ứng dụng hiện có đều bị chặn (bao gồm cả những ứng dụng được miễn trừ)
Thông báo lỗi hiển thị với người dùng đố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 lấy sự đồng ý OAuth trong Google API Console.
- Xác định xem bạn có bị ảnh hưởng hay không.
- Hãy chuyển sang một giải pháp thay thế an toàn hơn nếu bạn bị ảnh hưởng.
Xác định xem bạn có bị ảnh hưởng hay không
Việc ngừng sử dụng này chỉ áp dụng cho các ứng dụng phát hành chính thức (tức là những ứng dụng có trạng thái phát hành được đặt là Đang phát hành chính thức). Quy trình này sẽ tiếp tục áp dụng cho các ứng dụng có trạng thái Kiểm thử phát hành.
Xem lại trạng thái phát hành của bạn trong OAuth Consent Screen page của Google API Console và tiếp tục thực hiện bước tiếp theo nếu bạn đang sử dụng luồng OOB trong một dự án có trạng thái xuất bản là "Đang sản xuất".
Cách xác định xem ứng dụng có đang sử dụng luồng OOB hay không
Kiểm tra mã ứng dụng của bạn hoặc lệnh 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 ủy quyền OAuth của Google mà ứng dụng của bạn có đang sử dụng giá trị URI chuyển hướng OOB hay không.
Kiểm tra mã ứng dụng của bạn
redirect_uri
có bất kỳ giá trị nào sau đây hay không:redirect_uri=urn:ietf:wg:oauth:2.0:oob
redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
redirect_uri=oob
Kiểm tra cuộc gọi đi qua mạng
- Ứ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 các tiện ích của Chrome
- Chọn hộp kiểm Chế độ nhà phát triển ở góc trên cùng bên phải của trang tiện ích
- Chọn phần mở rộng mà bạn muốn theo dõi
- Nhấp vào liên kết trang nền trong phần Kiểm tra chế độ xem của trang tiện ích
- Cửa sổ bật lên Công cụ cho nhà phát triển sẽ mở ra để 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 các công cụ
- 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 mạng có sẵn cho hệ điều hành mà ứng dụng được phát triển
redirect_uri
có bất kỳ
giá trị nào sau đây hay không:
redirect_uri=urn:ietf:wg:oauth:2.0:oob
redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
redirect_uri=oob
https://accounts.google.com/o/oauth2/v2/auth? response_type=code& scope=<SCOPES>& state=<STATE>& redirect_uri=urn:ietf:wg:oauth:2.0:oob& client_id=<CLIENT_ID>
Chuyển sang một giải pháp thay thế an toàn
Ứng dụng khách dành cho thiết bị di động (Android / iOS)
Nếu xác định rằng ứng dụng của mình đang sử dụng luồng OOB với loại ứng dụng khách OAuth hoặc Android, bạn nên chuyển sang sử dụng SDK cho thiết bị di động đăng nhập bằng Google (Android, iOS).
SDK giúp bạn dễ dàng truy cập vào các API của Google và xử lý mọi lệnh gọi đến các điểm cuối ủy quyền OAuth 2.0 của Google.
Tài liệu liên kết dưới đây cung cấp thông tin về cách sử dụng SDK đăng nhập của Google để truy cập API Google mà không cần sử dụng URI chuyển hướng OOB.
Truy cập Google API trên Android
Truy cập phía máy chủ (ngoại tuyến)
Ví dụ bên dưới cho thấy cách truy cập các API của Google trên phía máy chủ trên Android.Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); try { GoogleSignInAccount account = task.getResult(ApiException.class); // request a one-time authorization code that your server exchanges for an // access token and sometimes refresh token String authCode = account.getServerAuthCode(); // Show signed-in UI updateUI(account); // TODO(developer): send code to server and exchange for access/refresh/ID tokens } catch (ApiException e) { Log.w(TAG, "Sign-in failed", e); updateUI(null); }
Xem lại hướng dẫn truy cập phía máy chủ về cách truy cập API Google từ phía máy chủ.
Truy cập API Google trong ứng dụng iOS
Quyền truy cập phía máy khách
Ví dụ bên dưới cho biết cách truy cập API 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 đưa 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 cấp quyền tìm nạp (GTMFetcherAuthorizationProtocol
) với
thư viện ứng dụng API Google cho Objective-C cho REST.
Xem lại hướng dẫn truy cập phía máy khách về cách truy cập API Google ở phía máy khách. về cách truy cập API Google ở phía máy khách.
Truy cập phía máy chủ (ngoại tuyến)
Ví dụ bên dưới cho thấy cách truy cập API 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 lại hướng dẫn truy cập phía máy chủ về cách truy cập API Google từ phía máy chủ.
Ứng dụng Chrome
Nếu xác định rằng ứng dụng của mình đang sử dụng luồng OOB trên ứng dụng khách của Chrome, bạn nên chuyển sang sử dụng API Chrome Identity.
Ví dụ dưới đây cho biết cách lấy tất cả danh bạ của người dùng mà không cần sử dụng URI chuyển hướng OOB.
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) }); }); }); };
Xem lại hướng dẫn về API Chrome Identity để biết thêm thông tin về cách truy cập vào tính năng xác thực người dùng và gọi các điểm cuối của Google bằng API Chrome Identity.
Ứng dụng web
Nếu xác định rằng ứng dụng của mình đang sử dụng luồng OOB cho một ứng dụng web, bạn nên chuyển sang sử dụng một trong các thư viện ứng dụng API của Google. Bạn có thể xem danh sách thư viện ứng dụng cho các ngôn ngữ lập trình tại đây.
Các thư viện này giúp bạn dễ dàng truy cập vào các API của Google và xử lý tất cả các lệnh gọi đến điểm cuối của Google.
Truy cập phía máy chủ (ngoại tuyến)
- Đứng trên máy chủ và xác định điểm cuối có thể truy cập công khai (URI chuyển hướng) để nhận mã ủy quyền.
- Định cấu hình URI chuyển hướng trong Credentials page của Google API Console
Đoạn mã dưới đây cho thấy ví dụ về NodeJS về việc sử dụng API Google Drive để liệt kê các tệp trên Google Drive của người dùng ở phía máy chủ mà không cần sử dụng URI chuyển hướng.
async function main() { const server = http.createServer(async function (req, res) { if (req.url.startsWith('/oauth2callback')) { let q = url.parse(req.url, true).query; if (q.error) { console.log('Error:' + q.error); } else { // Get access and refresh tokens (if access_type is offline) let { tokens } = await oauth2Client.getToken(q.code); oauth2Client.setCredentials(tokens); // Example of using Google Drive API to list filenames in user's Drive. const drive = google.drive('v3'); drive.files.list({ auth: oauth2Client, pageSize: 10, fields: 'nextPageToken, files(id, name)', }, (err1, res1) => { // TODO(developer): Handle response / error. }); } } }
Xem lại hướng dẫn về ứng dụng web phía máy chủ về cách truy cập API Google từ phía máy chủ.
Quyền truy cập phía máy khách
Đoạn mã dưới đây trong JavaScript sẽ cho thấy một ví dụ về cách sử dụng API Google để truy cập vào các sự kiện trên lịch của người dùng ở phía máy khách.
// initTokenClient() initializes a new token client with your // web app's client ID and the scope you need access to const client = google.accounts.oauth2.initTokenClient({ client_id: 'YOUR_GOOGLE_CLIENT_ID', scope: 'https://www.googleapis.com/auth/calendar.readonly', // callback function to handle the token response callback: (tokenResponse) => { if (tokenResponse && tokenResponse.access_token) { gapi.client.setApiKey('YOUR_API_KEY'); gapi.client.load('calendar', 'v3', listUpcomingEvents); } }, }); function listUpcomingEvents() { gapi.client.calendar.events.list(...); }
Xem lại hướng dẫn về ứng dụng web phía máy khách về cách truy cập API Google từ phía máy khách.
Ứng dụng dành cho máy tính để bàn
Nếu xác định rằng ứng dụng của mình đang sử dụng luồng OOB trên ứng dụng trên máy tính, bạn nên chuyển sang sử dụng
luồng địa chỉ IP vòng lặp (localhost
hoặc 127.0.0.1
).