Hướng dẫn di chuyển luồng ngoài phạm vi (OOB)

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 mức độ an toàn cho các hoạt động tương tác qua OAuth của Google bằng cách sử dụng các quy trình OAuth bảo mật hơn. Hướng dẫn này giúp bạn nắm được các thay đổi và bước cần thực hiện để di chuyển thành công từ quy trình OAuth ngoài băng tần (OOB) sang các giải pháp thay thế được hỗ trợ.

Nỗ lực nà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 điểm cuối uỷ quyền OAuth 2.0 của Google.

OOB là gì?

OAuth ngoài phạm vi (OOB), còn được gọi là tuỳ 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 đăng nhập sau khi người dùng phê duyệt yêu cầu đồng ý OAuth. Quy trình OOB có thể gây ra rủi ro lừa đảo từ xa và các ứng dụng phải di chuyển sang một phương thức khác để ngăn chặn lỗ hổng bảo mật này.

Quy trình OOB sẽ ngừng hoạt động trên tất cả các loại ứng dụng khách, tức là ứng dụng web, Android, iOS, Universal Windows Platform (UWP), ứng dụng Chrome, TV và thiết bị đầu vào giới hạn, ứng dụng dành 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 sử dụng OAuth
  • Ngày 5 tháng 9 năm 2022 – một 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 3 tháng 10 năm 2022 – Quy trình OOB sẽ ngừng hoạt động đối với các ứng dụng OAuth được tạo trước ngày 28 tháng 2 năm 2022
  • Ngày 31 tháng 1 năm 2023 – tất cả ứng dụng hiện tại đề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ẽ truyền đạt cho người dùng 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 yêu cầu sự đồng ý của OAuth trong Bảng điều khiển API của Google.

Có hai bước chính để hoàn tất quá trình di chuyển:
  1. Xác định xem bạn có bị ảnh hưởng hay không.
  2. 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 không

Việc ngừng sử dụng này chỉ áp dụng cho các ứng dụng chính thức (tức là các ứng dụng có trạng thái xuất bản được đặt thành Trong bản phát hành công khai. Quy trình này sẽ tiếp tục hoạt động đối với các ứng dụng có Trạng thái xuất bản đang kiểm thử.

Xem lại trạng thái xuất bản của bạn trong OAuth Consent Screen pagecủa Google API Console và tiến hành bước tiếp theo nếu bạn đang sử dụng quy trình OOB trong một dự án có trạng thái xuất bản là "Phát hành công khai".

Cách xác định xem ứng dụng của bạn có sử dụng quy trình 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 uỷ quyền OAuth của Google mà ứng dụng đang thực hiện có đang dùng giá trị URI chuyển hướng OOB hay không.

Kiểm tra mã xử lý ứng dụng của bạn

Xem lại phần mã xử lý ứng dụng mà bạn đang thực hiện lệnh gọi đến các điểm cuối uỷ quyền của Google OAuth và xác định xem tham số 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
Yêu cầu luồng chuyển hướng OOB mẫu sẽ có dạng như sau:
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>

Kiểm tra lệnh gọi mạng đi

Phương thức kiểm tra lệnh gọi mạng sẽ thay đổi tuỳ thuộc vào loại ứng dụng khách của bạ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 của Google OAuth và xác định xem tham số 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
Yêu cầu quy trình chuyển hướng OOB mẫu sẽ có dạng như dưới đây:
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>

Di chuyển sang một giải pháp thay thế an toàn

Ứng dụng trên 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 quy trình OOB với loại ứng dụng OAuth dành cho Android hoặc iOS, bạn nên chuyển sang sử dụng SDK dành cho thiết bị di động Đăng nhập bằng Google của chúng tôi (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 đ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 dưới đây cung cấp thông tin về cách sử dụng SDK đăng nhập bằng Google để truy cập vào API của Google mà không cần sử dụng URI chuyển hướng OOB.

Truy cập API của Google trên Android

Truy cập phía máy chủ (ngoại tuyến)
Ví dụ bên dưới cho biết cách truy cập vào các API của Google ở 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ủ để biết cách truy cập vào các API của Google từ phía máy chủ.

Truy cập API của 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 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 đư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 sử dụng trình uỷ quyền cho 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 lại hướng dẫ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 API Google ở phía máy khách.

Quyền truy cập phía máy chủ (ngoại tuyến)
Ví dụ bên dưới cho biết cách truy cập 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 các API của Google từ phía máy chủ.

Ứng dụng ứng dụng Chrome

Nếu xác định rằng ứng dụng của mình đang sử dụng quy trình OOB trên ứng dụng ứng dụng Chrome, bạn nên chuyển sang sử dụng API Chrome Identity.

Ví dụ bên dưới cho thấy cách lấy toàn bộ 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 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 nhiều 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ả lệnh gọi đến các điểm cuối của Google.

Quyền truy cập phía máy chủ (ngoại tuyến)
Chế độ truy cập phía máy chủ (ngoại tuyến) yêu cầu bạn thực hiện những việc sau:
  • Tạo một máy chủ và xác định một điểm cuối có thể truy cập công khai (URI chuyển hướng) để nhận mã uỷ 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ụ của NodeJS về cách 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 OOB.

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ủ để biết cách truy cập vào các API của 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 cho thấy một ví dụ về cách sử dụng API Google để truy cập vào 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 để biết cách truy cập vào các API của Google từ phía máy khách.

Ứng dụng dành cho máy tính

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 dành cho máy tính, bạn nên chuyển sang sử dụng luồng địa chỉ IP lặp lại (localhost hoặc 127.0.0.1).