Los editores utilizarán la integración del lado del servidor principalmente para gestionar a los lectores y sus derechos. Principalmente, un editor usará UpdateReaderEntitlements
para actualizar el registro de Google del derecho de ID de producto de un PPID.
Configuración de GCP
Habilitar la API Subscription Linking en GCP
Para usar una cuenta de servicio y gestionar los derechos de un lector, un proyecto de GCP debe tener la API Subscription Linking habilitada y una cuenta de servicio de OAuth configurada correctamente. Para habilitar la API Subscription Linking en un proyecto, ve al menú -> APIs y servicios -> Biblioteca y busca Subscription Linking
. También puedes visitar la página directamente:
https://console.cloud.google.com/apis/library?project=gcp_project_id
Imagen 1. Acceder a la biblioteca de APIs y habilitar la API en un proyecto de GCP.
Crear una cuenta de servicio en GCP
Las cuentas de servicio se usan para permitir el acceso de tu aplicación a la API Subscription Linking.
- Crea una cuenta de servicio en la consola de tu proyecto de GCP.
- Crea las credenciales de la cuenta de servicio y almacena el archivo
credentials.json
en una ubicación segura a la que pueda acceder tu aplicación.
Usar cuentas de servicio con la API Subscription Linking
Después de crear una cuenta de servicio y generar el archivo credentials.json
, puedes usar una biblioteca de cliente googleapis o solicitudes firmadas a través de la API REST. Las bibliotecas de cliente gestionan automáticamente las solicitudes del access_token
adecuado, mientras que la interfaz de REST requiere que se firme una solicitud para intercambiar un id_token
por un access_token
y enviarlo junto con tu solicitud. Tanto la biblioteca de cliente como la API REST de abajo usan el endpoint getReader()
. Para ver una demostración en directo de todos los métodos de la API, visita el sitio de demostración de la vinculación de suscripciones (código).
Solicitud de ejemplo con la biblioteca de cliente googleapis de 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}`,
})
}
Firmar manualmente solicitudes a la 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
}