Integración del servidor

Los editores usarán principalmente la integración del servidor para administrar a los lectores y sus derechos. Principalmente, un editor usará UpdateReaderEntitlements para actualizar el registro de Google sobre un derecho de ID del producto para un PPID.

Configuración de GCP

Habilita la API de Subscription Linking en GCP

Para usar una cuenta de servicio y administrar los derechos de un lector, un proyecto de GCP debe tener habilitada la API de Subscription Linking y una cuenta de servicio de OAuth configurada correctamente. Para habilitar la API de Subscription Linking para un proyecto, navega desde el menú -> APIs y servicios -> Biblioteca y busca Subscription Linking, o visita la página directamente:


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

API

Figura 1: Navegar a la biblioteca de la API y habilitar la API para un proyecto de GCP

Crea una cuenta de servicio en GCP

Las cuentas de servicio se usan para permitir el acceso de tu app a la API de Subscription Linking.

  1. Crea una cuenta de servicio en la consola de tu proyecto de GCP
  2. Crea credenciales para la cuenta de servicio y almacena el archivo credentials.json en una ubicación segura a la que pueda acceder tu aplicación.

Usa cuentas de servicio con la API de Subscription Linking

Después de crear una cuenta de servicio y generar el archivo credentials.json, puedes usar una biblioteca cliente de googleapis o solicitudes firmadas a través de la API de REST. Las bibliotecas cliente controlan automáticamente la solicitud del access_token apropiado, mientras que la interfaz REST requiere que se firme una solicitud para intercambiar un id_token por un access_token para que se envíe junto con tu solicitud. La siguiente biblioteca cliente y la API de REST usan el extremo getReader(). Para ver una demostración en vivo de todos los métodos de la API, consulta el sitio de demostración de Subscription Linking (código).

Solicitud de muestra con la biblioteca cliente de googleapis node.js

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}`,
  })
}

Firma de forma manual la solicitud a la API de 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
}