Integrace na straně serveru

Vydavatelé budou integraci na straně serveru používat především ke správě čtenářů a jejich nároků. K aktualizaci záznamu Googlu o nároku konkrétního PPID na ID produktu bude vydavatel používat primárně metodu UpdateReaderEntitlements.

Nastavení GCP

Aktivace rozhraní Subscription Linking API v GCP

K používání servisního úču a správě nároků čtenáře, musí být v projektu GCP aktivováno rozhraní Subscription Linking API a správně nakonfigurovaný servisní účet OAuth. Pokud pro projekt chcete aktivovat rozhraní Subscription Linking API, přejděte v nabídce na APIs & Services (API a knihovny) -> Library (Knihovna) a vyhledejte „Subscription Linking“, nebo příslušnou stránku navštivte přímo:


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

api

Obrázek 1. Přechod do knihovny API a povolení API pro projekt GCP.

Vytvoření servisního účtu v GCP

Servisní účty se používají k přístupu z vaší aplikace k rozhraní Subscription Linking API.

  1. V konzoli projektu GCP vytvořte servisní účet.
  2. Vytvořte pro servisní účet přihlašovací údaje a soubor credentials.json uložte na bezpečném místě přístupném pro vaši aplikaci.

Používání servisních účtů s rozhraním Subscription Linking API

Po vytvoření servisního účtu a vygenerování souboru credentials.json můžete použít klientskou knihovnu googleapis nebo podepsané požadavky prostřednictvím rozhraní REST API. Klientské knihovny žádají o příslušné access_token automaticky, zatímco rozhraní REST vyžaduje podepsání požadavku k výměně tokenu id_token za token access_token k odeslání spolu s požadavkem. Následující klientská knihovna i rozhraní REST API používají koncový bod getReader(). Živou ukázku všech metod rozhraní API naleznete na webu s ukázkou propojení předplatného (kód).

Ukázkový požadavek s klientskou knihovnou node.js googleapis

import subscriptionLinking from '@googleapis/readerrevenuesubscriptionlinking'

const auth = new subscriptionLinking.auth.GoogleAuth({
  keyFile: process.env.PATH_TO_CREDENTIALS_LOCATION,
  scopes: [
    'https://www.googleapis.com/auth/readerrevenue.subscriptionlinking.manage'
  ]
})

const client = subscriptionLinking.readerrevenuesubscriptionlinking(
  {
    version: 'v1',
    auth
  }
)

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

Ruční podepsání požadavku na rozhraní REST API

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
}