Ủy quyền API

Dùng OAuth 2.0 để cấp quyền cho ứng dụng khi truy cập vào các API khách sạn.

Thiết lập OAuth 2.0

OAuth 2.0 yêu cầu bạn xác định danh tính của chính mình bằng tài khoản dịch vụ liên kết với Tài khoản Google của bạn. Tài khoản dịch vụ sẽ gửi dữ liệu riêng tư của bạn khoá để đổi lấy mã truy cập OAuth 2.0. Sau đó, bạn có thể sử dụng mã thông báo này trong lệnh gọi đến API khách sạn để có dữ liệu chỉ có thể đọc, chẳng hạn như giá cả, khách sạn và dữ liệu báo cáo chẩn đoán về nguồn cấp dữ liệu giá khách sạn của bạn.

Mã truy cập có hiệu lực trong một giờ (3.600 giây).

Nếu trước đây bạn đã triển khai ClientLogin, thì phương pháp OAuth 2.0 cũng tương tự, với những điểm khác biệt sau:

  • Ứng dụng của bạn sử dụng tài khoản dịch vụ của Google để truy cập API.
  • Bạn truyền mã truy cập OAuth 2.0 vào tiêu đề HTTP Authorization khi gọi API.

Để thiết lập tài khoản của bạn sử dụng OAuth 2.0 với Travel Partner API, hãy thực hiện các bước sau:

  1. Tạo một dự án mới trong Google Developers Console (DevConsole)

  2. Cấp quyền truy cập vào Travel Partner API cho dự án mới

  3. Tạo tài khoản dịch vụ và thông tin xác thực của tài khoản đó

  4. Cấp cho tài khoản dịch vụ của bạn quyền truy cập vào dữ liệu khách sạn của bạn

Từng bước này được mô tả trong phần tiếp theo.

Bước 1: Tạo một Dự án mới trong DevConsole

Google Developers Console ("DevConsole") là trải nghiệm của Google dành cho nhà phát triển để quản lý và xem dữ liệu lưu lượng truy cập, thông tin xác thực và thông tin thanh toán đối với các API của Google mà dự án của bạn sử dụng.

Trong DevConsole, dự án là tập hợp các chế độ cài đặt, thông tin đăng nhập, và siêu dữ liệu về ứng dụng hoặc các ứng dụng mà bạn đang xử lý sử dụng API Nhà phát triển của Google và tài nguyên của Google Cloud.

DevConsole là nơi bạn quản lý các khía cạnh này của dự án, chẳng hạn như tạo thông tin xác thực API, kích hoạt API và quản lý đội nhóm cũng như hoạt động thanh toán liên quan đến dự án của bạn.

Cách tạo một dự án mới trong DevConsole:

  1. Đăng nhập vào Gmail/Tài khoản Google của bạn.

  2. Mở Google Developer Console. Nếu đây là dự án đầu tiên của bạn, chế độ xem chính sẽ hiển thị nút TẠO DỰ ÁN đơn giản:

    fig1

  3. Nhấp vào nút TẠO DỰ ÁN. DevConsole hiển thị Hộp thoại New Project (Dự án mới):

    fig2

    Nhập một tên dễ nhớ cho dự án mới của bạn trong phần Project name (Tên dự án) trường nhập dữ liệu. Bên dưới trường này, DevConsole sẽ tạo một mã dự án cho bạn, đảm bảo rằng mã nhận dạng này là duy nhất trên tất cả các dự án. Ví dụ: nếu bạn hãy nhập "Dự án mới của tôi", DevConsole sẽ gán một mã nhận dạng như my-new-project-266022.

  4. Nhấp vào nút Create (Tạo) để tạo dự án mới.

  5. Sử dụng trình đơn điều hướng để chọn API và Dịch vụ > Trang tổng quan.

    fig3

    Hình ảnh dưới đây hiển thị trình đơn điều hướng ở phía trên bên trái của DevConsole. Thao tác này sẽ hiển thị chế độ xem Trang tổng quan cho dự án của bạn:

    fig4

Để biết thêm thông tin, hãy tham khảo bài viết Quản lý dự án trong phần Nhà phát triển Google Play Console.

Khi bạn tạo một dự án mới, chưa có API nào liên kết với dự án đó. Trong bước tiếp theo, bạn sẽ bật Travel Partner API cho Dự án mới của mình.

Bước 2: Bật Travel Partner API cho dự án mới

Để sử dụng các API khách sạn, bạn phải bật Travel Partner API trong dự án mới trong DevConsole.

Cách bật API khách sạn cho dự án mới:

  1. Chuyển đến chế độ xem Trang tổng quan của dự án như mô tả ở trên.

  2. Nhấp vào Bật API và dịch vụ. Thao tác này sẽ hiện nội dung chào mừng bạn đến với Thư viện API .

  3. Trong trường tìm kiếm, hãy bắt đầu nhập Travel Partner API. Google API Console hiển thị danh sách API phù hợp với nội dung bạn nhập.

  4. Nhấp vào biểu tượng Travel Partner API trong bảng các API phù hợp. DevConsole hiện nội dung mô tả về API.

  5. Nhấp vào nút Enable API (Bật API) để bật API này cho dự án của bạn.

Để biết thêm thông tin, hãy tham khảo bài viết Kích hoạt và huỷ kích hoạt API.

API khách sạn hiện đã được bật cho dự án mới trong Tài khoản Google của bạn.

Bước tiếp theo là tạo tài khoản dịch vụ và tạo khoá cho tài khoản đó.

Bước 3: Tạo tài khoản dịch vụ và tạo thông tin xác thực cho tài khoản đó

Tài khoản dịch vụ được sử dụng bởi các tương tác giữa các máy chủ, chẳng hạn như các hoạt động giữa ứng dụng web và dữ liệu khách sạn của bạn.

Cách tạo và thiết lập tài khoản dịch vụ:

  1. Trong chế độ xem chính của Bảng điều khiển API của Google, hãy nhấp vào Thông tin đăng nhập trong điều hướng bên trái. DevConsole sẽ hiện chế độ xem Thông tin xác thực.

    Chế độ xem Thông tin xác thực cho thấy mã ứng dụng khách và thông tin xác thực cho dự án. Ứng dụng của bạn sẽ sử dụng Client-ID khi yêu cầu Mã truy cập OAuth 2.0. Các dự án mới sẽ không có ứng dụng hoặc thông tin đăng nhập chưa.

  2. Nhấp vào đường liên kết Thông tin xác thực trong API và dịch vụ.

  3. Nhấp vào nút Tạo thông tin đăng nhập rồi chọn Khoá tài khoản dịch vụ trong trình đơn thả xuống. Bạn sẽ thấy chế độ xem Tạo khoá tài khoản dịch vụ.

  4. Trong trình đơn thả xuống Tài khoản dịch vụ, hãy chọn Tài khoản dịch vụ mới.

  5. Nhập tên tài khoản dịch vụ và mã tài khoản dịch vụ.

    Bạn có thể đặt tên bất kỳ, nhưng mã tài khoản phải là duy nhất trong tất cả các dự án. DevConsole sẽ tạo một ID tài khoản duy nhất cho bạn, dựa trên tên bạn đã nhập.

  6. Chọn P12 cho loại khoá, như minh hoạ dưới đây. Bắt buộc phải chọn P12.

    fig5

  7. Nhấp vào nút Tạo. DevConsole tạo một cặp khoá riêng tư/công khai cho dự án của bạn. Khoá riêng tư này được lưu vào vị trí mặc định mà trình duyệt của bạn lưu nội dung tải xuống. Bạn phải tải .p12 (nhị phân), khác với .json định dạng tệp.

    Bạn sử dụng khoá riêng tư trong các tập lệnh của mình hoặc các ứng dụng khác truy cập Travel Partner API.

    DevConsole sẽ hiển thị thông báo sau đây khi hoàn tất việc tạo khoá:

    fig6

  8. Nhấp vào nút OK. DevConsole sẽ đưa bạn trở lại Chế độ xem Thông tin xác thực. Để xác nhận các thông tin chi tiết về tài khoản dịch vụ và xem tài khoản dịch vụ được liên kết với dự án của bạn, nhấp vào Quản lý tài khoản dịch vụ trong chế độ xem này.

    Tài khoản dịch vụ hiện có các thông tin xác thực sau được liên kết với nó:

    • Mã ứng dụng khách: Giá trị nhận dạng duy nhất mà ứng dụng của bạn dùng khi yêu cầu mã truy cập OAuth 2.0.
    • Địa chỉ email: Địa chỉ email được tạo cho tài khoản dịch vụ, trong biểu mẫu "account_name@account_name.google.com.iam.gserviceaccount.com".
    • Vân tay số chứng chỉ: Mã của khoá riêng tư mà bạn đã tải xuống.

Để biết thêm thông tin, hãy tham khảo bài viết Sử dụng OAuth 2.0 cho máy chủ để Ứng dụng máy chủ.

Bước 4: Cấp cho tài khoản dịch vụ quyền truy cập vào dữ liệu của bạn trên Hotel Center

Bước cuối cùng là cung cấp tài khoản dịch vụ mới có quyền truy cập vào Hotel Center. Tài khoản dịch vụ được xác định theo địa chỉ email đã tạo mà bạn đã tạo ở bước trước. Bạn cung cấp quyền truy cập vào tài khoản này bằng cách sử dụng chế độ cài đặt cách chia sẻ trong Hotel Center.

Cách cấp quyền truy cập vào dữ liệu của bạn trên Hotel Center cho tài khoản dịch vụ:

Nếu bạn không có quyền truy cập thích hợp để thêm người dùng vào tài khoản, hãy liên hệ với Nhóm Google Hotels sử dụng biểu mẫu liên hệ với chúng tôi và yêu cầu chúng tôi thiết lập quyền sở hữu cho tài khoản của bạn. Bạn có thể yêu cầu gửi một hoặc nhiều email cho chủ sở hữu. Để biết thêm thông tin về quyền truy cập vào Hotel Center, hãy tham khảo bài viết Liên kết Hotel Center và Google Ads.

  1. Trong một cửa sổ trình duyệt mới, hãy mở Hotel Center. fig7

  2. Trên biểu ngữ Hotel Center của Google, hãy nhấp vào biểu tượng thêm người dùng để mở hộp thoại chia sẻ.

    fig8

  3. Trong trường Thêm người khác, hãy nhập địa chỉ email của dịch vụ tài khoản mà bạn muốn thêm vào Hotel Center.

  4. Chọn mục Thông báo cho mọi người.

  5. Trong trình đơn thả xuống, hãy chọn Quản lý.

  6. Nhấp vào nút Mời.

  7. Sau khi bạn thêm người dùng vào Hotel Center, tài khoản dịch vụ của bạn phải được bật quyền truy cập API trong vòng khoảng 24 giờ.

Sau khi Google thông báo cho bạn rằng quyền truy cập vào API đã được bật cho dịch vụ của bạn tài khoản, bạn có thể bắt đầu truy cập API bằng OAuth.

Sử dụng OAuth 2.0

Để truy cập API, ứng dụng của bạn phải tự xác định với Google bằng địa chỉ email và khoá riêng tư đã tạo của tài khoản dịch vụ. cơ chế xác thực sẽ trao đổi khoá này để lấy mã truy cập OAuth 2.0 mà bạn truyền tiêu đề Authorization vào các lệnh gọi API của ứng dụng.

Mã truy cập (còn gọi là mã thông báo truy cập) là một phần của OAuth 2.0 chuẩn. Cú pháp để chỉ định mã truy cập trong tiêu đề HTTP là:

Authorization: Bearer *oauth2_access_token*

Ví dụ sau đây minh hoạ tiêu đề HTTP mẫu của một yêu cầu truy cập vào API Báo cáo:

GET /travelpartner/v2.0/42000042/reports/top_opportunity_7_day HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer nd42.fdLSKkljD98344444444444lSDF42fdLSKkljD98344444444444lSDF42
Cache-Control: no-cache

Để tạo mã truy cập, hãy tạo một ứng dụng bằng ngôn ngữ bất kỳ mà bạn chọn. Ví dụ sau đây sẽ tạo mã thông báo bằng Python. Sau đó, bạn có thể sử dụng mã thông báo trong yêu cầu của bạn. Authorization tiêu đề khi truy cập Travel Partner API.

#!/usr/bin/python2.7
#
""" Sample code to get an auth header that you can use in your HTTP requests
    1. Please see https://developers.google.com/api-client-library/python/start/installation
       to download and install the google-api-python-client package.
    2. Edit lines below marked _SERVICE_ACCOUNT, _KEY_FILE,  _PARTNER_NAME,
       and _API_VERSION.
    3. Run the program using: "python sample.py". The app returns the value that
       you use for the Authorization header's Bearer token in your request.
    4. Copy the token and use it in requests to the Travel Partner API.
       For example (2.0):
       https://www.googleapis.com/travelpartner/2.0/42000042/reports/budget
       For example (1.x):
       https://www.googleapis.com/travelpartner/1.2/reports?report_type=BUDGET
"""
import httplib2
import json
import os
import sys
import urllib

HAS_CRYPTO = False

from apiclient import discovery
from oauth2client.client import flow_from_clientsecrets
try:
  # Some systems may not have OpenSSL installed so can't use SignedJwtAssertionCredentials.
  from oauth2client.client import SignedJwtAssertionCredentials
  HAS_CRYPTO = True
except ImportError:
  print "Unable to import SignedJwtAssertionCredentials"

from oauth2client import tools
from oauth2client.file import Storage

# Authorization scope for our requests (do not change)
_DEFAULT_APISCOPE = 'https://www.googleapis.com/auth/travelpartner'

# Use the service account you set up in the Google Developers Platform.
# It will be of the form "gsaccount_name@project_name.google.com.iam.gserviceaccount.com".
_SERVICE_ACCOUNT = ('myserviceaccount@my-hotel-project.google.com.iam.gserviceaccount.com')

# Set this to the full path to your service account's private binary .p12 key file
# that you downloaded from the Google Developer's Console and stored in a secure place.
# DO NOT use the json version of the certificate.
_KEY_FILE = '../mylocaldir/api-keys/8482bb2bdb08.p12'

# Set this to the case-sensitive "Partner Key", NOT the account
# name in the Hotel Ads Center or the numeric partner ID.
# Check with your TAM if you do not know your "Partner Key" name.
_PARTNER_NAME = 'testpartner2'

class HotelAdsAPIConnection(object):
  def __init__(self, service_account=_SERVICE_ACCOUNT, key=_KEY_FILE, partner=_PARTNER_NAME):
    self.key_file = key
    self.account = service_account
    self.partner = partner

  def InitializeCredentials(self, scope):
    '''Get credentials for use in API requests.
    Generates service account credentials if the key file is present,
    and regular user credentials if the file is not found.
    '''
    if os.path.exists(self.key_file):
      if not HAS_CRYPTO:
        raise Exception("Unable to use cryptographic functions "
                        + "Try installing OpenSSL")
      with open (self.key_file, 'rb') as file:
        key = file.read();
      creds = SignedJwtAssertionCredentials(self.account, key, scope)
      self.credentials = creds

  def authorize(self):
    '''Construct a HTTP client that uses the supplied credentials.'''
    return credentials.authorize(httplib2.Http())

  def print_creds(self):
    '''Prints the Authorization header to use in HTTP requests.'''
    cred_dict = json.loads(self.credentials.to_json())

    if 'access_token' in cred_dict:
      print 'Authorization: Bearer %s' % (cred_dict['access_token'],)
    else:
      print 'creds: %s' % (cred_dict,)

  def GetConnection(self):
    http = httplib2.Http()
    self.credentials.refresh(http)
    http = self.credentials.authorize(http)
    self.print_creds()
    return http

def main(args):
  # Create an instance of the HotelAdsAPIConnection inner class
  api = HotelAdsAPIConnection()

  # Generate credentials
  api.InitializeCredentials(_DEFAULT_APISCOPE)

  # Output the Authorization header to use in HTTP requests
  api.GetConnection()

if __name__ == "__main__":
    main(sys.argv)</pre>

Khi phát triển ứng dụng, hãy nhớ làm theo Các phương pháp hay nhất để sử dụng khoá API một cách an toàn.

Tập lệnh Python mẫu sẽ xuất ra vùng chứa của tiêu đề Authorization mã thông báo, như trong ví dụ sau đây:

$ python sample.py
Authorization: Bearer ya29.42424242sample_420icu8122KSvoh4T42cRoG3rW1lc0Q
$

Sử dụng giá trị của mã thông báo trong yêu cầu của bạn. Sẽ có hiệu lực trong 1 giờ sau khi bạn để tạo mã.

Khắc phục sự cố

Bạn gặp sự cố? Việc kiểm tra nhanh các mục sau đây có thể giải quyết được sự cố.

  1. Bạn có tạo dự án trong Google Developer Console không?
  2. Bạn có tìm thấy và bật Travel Partner API không?
  3. Bạn đã tải tệp .p12 xuống chưa—khoá riêng tư sau khi nhấp vào Tạo mã ứng dụng khách rồi chọn Tài khoản dịch vụ?
  4. Bạn có nhận được địa chỉ email có mã ứng dụng khách của tài khoản dịch vụ theo một biểu mẫu không: nnnnnnn@app_name.google.com.iam.gserviceaccount.com?
  5. Bạn đã chia sẻ tài khoản Trung tâm Quảng cáo khách sạn với tài khoản dịch vụ bằng cách nhấp vào nút Chia sẻ tài khoản này?
  6. Bạn đã gửi địa chỉ email của tài khoản dịch vụ và mã đối tác của bạn cho Giám đốc Quản lý Khách hàng về Kỹ thuật (TAM) của bạn không?
  7. Các lệnh gọi Travel Partner API của bạn có truyền mã thông báo nhận được gần đây trong phần tử không Tiêu đề Authorization là gì?
  8. Mã thông báo truy cập của tiêu đề Authorization đã tồn tại hơn 1 giờ chưa?

Bảng sau đây liệt kê một số lỗi phổ biến và cách khắc phục:

Lỗi Mô tả
Invalid credentials Điều này có thể có nhiều ý nghĩa. Nếu bạn gặp phải lỗi này, hãy kiểm tra để đảm bảo:
  • Bạn đã chỉ định tiêu đề Authorization với một hàm mang hợp lệ mã thông báo.
  • Mã thông báo mang tải chưa đến một giờ. Mã thông báo chỉ có hiệu lực trong vòng một giờ.
  • Bạn đã chỉ định đúng tên đối tác (với partner tham số chuỗi truy vấn). Giá trị là mã đối tác duy nhất của bạn, không phải là tên đối tác xuất hiện trong Trung tâm Quảng cáo khách sạn. Nếu bạn không biết người thân của mình Hãy liên hệ với Giám đốc Quản lý Khách hàng về Kỹ thuật (TAM) của bạn.
Not found Rất có thể điểm cuối của bạn không đúng định dạng. Kiểm tra để chắc chắn rằng bạn đang gửi một GET và URL yêu cầu này là hợp lệ (URL này tuân thủ vào cú pháp API mà bạn đang cố gắng truy cập).
Invalid string value Một hoặc nhiều phần của điểm cuối chứa cú pháp không hợp lệ. Ví dụ: bạn có thể đã viết sai chính tả một phần của đường dẫn. Kiểm tra xem bạn đã sử dụng đúng dấu gạch dưới, cách viết hoa và từ ngữ trong toàn bộ đường dẫn của bạn.
Unsupported output format Lỗi này thường xảy ra nhất khi sử dụng API Báo cáo. Bạn phải chỉ định "alt=csv" trong URL của GET của bạn. API Báo cáo không hỗ trợ JSON.
AccessTokenRefreshError/Invalid grant Khi chạy ứng dụng Python mẫu, lỗi này có thể là do trong số sau:
  • Địa chỉ email tài khoản dịch vụ của bạn không chính xác. Kiểm tra email trong Google Developer Console và đảm bảo rằng bảng điều khiển này được phép truy cập vào API.
  • Địa chỉ email không có quyền truy cập API. Kiểm tra để đảm bảo rằng email được phép truy cập vào dữ liệu khách sạn của bạn (được chia sẻ qua Hotel Center).
  • Tệp khoá không phải là tệp chính xác dành cho tài khoản dịch vụ. Sử dụng DevConsole để tải chứng chỉ .p12 mới xuống và chắc chắn ứng dụng Python của bạn trỏ sang đúng ứng dụng.
HotelAdsAPIConnection object has no attribute credentials Khi chạy ứng dụng Python mẫu, đường dẫn đến .p12 của bạn tệp không chính xác.
Invalid scope Khi chạy ứng dụng Python mẫu, phạm vi API phải là https://www.googleapis.com/auth/travelpartner.
Forbidden Mã tài khoản mà bạn sử dụng không được bạn uỷ quyền để truy cập. Nếu là chủ sở hữu tài khoản phụ, bạn có thể không truy cập được mã tài khoản gốc hoặc mã tài khoản gốc.