Tích hợp phía máy chủ

Các nhà xuất bản chủ yếu sử dụng tính năng tích hợp phía máy chủ để quản lý độc giả và các quyền của họ. Chủ yếu các nhà xuất bản sử dụng UpdateReaderEntitlements để cập nhật bản ghi của Google về quyền đối với một PPID (giá trị nhận dạng do nhà xuất bản cung cấp).

Thiết lập Google Cloud

Quy trình định cấu hình cấu hình Liên kết gói thuê bao trong Google Cloud bao gồm hai thành phần chính:

  1. Bật API cho một dự án cụ thể
  2. Tạo tài khoản dịch vụ để truy cập API

Bật Subscription Linking API (API Liên kết gói thuê bao)

Để sử dụng tài khoản dịch vụ và quản lý các quyền của độc giả, dự án Google Cloud phải bật cả Subscription Linking API (API Liên kết gói thuê bao) và tài khoản dịch vụ OAuth được định cấu hình đúng cách. Để bật Subscription Linking API (API Liên kết gói thuê bao) cho một dự án, hãy chuyển đến trình đơn -> API & Services -> Thư viện rồi tìm Subscription Linking hoặc truy cập trực tiếp vào trang:


https://console.cloud.google.com/apis/library?project=gcp_project_id

api

Hình 1. Chuyển đến Thư viện API và bật API cho dự án Google Cloud.

Tạo tài khoản dịch vụ

Tài khoản dịch vụ được dùng để cho phép ứng dụng truy cập vào Subscription Linking API (API Liên kết gói thuê bao).

  1. Tạo tài khoản dịch vụ trong bảng điều khiển của dự án.
  2. Tạo thông tin xác thực cho tài khoản dịch vụ và lưu trữ tệp credentials.json ở một vị trí an toàn mà ứng dụng của bạn có thể truy cập.
  3. Cấp vai trò IAM "Quản trị viên liên kết gói thuê bao" cho tài khoản dịch vụ mà bạn đã tạo. Để kiểm soát chi tiết các chức năng của tài khoản dịch vụ, bạn có thể chỉ định vai trò thích hợp trong bảng sau.
Chức năng / Vai trò Quản trị viên liên kết gói thuê bao Người xem liên kết gói thuê bao Người xem quyền liên kết gói thuê bao
Nhận quyền của độc giả
Thu hút độc giả
Cập nhật quyền của độc giả
Xoá người đọc

Dùng tài khoản dịch vụ với Subscription Linking API (API Liên kết gói thuê bao)

Sử dụng tài khoản dịch vụ để xác thực lệnh gọi tới Subscription Linking API (API Liên kết gói thuê bao), thông qua thư viện ứng dụng googleapis hoặc bằng cách ký các yêu cầu bằng API REST. Thư viện ứng dụng tự động xử lý việc yêu cầu access_token phù hợp, trong khi API REST đòi hỏi việc truy xuất một id_token rồi trao đổi dữ liệu đó lấy access_token.

Cả hai ví dụ về thư viện ứng dụng và API REST sau đây đều sử dụng điểm cuối getReader(). Để xem minh hoạ trực tiếp tất cả các phương thức API, hãy xem trang web Bản minh hoạ liên kết gói thuê bao hoặc của trang web đó.

Yêu cầu mẫu bằng thư viện ứng dụng nút.js googleapis

import {readerrevenuesubscriptionlinking_v1, Auth} from 'googleapis'
const subscriptionLinking = readerrevenuesubscriptionlinking_v1.Readerrevenuesubscriptionlinking

class SubscriptionLinking {
  constructor() {
    this.auth = new Auth.GoogleAuth({
      keyFile: process.env.KEY_FILE,
      scopes: [
        'https://www.googleapis.com/auth/readerrevenue.subscriptionlinking.manage'
      ],
    })
  }

  init() {
    return new subscriptionLinking(
        {version: 'v1', auth: this.auth})
  }
}

const api = new SubscriptionLinking()
const client = api.init()

async function getReader (ppid) {
  const publicationId = process.env.PUBLICATION_ID
  return await client.publications.readers.get({
    name: `publications/${publicationId}/readers/${ppid}`,
  })
}

Ký các yêu cầu API REST theo cách thủ công

import fetch from 'node-fetch'
import jwt from 'jsonwebtoken'

function getSignedJwt() {
  /*
    Either store the credentials string in an environmental variable
    Or implement logic to fetch it.
  */
  const key_file = process.env.CREDENTIALS_STRING

  const issueDate = new Date()
  const expireMinutes = 60
  const offsetInSeconds = issueDate.getTimezoneOffset() * 60000
  const expireDate = new Date(issueDate.getTime() + (expireMinutes * 60000))
  const iat = Math.floor((issueDate.getTime() + offsetInSeconds) / 1000)
  const exp = Math.floor((expireDate.getTime() + offsetInSeconds) / 1000)

  const token = {
    iss: key_file.client_email,
    iat,
    exp,
    aud: 'https://oauth2.googleapis.com/token',
    scope:'https://www.googleapis.com/auth/readerrevenue.subscriptionlinking.manage',
  }
  return jwt.sign(token, key_file.private_key, {
    algorithm: 'RS256',
    keyid: key_file.private_key_id,
  })
}

async function getAccessToken(signedJwt) {
  let body = new URLSearchParams();
  body.set('grant_type', 'urn:ietf:params:oauth:grant-type:jwt-bearer')
  body.set('assertion', signedJwt)
  const request = await fetch('https://oauth2.googleapis.com/token', {
    method: 'POST',
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    body
  })

  const accessResponse = await accessFetch.json()
  return accessResponse.access_token
}

async function getReader(ppid) {
  const publicationId = process.env.PUBLICATION_ID
  const base_url = 'https://readerrevenuesubscriptionlinking.googleapis.com/v1'
  const endpoint = `${base_url}/publications/${publicationId}/readers/${ppid}`
  const signedJwt = await getSignedJwt()
  const accessToken = await getAccessToken(signedJwt)

  const reader = await fetch(endpoint, {
     method: 'GET',
     headers: {
       Authorization: `Bearer ${accessToken}`,
     },
   }).then((response) => {
    return response.json()
  })

  return reader
}