OAuth 2.0 cho Ứng dụng web phía máy khách

Tài liệu này giải thích cách triển khai ủy quyền OAuth 2.0 để truy cập các API của Google từ một ứng dụng web JavaScript. OAuth 2.0 cho phép người dùng chia sẻ dữ liệu cụ thể với một ứng dụng trong khi vẫn giữ bí mật tên người dùng, mật khẩu và thông tin khác của họ. Ví dụ: một ứng dụng có thể sử dụng OAuth 2.0 để xin phép người dùng lưu trữ tệp trong Google Drive của họ.

Dòng chảy này OAuth 2.0 được gọi là dòng chảy cấp tiềm ẩn. Nó được thiết kế cho các ứng dụng chỉ truy cập API khi người dùng có mặt tại ứng dụng. Các ứng dụng này không có khả năng lưu trữ thông tin bí mật.

Trong quy trình này, ứng dụng của bạn sẽ mở một URL Google sử dụng các tham số truy vấn để xác định ứng dụng của bạn và loại quyền truy cập API mà ứng dụng yêu cầu. Bạn có thể mở URL trong cửa sổ trình duyệt hiện tại hoặc cửa sổ bật lên. Người dùng có thể xác thực với Google và cấp các quyền được yêu cầu. Sau đó, Google sẽ chuyển hướng người dùng trở lại ứng dụng của bạn. Chuyển hướng bao gồm mã thông báo truy cập, mà ứng dụng của bạn xác minh và sau đó sử dụng để thực hiện các yêu cầu API.

Điều kiện tiên quyết

Bật API cho dự án của bạn

Bất kỳ ứng dụng mà các cuộc gọi Google API cần để cho phép những API trong API Console.

Để kích hoạt một API cho dự án của bạn:

  1. Open the API Library trong Google API Console.
  2. If prompted, select a project, or create a new one.
  3. Các API Library liệt kê tất cả các API có sẵn, nhóm lại theo dòng sản phẩm và sự nổi tiếng. Nếu API bạn muốn kích hoạt không hiển thị trong danh sách, tìm kiếm sử dụng để tìm thấy nó, hoặc nhấp vào Xem tất cả ở dòng sản phẩm nó thuộc về.
  4. Chọn API bạn muốn kích hoạt, sau đó nhấn nút Enable.
  5. If prompted, enable billing.
  6. If prompted, read and accept the API's Terms of Service.

Tạo thông tin xác thực ủy quyền

Bất kỳ ứng dụng nào sử dụng OAuth 2.0 để truy cập API Google đều phải có thông tin xác thực ủy quyền xác định ứng dụng đó với máy chủ OAuth 2.0 của Google. Các bước sau giải thích cách tạo thông tin xác thực cho dự án của bạn. Các ứng dụng của bạn sau đó có thể sử dụng thông tin đăng nhập để truy cập các API mà bạn đã bật cho dự án đó.

  1. Go to the Credentials page.
  2. Nhấp vào Tạo thông tin> OAuth ID khách hàng.
  3. Chọn loại ứng dụng ứng dụng Web.
  4. Hoàn thành biểu mẫu. Các ứng dụng sử dụng JavaScript để làm phép nguồn gốc JavaScript của Google yêu cầu API phải chỉ định ủy quyền. Nguồn gốc xác định các miền mà từ đó ứng dụng của bạn có thể gửi yêu cầu đến máy chủ OAuth 2.0. Những nguồn gốc phải tuân theo quy tắc xác nhận của Google .

Xác định phạm vi truy cập

Phạm vi cho phép ứng dụng của bạn chỉ yêu cầu quyền truy cập vào các tài nguyên mà nó cần đồng thời cho phép người dùng kiểm soát lượng quyền truy cập mà họ cấp cho ứng dụng của bạn. Do đó, có thể có mối quan hệ nghịch đảo giữa số phạm vi được yêu cầu và khả năng nhận được sự đồng ý của người dùng.

Trước khi bắt đầu triển khai ủy quyền OAuth 2.0, chúng tôi khuyên bạn nên xác định các phạm vi mà ứng dụng của bạn sẽ cần quyền truy cập.

Các OAuth 2.0 API Phạm vi tài liệu chứa một danh sách đầy đủ các phạm vi mà bạn có thể sử dụng để truy cập Google API.

Nhận mã thông báo truy cập OAuth 2.0

Các bước sau đây cho biết cách ứng dụng của bạn tương tác với máy chủ OAuth 2.0 của Google để có được sự đồng ý của người dùng để thay mặt người dùng thực hiện yêu cầu API. Ứng dụng của bạn phải có sự đồng ý đó trước khi có thể thực thi một yêu cầu API của Google yêu cầu ủy quyền của người dùng.

Bước 1: Định cấu hình đối tượng khách hàng

Nếu bạn đang sử dụng thư viện ứng dụng khách Google API cho JavaScript để xử lý các dòng chảy OAuth 2.0, bước đầu tiên của bạn là để cấu hình gapi.auth2gapi.client đối tượng. Các đối tượng này cho phép ứng dụng của bạn nhận được ủy quyền của người dùng và thực hiện các yêu cầu API được ủy quyền.

Đối tượng khách hàng xác định các phạm vi mà ứng dụng của bạn đang yêu cầu quyền truy cập. Các giá trị này thông báo cho màn hình chấp thuận mà Google hiển thị cho người dùng.

Thư viện máy khách JS

Thư viện máy khách JavaScript đơn giản hóa nhiều khía cạnh của quy trình ủy quyền:

  1. Nó tạo URL chuyển hướng cho máy chủ ủy quyền của Google và cung cấp một phương pháp để hướng người dùng đến URL đó.
  2. Nó xử lý chuyển hướng từ máy chủ đó trở lại ứng dụng của bạn.
  3. Nó xác thực mã thông báo truy cập do máy chủ ủy quyền trả về.
  4. Nó lưu trữ mã thông báo truy cập mà máy chủ ủy quyền gửi đến ứng dụng của bạn và truy xuất nó khi ứng dụng của bạn sau đó thực hiện các lệnh gọi API được ủy quyền.

Đoạn mã dưới đây là một đoạn trích từ các ví dụ hoàn chỉnh thể hiện sau này trong tài liệu này. Mã này khởi sự gapi.client đối tượng, trong đó ứng dụng của bạn sau này sẽ sử dụng để thực hiện cuộc gọi API. Khi đối tượng đó được tạo ra, các gapi.auth2 đối tượng, trong đó ứng dụng của bạn sử dụng để kiểm tra và theo dõi trạng thái ủy quyền của người dùng, cũng được khởi tạo.

Các cuộc gọi đến gapi.client.init xác định các lĩnh vực sau:

  • Các apiKeyclientId giá trị xác định thông tin cho phép ứng dụng của bạn. Như đã thảo luận trong việc tạo ra thông tin cho phép phần, những giá trị có thể thu được trong API Console. Lưu ý rằng clientId là cần thiết nếu ứng dụng của bạn đưa ra yêu cầu API được ủy quyền. Các ứng dụng chỉ thực hiện các yêu cầu trái phép chỉ có thể chỉ định một khóa API.
  • Các scope lĩnh vực xác định một danh sách không gian được phân định của truy cập phạm vi tương ứng đó để các nguồn lực mà ứng dụng của bạn có thể truy cập trên danh nghĩa của người dùng. Các giá trị này thông báo cho màn hình đồng ý mà Google hiển thị cho người dùng.

    Chúng tôi khuyên bạn nên yêu cầu ứng dụng của bạn truy cập vào phạm vi ủy quyền trong ngữ cảnh bất cứ khi nào có thể. Bằng cách yêu cầu quyền truy cập vào dữ liệu người dùng trong bối cảnh, qua phép gia tăng , bạn sẽ giúp người dùng dễ dàng hiểu tại sao ứng dụng của bạn cần truy cập nó được yêu cầu.

  • Các discoveryDocs Xác định lĩnh vực một danh sách các tài liệu API Discovery rằng sử dụng ứng dụng của bạn. Tài liệu Khám phá mô tả bề mặt của một API, bao gồm các lược đồ tài nguyên của nó và thư viện ứng dụng khách JavaScript sử dụng thông tin đó để tạo ra các phương thức mà ứng dụng có thể sử dụng. Trong ví dụ này, mã truy xuất tài liệu khám phá cho phiên bản 3 của API Google Drive.

Sau khi gapi.client.init Hoàn thành cuộc gọi, mã đặt GoogleAuth biến để xác định các đối tượng Google Auth. Cuối cùng, mã thiết lập một trình nghe gọi một hàm khi trạng thái đăng nhập của người dùng thay đổi. (Chức năng đó không được xác định trong đoạn mã.)

var GoogleAuth; // Google Auth object.
function initClient() {
  gapi.client.init({
      'apiKey': 'YOUR_API_KEY',
      'clientId': 'YOUR_CLIENT_ID',
      'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly',
      'discoveryDocs': ['https://www.googleapis.com/discovery/v1/apis/drive/v3/rest']
  }).then(function () {
      GoogleAuth = gapi.auth2.getAuthInstance();

      // Listen for sign-in state changes.
      GoogleAuth.isSignedIn.listen(updateSigninStatus);
  });
}

Điểm cuối OAuth 2.0

Nếu bạn đang truy cập trực tiếp vào các điểm cuối OAuth 2.0, bạn có thể tiến hành bước tiếp theo.

Bước 2: Chuyển hướng đến máy chủ OAuth 2.0 của Google

Để yêu cầu quyền truy cập dữ liệu của người dùng, hãy chuyển hướng người dùng đến máy chủ OAuth 2.0 của Google.

Thư viện máy khách JS

Gọi GoogleAuth.signIn() phương pháp chuyển hướng người dùng đến máy chủ uỷ quyền của Google.

GoogleAuth.signIn();

Trên thực tế, ứng dụng của bạn có thể đặt một giá trị Boolean để xác định xem có nên gọi signIn() phương pháp trước khi cố gắng thực hiện cuộc gọi API.

Đoạn mã dưới đây trình bày cách bạn bắt đầu quy trình cấp quyền người dùng. Lưu ý những điểm sau về đoạn mã:

  • Các GoogleAuth đối tượng tham chiếu trong mã là giống như các biến toàn cầu quy định tại các đoạn mã trong bước 1 .

  • Các updateSigninStatus chức năng là một người biết lắng nghe mà lắng nghe để thay đổi trạng thái ủy quyền của người dùng. Vai trò của nó như là một người biết lắng nghe cũng được định nghĩa trong đoạn mã ở bước 1:
    GoogleAuth.isSignedIn.listen(updateSigninStatus);
  • Đoạn mã xác định hai biến toàn cầu bổ sung:

    • isAuthorized là một biến Boolean cho biết cho dù người dùng đã đăng nhập. Giá trị này có thể được thiết lập khi tải ứng dụng và cập nhật nếu người dùng đăng nhập hoặc ra khỏi ứng dụng.

      Trong đoạn này, sendAuthorizedApiRequest kiểm tra chức năng giá trị của biến để xác định xem ứng dụng nên cố gắng yêu cầu API mà đòi hỏi phải có giấy phép hoặc nhắc nhở người sử dụng để cho phép các ứng dụng.

    • currentApiRequest là một đối tượng mà các cửa hàng chi tiết về yêu cầu API cuối cùng mà người dùng cố gắng. Giá trị của đối tượng được thiết lập khi ứng dụng gọi sendAuthorizedApiRequest chức năng.

      Nếu người dùng đã ủy quyền ứng dụng, yêu cầu sẽ được thực thi ngay lập tức. Nếu không, các chức năng chuyển hướng người dùng để đăng nhập. Sau khi người dùng đăng nhập, các updateSignInStatus chức năng gọi sendAuthorizedApiRequest , đi qua trong yêu cầu tương tự mà đã được thực hiện trước khi dòng chảy cho phép bắt đầu.

var isAuthorized;
var currentApiRequest;

/**
 * Store the request details. Then check to determine whether the user
 * has authorized the application.
 *   - If the user has granted access, make the API request.
 *   - If the user has not granted access, initiate the sign-in flow.
 */
function sendAuthorizedApiRequest(requestDetails) {
  currentApiRequest = requestDetails;
  if (isAuthorized) {
    // Make API request
    // gapi.client.request(requestDetails)

    // Reset currentApiRequest variable.
    currentApiRequest = {};
  } else {
    GoogleAuth.signIn();
  }
}

/**
 * Listener called when user completes auth flow. If the currentApiRequest
 * variable is set, then the user was prompted to authorize the application
 * before the request executed. In that case, proceed with that API request.
 */
function updateSigninStatus(isSignedIn) {
  if (isSignedIn) {
    isAuthorized = true;
    if (currentApiRequest) {
      sendAuthorizedApiRequest(currentApiRequest);
    }
  } else {
    isAuthorized = false;
  }
}

Điểm cuối OAuth 2.0

Tạo URL để truy cập yêu cầu từ 2,0 endpoint OAuth của Google tại https://accounts.google.com/o/oauth2/v2/auth . Điểm cuối này có thể truy cập được qua HTTPS; các kết nối HTTP đơn giản bị từ chối.

Máy chủ ủy quyền của Google hỗ trợ các tham số chuỗi truy vấn sau cho các ứng dụng máy chủ web:

Thông số
client_id Yêu cầu

ID khách hàng cho ứng dụng của bạn. Bạn có thể tìm thấy giá trị này trong API ConsoleCredentials page.

redirect_uri Yêu cầu

Xác định vị trí máy chủ API chuyển hướng người dùng sau khi người dùng hoàn thành quy trình ủy quyền. Giá trị chính xác phải phù hợp với một trong những URI chuyển hướng có thẩm quyền cho khách hàng OAuth 2.0, mà bạn đã cấu hình trong của khách hàng API ConsoleCredentials page. Nếu giá trị này không phù hợp với một chuyển hướng URI có thẩm quyền cho quy client_id bạn sẽ nhận được một redirect_uri_mismatch lỗi.

Lưu ý rằng http hoặc https chương trình, trường hợp, và dấu gạch chéo ( ' / ') phải tất cả các trận đấu.

response_type Yêu cầu

Các ứng dụng JavaScript cần phải thiết lập giá trị của tham số để token . Giá trị này chỉ thị cho phép máy chủ của Google để trở access token như một name=value cặp trong nhận dạng mảnh URI ( # ) mà người dùng được chuyển hướng sau khi hoàn thành quá trình cấp phép.

scope Yêu cầu

Danh sách các phạm vi được phân tách bằng dấu cách xác định các tài nguyên mà ứng dụng của bạn có thể truy cập thay mặt cho người dùng. Các giá trị này thông báo cho màn hình chấp thuận mà Google hiển thị cho người dùng.

Phạm vi cho phép ứng dụng của bạn chỉ yêu cầu quyền truy cập vào các tài nguyên mà nó cần đồng thời cho phép người dùng kiểm soát lượng quyền truy cập mà họ cấp cho ứng dụng của bạn. Do đó, có một mối quan hệ nghịch đảo giữa số lượng phạm vi được yêu cầu và khả năng nhận được sự đồng ý của người dùng.

Chúng tôi khuyên ứng dụng của bạn nên yêu cầu quyền truy cập vào phạm vi ủy quyền trong ngữ cảnh bất cứ khi nào có thể. Bằng cách yêu cầu quyền truy cập vào dữ liệu người dùng trong bối cảnh, qua phép gia tăng , bạn sẽ giúp người dùng dễ dàng hiểu tại sao ứng dụng của bạn cần truy cập nó được yêu cầu.

state Khuyến khích

Chỉ định bất kỳ giá trị chuỗi nào mà ứng dụng của bạn sử dụng để duy trì trạng thái giữa yêu cầu ủy quyền của bạn và phản hồi của máy chủ ủy quyền. Các máy chủ trả về giá trị chính xác mà bạn gửi đi như một name=value cặp trong nhận dạng đoạn URL ( # ) của redirect_uri sau khi người dùng cho phép hoặc từ chối yêu cầu truy cập ứng dụng của bạn.

Bạn có thể sử dụng thông số này cho một số mục đích, chẳng hạn như hướng người dùng đến tài nguyên chính xác trong ứng dụng của bạn, gửi các lỗi khác và giảm thiểu giả mạo yêu cầu trên nhiều trang web. Kể từ khi bạn redirect_uri có thể đoán, sử dụng một state giá trị có thể làm tăng sự đảm bảo bạn rằng một kết nối đến là kết quả của một yêu cầu xác thực. Nếu bạn tạo một chuỗi ngẫu nhiên hoặc mã hóa băm của cookie hoặc một giá trị khác nắm bắt trạng thái của khách hàng, bạn có thể xác thực phản hồi để đảm bảo thêm rằng yêu cầu và phản hồi bắt nguồn từ cùng một trình duyệt, cung cấp khả năng bảo vệ chống lại các cuộc tấn công như trang web chéo yêu cầu giả mạo. Xem OpenID Connect tài liệu cho một ví dụ về cách tạo và xác nhận một state tượng trưng.

include_granted_scopes Không bắt buộc

Cho phép các ứng dụng sử dụng ủy quyền gia tăng để yêu cầu quyền truy cập vào các phạm vi bổ sung trong ngữ cảnh. Nếu bạn thiết lập giá trị của tham số này để true và yêu cầu cấp phép được cấp, sau đó các thẻ truy cập mới cũng sẽ bao gồm bất kỳ phạm vi mà người dùng trước đó cấp quyền truy cập ứng dụng. Xem các phép gia tăng phần cho các ví dụ.

login_hint Không bắt buộc

Nếu ứng dụng của bạn biết người dùng nào đang cố gắng xác thực, ứng dụng có thể sử dụng tham số này để cung cấp gợi ý cho Máy chủ xác thực của Google. Máy chủ sử dụng gợi ý để đơn giản hóa quy trình đăng nhập bằng cách điền trước trường email trong biểu mẫu đăng nhập hoặc bằng cách chọn phiên nhiều đăng nhập thích hợp.

Thiết lập giá trị tham số để một địa chỉ email hoặc sub nhận dạng, tương đương với Google ID của người dùng.

prompt Không bắt buộc

Danh sách lời nhắc phân biệt bằng dấu cách, phân biệt chữ hoa chữ thường để giới thiệu cho người dùng. Nếu bạn không chỉ định tham số này, người dùng sẽ chỉ được nhắc vào lần đầu tiên dự án của bạn yêu cầu quyền truy cập. Xem khiến tái đồng ý để biết thêm thông tin.

Giá trị có thể là:

none Không hiển thị bất kỳ màn hình xác thực hoặc đồng ý nào. Không được chỉ định với các giá trị khác.
consent Nhắc người dùng đồng ý.
select_account Nhắc người dùng chọn một tài khoản.

Chuyển hướng mẫu đến máy chủ ủy quyền của Google

URL mẫu được hiển thị bên dưới, với các dấu ngắt dòng và khoảng trắng để có thể đọc được.

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly&
 include_granted_scopes=true&
 response_type=token&
 state=state_parameter_passthrough_value&
 redirect_uri=https%3A//oauth2.example.com/code&
 client_id=client_id

Sau khi bạn tạo URL yêu cầu, hãy chuyển hướng người dùng đến URL đó.

Mã mẫu JavaScript

Đoạn mã JavaScript sau đây cho biết cách bắt đầu quy trình ủy quyền trong JavaScript mà không cần sử dụng Thư viện ứng dụng khách API của Google cho JavaScript. Vì điểm cuối OAuth 2.0 này không hỗ trợ Chia sẻ tài nguyên nhiều nguồn gốc (CORS), đoạn mã sẽ tạo một biểu mẫu mở yêu cầu đến điểm cuối đó.

/*
 * Create form to request access token from Google's OAuth 2.0 server.
 */
function oauthSignIn() {
  // Google's OAuth 2.0 endpoint for requesting an access token
  var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';

  // Create <form> element to submit parameters to OAuth 2.0 endpoint.
  var form = document.createElement('form');
  form.setAttribute('method', 'GET'); // Send as a GET request.
  form.setAttribute('action', oauth2Endpoint);

  // Parameters to pass to OAuth 2.0 endpoint.
  var params = {'client_id': 'YOUR_CLIENT_ID',
                'redirect_uri': 'YOUR_REDIRECT_URI',
                'response_type': 'token',
                'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly',
                'include_granted_scopes': 'true',
                'state': 'pass-through value'};

  // Add form parameters as hidden input values.
  for (var p in params) {
    var input = document.createElement('input');
    input.setAttribute('type', 'hidden');
    input.setAttribute('name', p);
    input.setAttribute('value', params[p]);
    form.appendChild(input);
  }

  // Add form to page and submit it to open the OAuth 2.0 endpoint.
  document.body.appendChild(form);
  form.submit();
}

Bước 3: Google nhắc người dùng đồng ý

Trong bước này, người dùng quyết định có cấp cho ứng dụng của bạn quyền truy cập được yêu cầu hay không. Ở giai đoạn này, Google hiển thị cửa sổ đồng ý hiển thị tên ứng dụng của bạn và các dịch vụ API của Google mà Google đang yêu cầu quyền truy cập bằng thông tin xác thực ủy quyền của người dùng và bản tóm tắt các phạm vi truy cập được cấp. Sau đó, người dùng có thể đồng ý cấp quyền truy cập vào một hoặc nhiều phạm vi do ứng dụng của bạn yêu cầu hoặc từ chối yêu cầu.

Ứng dụng của bạn không cần thực hiện bất kỳ điều gì ở giai đoạn này vì nó chờ phản hồi từ máy chủ OAuth 2.0 của Google cho biết liệu có bất kỳ quyền truy cập nào được cấp hay không. Phản ứng đó được giải thích trong bước sau.

Lỗi

Các yêu cầu tới điểm cuối ủy quyền OAuth 2.0 của Google có thể hiển thị thông báo lỗi do người dùng đối mặt thay vì các quy trình xác thực và ủy quyền như mong đợi. Các mã lỗi phổ biến và các giải pháp được đề xuất được liệt kê bên dưới.

admin_policy_enforced

Tài khoản Google không thể cấp phép một hoặc nhiều phạm vi được yêu cầu do các chính sách của quản trị viên Google Workspace của họ. Xem Google Workspace quản lý giúp đỡ bài viết Kiểm soát của bên thứ ba và các ứng dụng nội bộ truy cập dữ liệu Google Workspace để biết thêm thông tin về cách một quản trị viên có thể hạn chế quyền truy cập vào tất cả các phạm vi hoặc phạm vi nhạy cảm và hạn chế cho đến khi truy cập được cấp một cách rõ ràng để ID OAuth khách hàng của bạn.

disallowed_useragent

Các thiết bị đầu cuối cho phép được hiển thị bên trong một user-agent nhúng không được công nhận bởi của Google Chính sách OAuth 2.0 .

Android

Nhà phát triển Android có thể gặp phải thông báo lỗi này khi mở yêu cầu ủy quyền bằngandroid.webkit.WebView . Các nhà phát triển thay vì phải sử dụng thư viện Android như Google Sign-In cho Android hoặc OpenID Foundation AppAuth dành cho Android .

Các nhà phát triển web có thể gặp phải lỗi này khi ứng dụng Android mở liên kết web chung trong tác nhân người dùng được nhúng và người dùng điều hướng đến điểm cuối ủy quyền OAuth 2.0 của Google từ trang web của bạn. Các nhà phát triển nên cho phép liên kết chung để mở trong xử lý liên kết mặc định của hệ điều hành, trong đó bao gồm cả Android App Liên kết xử lý hoặc các ứng dụng trình duyệt mặc định. Các Android Tuỳ chỉnh Tabs thư viện cũng là một lựa chọn được hỗ trợ.

iOS

iOS và MacOS các nhà phát triển có thể gặp phải lỗi này khi mở yêu cầu ủy quyền bằngWKWebView . Các nhà phát triển thay vì phải sử dụng thư viện iOS như Google Sign-In cho iOS hoặc OpenID Foundation AppAuth dành cho iOS .

Các nhà phát triển web có thể gặp phải lỗi này khi ứng dụng iOS hoặc macOS mở liên kết web chung trong tác nhân người dùng được nhúng và người dùng điều hướng đến điểm cuối ủy quyền OAuth 2.0 của Google từ trang web của bạn. Các nhà phát triển nên cho phép liên kết chung để mở trong xử lý liên kết mặc định của hệ điều hành, trong đó bao gồm cả hai Phổ Liên kết xử lý hoặc các ứng dụng trình duyệt mặc định. CácSFSafariViewController thư viện cũng là một lựa chọn được hỗ trợ.

org_internal

ID OAuth khách hàng trong yêu cầu là một phần của một dự án hạn chế quyền truy cập vào tài khoản Google trong một cụ Tổ chức đám mây của Google . Để biết thêm thông tin về tùy chọn cấu hình này thấy loại tài phần trong Setting lên sự đồng ý OAuth màn hình trợ giúp bài viết của bạn.

origin_mismatch

Lược đồ, miền và / hoặc cổng của JavaScript khởi nguồn yêu cầu ủy quyền có thể không khớp với URI gốc JavaScript được ủy quyền đã đăng ký cho ID ứng dụng khách OAuth. Xem xét ủy quyền gốc JavaScript trong trình Google API ConsoleCredentials page.

redirect_uri_mismatch

Các redirect_uri trôi qua trong yêu cầu uỷ quyền không phù hợp với một chuyển hướng có thẩm quyền URI cho ID OAuth khách hàng. Xem xét cho phép các URI chuyển hướng trong Google API Console Credentials page.

Lược đồ, miền và / hoặc cổng của JavaScript khởi nguồn yêu cầu ủy quyền có thể không khớp với URI gốc JavaScript được ủy quyền đã đăng ký cho ID ứng dụng khách OAuth. Xem xét ủy quyền gốc JavaScript trong trình Google API Console Credentials page.

Bước 4: Xử lý phản hồi của máy chủ OAuth 2.0

Thư viện máy khách JS

Thư viện ứng dụng khách JavaScript xử lý phản hồi từ máy chủ ủy quyền của Google. Nếu bạn đặt một người nghe để giám sát các thay đổi trong trạng thái đăng nhập của người dùng hiện tại, thì chức năng đó sẽ được gọi khi người dùng cấp quyền truy cập được yêu cầu vào ứng dụng.

Điểm cuối OAuth 2.0

2.0 máy chủ OAuth gửi một phản ứng với redirect_uri quy định trong việc tiếp cận yêu cầu mã của bạn.

Nếu người dùng chấp thuận yêu cầu, thì phản hồi có chứa mã thông báo truy cập. Nếu người dùng không chấp thuận yêu cầu, phản hồi sẽ chứa thông báo lỗi. Mã thông báo truy cập hoặc thông báo lỗi được trả lại trên phân đoạn băm của URI chuyển hướng, như được hiển thị bên dưới:

  • Phản hồi mã thông báo truy cập:

    https://oauth2.example.com/callback#access_token=4/P7q7W91&token_type=Bearer&expires_in=3600

    Ngoài các access_token tham số, chuỗi đoạn cũng chứa các token_type tham số, mà luôn luôn thiết lập để Bearer , và expires_in tham số, xác định tuổi thọ của thẻ, chỉ trong vài giây. Nếu state tham số đã được quy định tại access token yêu cầu, giá trị của nó cũng được bao gồm trong các phản ứng.

  • Một phản ứng lỗi:
    https://oauth2.example.com/callback#error=access_denied

Phản hồi mẫu của máy chủ OAuth 2.0

Bạn có thể kiểm tra quy trình này bằng cách nhấp vào URL mẫu sau, URL này yêu cầu quyền truy cập chỉ đọc để xem siêu dữ liệu cho các tệp trong Google Drive của bạn:

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly&
 include_granted_scopes=true&
 response_type=token&
 state=state_parameter_passthrough_value&
 redirect_uri=https%3A//oauth2.example.com/code&
 client_id=client_id

Sau khi hoàn thành các dòng chảy OAuth 2.0, bạn sẽ được chuyển đến http://localhost/oauth2callback . URL mà sẽ mang lại một 404 NOT FOUND lỗi trừ khi máy tính cục bộ của bạn xảy ra để phục vụ cho một tập tin tại địa chỉ đó. Bước tiếp theo cung cấp chi tiết hơn về thông tin được trả về trong URI khi người dùng được chuyển hướng trở lại ứng dụng của bạn.

Gọi API Google

Thư viện máy khách JS

Sau khi ứng dụng của bạn có được mã thông báo truy cập, bạn có thể sử dụng thư viện ứng dụng khách JavaScript để thay mặt người dùng thực hiện các yêu cầu API. Thư viện máy khách quản lý mã thông báo truy cập cho bạn và bạn không cần phải làm bất cứ điều gì đặc biệt để gửi nó trong yêu cầu.

Thư viện máy khách hỗ trợ hai cách để gọi các phương thức API. Nếu bạn đã tải một tài liệu khám phá, API sẽ xác định các hàm theo phương pháp cụ thể cho bạn. Bạn cũng có thể sử dụng gapi.client.request chức năng để gọi một phương pháp API. Hai đoạn sau đây chứng minh các tùy chọn này cho API Drive của about.get phương pháp.

// Example 1: Use method-specific function
var request = gapi.client.drive.about.get({'fields': 'user'});

// Execute the API request.
request.execute(function(response) {
  console.log(response);
});


// Example 2: Use gapi.client.request(args) function
var request = gapi.client.request({
  'method': 'GET',
  'path': '/drive/v3/about',
  'params': {'fields': 'user'}
});
// Execute the API request.
request.execute(function(response) {
  console.log(response);
});

Điểm cuối OAuth 2.0

Sau khi ứng dụng của bạn nhận được mã thông báo truy cập, bạn có thể sử dụng mã thông báo này để thực hiện các cuộc gọi tới API Google thay mặt cho một tài khoản người dùng nhất định nếu (các) phạm vi truy cập mà API yêu cầu đã được cấp. Để làm điều này, bao gồm access token trong một yêu cầu đến API bằng cách bao gồm cả một access_token tham số truy vấn hoặc một Authorization tiêu đề HTTP Bearer giá trị. Khi có thể, tiêu đề HTTP được ưu tiên hơn, vì các chuỗi truy vấn có xu hướng hiển thị trong nhật ký máy chủ. Trong hầu hết các trường hợp, bạn có thể sử dụng một thư viện client để thiết lập cuộc gọi của bạn đến Google API (ví dụ, khi gọi API Drive tập tin ).

Bạn có thể thử tất cả các API của Google và xem phạm vi của họ tại OAuth 2.0 Sân chơi .

Ví dụ về HTTP GET

Một cuộc gọi đến các drive.files endpoint (API Drive Files) bằng cách sử dụng Authorization: Bearer tiêu đề HTTP có thể trông giống như sau. Lưu ý rằng bạn cần chỉ định mã thông báo truy cập của riêng mình:

GET /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

Dưới đây là một lời kêu gọi các API tương tự cho các người dùng xác thực bằng cách sử dụng access_token tham số chuỗi truy vấn:

GET https://www.googleapis.com/drive/v2/files?access_token=access_token

curl ví dụ

Bạn có thể kiểm tra các lệnh này với curl ứng dụng dòng lệnh. Dưới đây là một ví dụ sử dụng tùy chọn tiêu đề HTTP (ưu tiên):

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files

Hoặc, cách khác, tùy chọn tham số chuỗi truy vấn:

curl https://www.googleapis.com/drive/v2/files?access_token=access_token

Mã mẫu JavaScript

Đoạn mã dưới đây trình bày cách sử dụng CORS (Chia sẻ tài nguyên nguồn gốc chéo) để gửi yêu cầu tới API Google. Ví dụ này không sử dụng Thư viện ứng dụng API của Google cho JavaScript. Tuy nhiên, ngay cả khi bạn không sử dụng thư viện khách hàng, CORS hỗ trợ hướng dẫn trong tài liệu của thư viện mà có thể sẽ giúp bạn hiểu rõ hơn về những yêu cầu này.

Trong đoạn mã này, access_token biến đại diện cho dấu hiệu bạn có được để làm cho yêu cầu API thay mặt của người dùng được ủy quyền. Các ví dụ hoàn chỉnh chứng minh làm thế nào để lưu trữ mà thẻ trong lưu trữ địa phương của trình duyệt và lấy nó khi thực hiện một yêu cầu API.

var xhr = new XMLHttpRequest();
xhr.open('GET',
    'https://www.googleapis.com/drive/v3/about?fields=user&' +
    'access_token=' + params['access_token']);
xhr.onreadystatechange = function (e) {
  console.log(xhr.response);
};
xhr.send(null);

Hoàn thành ví dụ

Thư viện máy khách JS

Demo mã mẫu

Phần này chứa một bản demo hoạt động của mẫu mã sau đó để chứng minh cách mã hoạt động trong một ứng dụng thực tế. Sau khi bạn cho phép các ứng dụng, nó sẽ được liệt kê trong số các ứng dụng kết nối với tài khoản Google của bạn . Ứng dụng này được đặt tên là OAuth 2.0 Demo cho Google API Documents. Tương tự, nếu bạn thu hồi quyền truy cập và làm mới trang đó, ứng dụng đó sẽ không còn được liệt kê nữa.

Lưu ý rằng ứng dụng này yêu cầu truy cập vào các https://www.googleapis.com/auth/drive.metadata.readonly phạm vi. Quyền truy cập chỉ được yêu cầu để trình bày cách bắt đầu luồng OAuth 2.0 trong ứng dụng JavaScript. Ứng dụng này không thực hiện bất kỳ yêu cầu API nào.

Mã mẫu JavaScript

Như được hiển thị ở trên, mẫu mã này dành cho một trang (một ứng dụng) tải Thư viện ứng dụng API của Google cho JavaScript và bắt đầu quy trình OAuth 2.0. Trang hiển thị:

  • Một nút cho phép người dùng đăng nhập vào ứng dụng. Nếu trước đó người dùng chưa ủy quyền ứng dụng, thì ứng dụng sẽ khởi chạy quy trình OAuth 2.0.
  • Hai nút cho phép người dùng đăng xuất khỏi ứng dụng hoặc thu hồi quyền truy cập đã cấp trước đó cho ứng dụng. Nếu bạn đăng xuất khỏi một ứng dụng, bạn chưa thu hồi quyền truy cập đã cấp cho ứng dụng đó. Bạn sẽ cần đăng nhập lại trước khi ứng dụng có thể thay mặt bạn thực hiện các yêu cầu được ủy quyền khác nhưng bạn sẽ không phải cấp lại quyền truy cập vào lần tiếp theo khi sử dụng ứng dụng. Tuy nhiên, nếu bạn thu hồi quyền truy cập thì bạn cần cấp lại quyền truy cập.

Bạn cũng có thể thu hồi quyền truy cập vào các ứng dụng thông qua các Quyền trang cho tài khoản Google của bạn. Các ứng dụng được liệt kê như OAuth 2.0 Demo cho Google API Documents.

<script>
  var GoogleAuth;
  var SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly';
  function handleClientLoad() {
    // Load the API's client and auth2 modules.
    // Call the initClient function after the modules load.
    gapi.load('client:auth2', initClient);
  }

  function initClient() {
    // In practice, your app can retrieve one or more discovery documents.
    var discoveryUrl = 'https://www.googleapis.com/discovery/v1/apis/drive/v3/rest';

    // Initialize the gapi.client object, which app uses to make API requests.
    // Get API key and client ID from API Console.
    // 'scope' field specifies space-delimited list of access scopes.
    gapi.client.init({
        'apiKey': 'YOUR_API_KEY',
        'clientId': 'YOUR_CLIENT_ID',
        'discoveryDocs': [discoveryUrl],
        'scope': SCOPE
    }).then(function () {
      GoogleAuth = gapi.auth2.getAuthInstance();

      // Listen for sign-in state changes.
      GoogleAuth.isSignedIn.listen(updateSigninStatus);

      // Handle initial sign-in state. (Determine if user is already signed in.)
      var user = GoogleAuth.currentUser.get();
      setSigninStatus();

      // Call handleAuthClick function when user clicks on
      //      "Sign In/Authorize" button.
      $('#sign-in-or-out-button').click(function() {
        handleAuthClick();
      });
      $('#revoke-access-button').click(function() {
        revokeAccess();
      });
    });
  }

  function handleAuthClick() {
    if (GoogleAuth.isSignedIn.get()) {
      // User is authorized and has clicked "Sign out" button.
      GoogleAuth.signOut();
    } else {
      // User is not signed in. Start Google auth flow.
      GoogleAuth.signIn();
    }
  }

  function revokeAccess() {
    GoogleAuth.disconnect();
  }

  function setSigninStatus() {
    var user = GoogleAuth.currentUser.get();
    var isAuthorized = user.hasGrantedScopes(SCOPE);
    if (isAuthorized) {
      $('#sign-in-or-out-button').html('Sign out');
      $('#revoke-access-button').css('display', 'inline-block');
      $('#auth-status').html('You are currently signed in and have granted ' +
          'access to this app.');
    } else {
      $('#sign-in-or-out-button').html('Sign In/Authorize');
      $('#revoke-access-button').css('display', 'none');
      $('#auth-status').html('You have not authorized this app or you are ' +
          'signed out.');
    }
  }

  function updateSigninStatus() {
    setSigninStatus();
  }
</script>

<button id="sign-in-or-out-button"
        style="margin-left: 25px">Sign In/Authorize</button>
<button id="revoke-access-button"
        style="display: none; margin-left: 25px">Revoke access</button>

<div id="auth-status" style="display: inline; padding-left: 25px"></div><hr>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script async defer src="https://apis.google.com/js/api.js"
        onload="this.onload=function(){};handleClientLoad()"
        onreadystatechange="if (this.readyState === 'complete') this.onload()">
</script>

Điểm cuối OAuth 2.0

Mẫu mã này trình bày cách hoàn thành luồng OAuth 2.0 trong JavaScript mà không cần sử dụng Thư viện ứng dụng API của Google dành cho JavaScript. Mã dành cho một trang HTML hiển thị một nút để thử một yêu cầu API. Nếu bạn nhấp vào nút, mã sẽ kiểm tra xem liệu trang đã lưu trữ mã truy cập API trong bộ nhớ cục bộ của trình duyệt của bạn hay chưa. Nếu vậy, nó thực hiện yêu cầu API. Nếu không, nó bắt đầu luồng OAuth 2.0.

Đối với quy trình OAuth 2.0, trang thực hiện theo các bước sau:

  1. Nó hướng người dùng OAuth 2.0 máy chủ của Google, trong đó yêu cầu truy cập vào các https://www.googleapis.com/auth/drive.metadata.readonly phạm vi.
  2. Sau khi cấp (hoặc từ chối) quyền truy cập vào một hoặc nhiều phạm vi được yêu cầu, người dùng được chuyển hướng đến trang gốc, trang này sẽ phân tích cú pháp mã thông báo truy cập từ chuỗi định danh phân đoạn.
  3. Trang sử dụng mã thông báo truy cập để thực hiện yêu cầu API mẫu.

    Yêu cầu API gọi API Drive của about.get phương pháp để lấy thông tin về tài khoản Google Drive của người dùng được ủy quyền.

  4. Nếu yêu cầu thực thi thành công, phản hồi API được ghi vào bảng điều khiển gỡ lỗi của trình duyệt.

Bạn có thể thu hồi quyền truy cập vào các ứng dụng thông qua các Quyền trang cho tài khoản Google của bạn. Các ứng dụng sẽ được liệt kê như là OAuth 2.0 Demo cho Google API Documents.

Để chạy mã này tại địa phương, bạn cần phải thiết lập giá trị cho YOUR_CLIENT_IDYOUR_REDIRECT_URI biến tương ứng với bạn chứng uỷ quyền . Các YOUR_REDIRECT_URI biến nên được đặt cùng một URL nơi trang đang được phục vụ. Giá trị chính xác phải phù hợp với một trong những URI chuyển hướng có thẩm quyền cho khách hàng OAuth 2.0, mà bạn đã cấu hình trong API Console Credentials page. Nếu giá trị này không phù hợp với một URI được ủy quyền, bạn sẽ nhận được một redirect_uri_mismatch lỗi. Dự án của bạn cũng phải bật API thích hợp cho yêu cầu này.

<html><head></head><body>
<script>
  var YOUR_CLIENT_ID = 'REPLACE_THIS_VALUE';
  var YOUR_REDIRECT_URI = 'REPLACE_THIS_VALUE';
  var fragmentString = location.hash.substring(1);

  // Parse query string to see if page request is coming from OAuth 2.0 server.
  var params = {};
  var regex = /([^&=]+)=([^&]*)/g, m;
  while (m = regex.exec(fragmentString)) {
    params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
  }
  if (Object.keys(params).length > 0) {
    localStorage.setItem('oauth2-test-params', JSON.stringify(params) );
    if (params['state'] && params['state'] == 'try_sample_request') {
      trySampleRequest();
    }
  }

  // If there's an access token, try an API request.
  // Otherwise, start OAuth 2.0 flow.
  function trySampleRequest() {
    var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
    if (params && params['access_token']) {
      var xhr = new XMLHttpRequest();
      xhr.open('GET',
          'https://www.googleapis.com/drive/v3/about?fields=user&' +
          'access_token=' + params['access_token']);
      xhr.onreadystatechange = function (e) {
        if (xhr.readyState === 4 && xhr.status === 200) {
          console.log(xhr.response);
        } else if (xhr.readyState === 4 && xhr.status === 401) {
          // Token invalid, so prompt for user permission.
          oauth2SignIn();
        }
      };
      xhr.send(null);
    } else {
      oauth2SignIn();
    }
  }

  /*
   * Create form to request access token from Google's OAuth 2.0 server.
   */
  function oauth2SignIn() {
    // Google's OAuth 2.0 endpoint for requesting an access token
    var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';

    // Create element to open OAuth 2.0 endpoint in new window.
    var form = document.createElement('form');
    form.setAttribute('method', 'GET'); // Send as a GET request.
    form.setAttribute('action', oauth2Endpoint);

    // Parameters to pass to OAuth 2.0 endpoint.
    var params = {'client_id': YOUR_CLIENT_ID,
                  'redirect_uri': YOUR_REDIRECT_URI,
                  'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly',
                  'state': 'try_sample_request',
                  'include_granted_scopes': 'true',
                  'response_type': 'token'};

    // Add form parameters as hidden input values.
    for (var p in params) {
      var input = document.createElement('input');
      input.setAttribute('type', 'hidden');
      input.setAttribute('name', p);
      input.setAttribute('value', params[p]);
      form.appendChild(input);
    }

    // Add form to page and submit it to open the OAuth 2.0 endpoint.
    document.body.appendChild(form);
    form.submit();
  }
</script>

<button onclick="trySampleRequest();">Try sample request</button>
</body></html>

Quy tắc xác thực nguồn gốc JavaScript

Google áp dụng các quy tắc xác thực sau cho nguồn gốc JavaScript để giúp các nhà phát triển giữ an toàn cho ứng dụng của họ. Nguồn gốc JavaScript của bạn phải tuân thủ các quy tắc này. Xem RFC 3986 phần 3 cho định nghĩa của tên miền, máy chủ và chương trình, đề cập dưới đây.

Quy tắc xác thực
Kế hoạch

Nguồn gốc JavaScript phải sử dụng lược đồ HTTPS, không phải HTTP thuần túy. Các URI máy chủ cục bộ (bao gồm các URI địa chỉ IP máy chủ lưu trữ) được miễn khỏi quy tắc này.

Tổ chức

Máy chủ lưu trữ không thể là địa chỉ IP thô. Địa chỉ IP localhost được miễn trừ khỏi quy tắc này.

Lãnh địa
  • TLD Host ( Top Level Domains ) phải thuộc danh sách hậu tố công khai .
  • Lĩnh vực máy chủ không thể “googleusercontent.com” .
  • Nguồn gốc JavaScript không thể chứa các lĩnh vực cụ rút gọn URL (ví dụ như goo.gl ) trừ khi ứng dụng sở hữu tên miền.
  • Thông tin người dùng

    Nguồn gốc JavaScript không được chứa thành phần con userinfo.

    Con đường

    Nguồn gốc JavaScript không được chứa thành phần đường dẫn.

    Truy vấn

    Nguồn gốc JavaScript không được chứa thành phần truy vấn.

    Miếng

    Nguồn gốc JavaScript không được chứa thành phần phân đoạn.

    Nhân vật Nguồn gốc JavaScript không được chứa các ký tự nhất định bao gồm:
    • Ký tự đại diện ( '*' )
    • Các ký tự ASCII không in được
    • Mã hóa phần trăm không hợp lệ (bất kỳ mã hóa phần trăm nào không tuân theo dạng mã hóa URL của dấu phần trăm theo sau là hai chữ số thập lục phân)
    • Ký tự null (một nhân vật NULL được mã hóa, ví dụ, %00 , %C0%80 )

    Ủy quyền gia tăng

    Trong giao thức OAuth 2.0, ứng dụng của bạn yêu cầu ủy quyền để truy cập tài nguyên, được xác định theo phạm vi. Việc yêu cầu ủy quyền tài nguyên tại thời điểm bạn cần được coi là một phương pháp trải nghiệm người dùng tốt nhất. Để thực hiện phương pháp đó, máy chủ ủy quyền của Google hỗ trợ ủy quyền gia tăng. Tính năng này cho phép bạn yêu cầu phạm vi khi cần và nếu người dùng cấp quyền cho phạm vi mới, sẽ trả về mã ủy quyền có thể được đổi lấy mã thông báo chứa tất cả phạm vi mà người dùng đã cấp cho dự án.

    Ví dụ: một ứng dụng cho phép mọi người lấy mẫu các bản nhạc và tạo danh sách kết hợp có thể cần rất ít tài nguyên tại thời điểm đăng nhập, có lẽ không cần gì khác ngoài tên của người đăng nhập. Tuy nhiên, việc lưu một danh sách kết hợp hoàn chỉnh sẽ yêu cầu quyền truy cập vào Google Drive của họ . Hầu hết mọi người sẽ thấy tự nhiên nếu họ chỉ được yêu cầu quyền truy cập vào Google Drive của họ tại thời điểm ứng dụng thực sự cần.

    Trong trường hợp này, khi đăng nhập trong thời gian ứng dụng có thể yêu cầu openidprofile phạm vi để thực hiện cơ bản đăng nhập, và sau đó yêu cầu https://www.googleapis.com/auth/drive.file phạm vi tại thời điểm yêu cầu đầu tiên để lưu danh sách kết hợp.

    Các quy tắc sau áp dụng cho mã thông báo truy cập nhận được từ ủy quyền gia tăng:

    • Mã thông báo có thể được sử dụng để truy cập tài nguyên tương ứng với bất kỳ phạm vi nào được đưa vào ủy quyền kết hợp mới.
    • Khi bạn sử dụng refresh mã thông báo cho uỷ quyền kết hợp để có được một thẻ truy cập, access token đại diện uỷ quyền kết hợp và có thể được sử dụng cho bất kỳ scope giá trị bao gồm trong phản ứng.
    • Ủy quyền kết hợp bao gồm tất cả các phạm vi mà người dùng đã cấp cho dự án API ngay cả khi việc cấp được yêu cầu từ các máy khách khác nhau. Ví dụ: nếu người dùng cấp quyền truy cập vào một phạm vi bằng ứng dụng máy tính để bàn của ứng dụng và sau đó cấp một phạm vi khác cho cùng một ứng dụng thông qua ứng dụng di động, thì ủy quyền kết hợp sẽ bao gồm cả hai phạm vi.
    • Nếu bạn thu hồi mã thông báo đại diện cho ủy quyền kết hợp, quyền truy cập vào tất cả các phạm vi của ủy quyền đó thay mặt cho người dùng được liên kết sẽ bị thu hồi đồng thời.

    Các mẫu mã bên dưới cho biết cách thêm phạm vi vào mã thông báo truy cập hiện có. Cách tiếp cận này cho phép ứng dụng của bạn tránh phải quản lý nhiều mã thông báo truy cập.

    Thư viện máy khách JS

    Để thêm phạm vi một thẻ truy cập hiện có, gọi GoogleUser.grant(options) phương pháp. Các options đối tượng xác định phạm vi bổ sung mà bạn muốn cấp quyền truy cập.

    // Space-separated list of additional scope(s) you are requesting access to.
    // This code adds read-only access to the user's calendars via the Calendar API.
    var NEW_SCOPES = 'https://www.googleapis.com/auth/calendar.readonly';
    
    // Retrieve the GoogleUser object for the current user.
    var GoogleUser = GoogleAuth.currentUser.get();
    GoogleUser.grant({'scope': NEW_SCOPES});

    Điểm cuối OAuth 2.0

    Để thêm phạm vi một thẻ truy cập hiện có, bao gồm các include_granted_scopes tham số trong bạn yêu cầu đến máy chủ OAuth 2.0 của Google .

    Đoạn mã sau đây trình bày cách thực hiện điều đó. Đoạn mã giả định rằng bạn đã lưu trữ các phạm vi mà mã thông báo truy cập của bạn hợp lệ trong bộ nhớ cục bộ của trình duyệt. (Các ví dụ hoàn chỉnh các cửa hàng mã một danh sách các phạm vi mà các thẻ truy cập có giá trị bằng cách thiết lập oauth2-test-params.scope tài sản trong lưu trữ địa phương của trình duyệt.)

    Đoạn mã so sánh phạm vi mà mã thông báo truy cập hợp lệ với phạm vi bạn muốn sử dụng cho một truy vấn cụ thể. Nếu mã thông báo truy cập không bao gồm phạm vi đó, thì luồng OAuth 2.0 sẽ bắt đầu. Ở đây, oauth2SignIn chức năng tương tự như một trong đó đã được quy định tại bước 2 (và được cung cấp sau này trong ví dụ hoàn chỉnh ).

    var SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly';
    var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
    
    var current_scope_granted = false;
    if (params.hasOwnProperty('scope')) {
      var scopes = params['scope'].split(' ');
      for (var s = 0; s < scopes.length; s++) {
        if (SCOPE == scopes[s]) {
          current_scope_granted = true;
        }
      }
    }
    
    if (!current_scope_granted) {
      oauth2SignIn(); // This function is defined elsewhere in this document.
    } else {
      // Since you already have access, you can proceed with the API request.
    }

    Thu hồi mã thông báo

    Trong một số trường hợp, người dùng có thể muốn thu hồi quyền truy cập được cấp cho một ứng dụng. Người dùng có thể thu hồi quyền truy cập bằng cách truy cập Account Settings . Xem Remove trang web hoặc ứng dụng phần truy cập của các trang web của bên thứ ba và các ứng dụng với quyền truy cập vào tài khoản của bạn tài liệu hỗ trợ để biết thêm thông tin.

    Ứng dụng cũng có thể thu hồi quyền truy cập được cấp theo chương trình. Việc thu hồi có lập trình rất quan trọng trong trường hợp người dùng hủy đăng ký, xóa ứng dụng hoặc tài nguyên API mà ứng dụng yêu cầu đã thay đổi đáng kể. Nói cách khác, một phần của quá trình xóa có thể bao gồm yêu cầu API để đảm bảo các quyền đã cấp trước đó cho ứng dụng bị xóa.

    Thư viện máy khách JS

    Để lập trình thu hồi một mã thông báo, cuộc gọi GoogleAuth.disconnect() :

    GoogleAuth.disconnect();

    Điểm cuối OAuth 2.0

    Để lập trình thu hồi một mã thông báo, ứng dụng của bạn tạo ra một yêu cầu đến https://oauth2.googleapis.com/revoke và bao gồm các dấu hiệu như một tham số:

    curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \
            https://oauth2.googleapis.com/revoke?token={token}

    The token can be an access token or a refresh token. If the token is an access token and it has a corresponding refresh token, the refresh token will also be revoked.

    If the revocation is successfully processed, then the HTTP status code of the response is 200 . For error conditions, an HTTP status code 400 is returned along with an error code.

    The following JavaScript snippet shows how to revoke a token in JavaScript without using the Google APIs Client Library for JavaScript. Since the Google's OAuth 2.0 endpoint for revoking tokens does not support Cross-origin Resource Sharing (CORS), the code creates a form and submits the form to the endpoint rather than using the XMLHttpRequest() method to post the request.

    function revokeAccess(accessToken) {
      // Google's OAuth 2.0 endpoint for revoking access tokens.
      var revokeTokenEndpoint = 'https://oauth2.googleapis.com/revoke';
    
      // Create <form> element to use to POST data to the OAuth 2.0 endpoint.
      var form = document.createElement('form');
      form.setAttribute('method', 'post');
      form.setAttribute('action', revokeTokenEndpoint);
    
      // Add access token to the form so it is set as value of 'token' parameter.
      // This corresponds to the sample curl request, where the URL is:
      //      https://oauth2.googleapis.com/revoke?token={token}
      var tokenField = document.createElement('input');
      tokenField.setAttribute('type', 'hidden');
      tokenField.setAttribute('name', 'token');
      tokenField.setAttribute('value', accessToken);
      form.appendChild(tokenField);
    
      // Add form to page and submit it to actually revoke the token.
      document.body.appendChild(form);
      form.submit();
    }