שילוב בצד השרת

ספקי חדשות משתמשים בעיקר בשילוב בצד השרת לניהול קוראים וההרשאות שלהם. בעלי התוכן הדיגיטלי משתמשים בעיקר ב-UpdateReaderEntitlements כדי לעדכן את הרישום של זכאות ל-PPID ב-Google באמצעות מזהה מוצר.

הגדרה של Google Cloud

הגדרה של קישור מינויים ב-Google Cloud כוללת שני רכיבים עיקריים:

  1. הפעלת ה-API לפרויקט נתון
  2. יצירת חשבון שירות לגישה לממשק ה-API

הפעלה של Subscription Linking API

כדי להשתמש בחשבון שירות ולנהל הרשאות של קורא, צריך להפעיל את Subscription Linking API בפרויקט ב-Google Cloud וגם בחשבון שירות OAuth שמוגדר כראוי. כדי להפעיל את Subscription Linking API בפרויקט מסוים, עוברים מהתפריט -> ממשקי API ושירותים -> ספרייה ומחפשים את Subscription Linking, או נכנסים ישירות לדף:


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

api

איור 1. ניווט לספריית ה-API והפעלת ה-API לפרויקט ב-Google Cloud.

יצירת חשבון שירות

חשבונות השירות משמשים כדי לאפשר גישה מהאפליקציה ל-Subscription Linking API.

  1. יוצרים חשבון שירות במסוף של הפרויקט.
  2. יוצרים פרטי כניסה לחשבון השירות ומאחסנים את הקובץ credentials.json במיקום מאובטח שאפשר לגשת אליו לאפליקציה.
  3. מקצים לחשבון השירות ב-IAM את התפקיד 'אדמין של קישור מינויים'. כדי לקבל שליטה מפורטת על היכולות של חשבון השירות, תוכלו להקצות את התפקיד המתאים מהטבלה הבאה.
יכולת / תפקיד אדמין של קישור מינויים בעל הרשאת צפייה בקישור המינויים בעל הרשאת צפייה בהרשאות לקישור מינויים
קבלת הרשאות לקוראים
מושכים קוראים
עדכון של הרשאות הקוראים
מחיקת קוראים

שימוש בחשבונות שירות עם Subscription Linking API

באמצעות חשבונות שירות תוכלו לאמת קריאות ל-Subscription Linking API באמצעות ספריית הלקוח של googleapis או באמצעות חתימה על בקשות באמצעות ה-API ל-REST. ספריות לקוח מטפלות באופן אוטומטי בבקשות של access_token המתאים, ואילו ב-API ל-REST צריך לאחזר id_token ולאחר מכן להחליף אותו ב-access_token.

גם ספריית הלקוח הבאה וגם הדוגמאות של ה-API ל-REST משתמשות בנקודת הקצה getReader(). להדגמה בזמן אמת של כל שיטות ה-API, תוכלו להיכנס לאתר ההדגמה של קישור המינויים או לקוד שלו.

בקשה לדוגמה עם ספריית הלקוח של need.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}`,
  })
}

חתימה ידנית של בקשות ל-API ל-REST

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
}