Integratie aan de serverzijde

Uitgevers gebruiken integratie aan de serverzijde voornamelijk om lezers en hun toegangsrechten te beheren. In de eerste plaats gebruikt een uitgever UpdateReaderEntitlements om de record van Google voor een PPID van Google-product te updaten.

GCP-installatie

De API voor het koppelen van abonnementen aanzetten in GCP

Als je een serviceaccount wilt gebruiken en de toegangsrechten van een lezer wilt beheren, moeten zowel de API voor het koppelen van abonnementen als de API met het juiste OAuth-serviceaccount aanstaan voor een GCP-project. Als je de API voor het koppelen van abonnementen voor een project wilt aanzetten, ga je vanuit het menu naar -> API's en services -> Bibliotheek en zoek je naar Subscription Linking of ga je rechtstreeks naar de pagina:


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

api

Afbeelding 1. Navigeren naar de API-bibliotheek en de API aanzetten voor een GCP-project.

Een serviceaccount maken in GCP

Serviceaccounts worden gebruikt om toegang vanuit je app tot de API voor het koppelen van abonnementen toe te staan.

  1. Een serviceaccount maken in de console van je GCP-project
  2. Maak inloggegevens voor het serviceaccount en sla het credentials.json-bestand op een beveiligde locatie op die toegankelijk is voor je app.

Serviceaccounts gebruiken met de API voor het koppelen van abonnementen

Nadat je een serviceaccount hebt gemaakt en het credentials.json-bestand hebt gegenereerd, kun je een Google API-clientbibliotheek of ondertekende verzoeken gebruiken via de REST API. De clientbibliotheken verwerken automatisch de juiste access_token, terwijl de REST-interface een verzoek moet ondertekenen om een id_token in te wisselen voor een access_token om mee te sturen met je verzoek. De volgende clientbibliotheek en REST API gebruiken het getReader()-eindpunt. Voor een live demonstratie van alle API-methoden bekijk je de site van de Demo voor koppelen van abonnementen (code).

Voorbeeldverzoek met de clientbibliotheek van 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}`,
  })
}

REST API-verzoek handmatig ondertekenen

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
}