Intégration côté serveur

Les éditeurs utiliseront principalement l'intégration côté serveur pour gérer les lecteurs et leurs droits d'accès, et UpdateReaderEntitlements pour mettre à jour l'enregistrement Google du droit d'accès d'un ID produit pour un PPID.

Configuration de GCP

Activer l'API Subscription Linking dans GCP

Pour utiliser un compte de service et gérer les droits d'accès d'un lecteur, l'API Subscription Linking doit être activée et un compte de service OAuth doit être correctement configuré pour un projet GCP. Pour activer l'API Subscription Linking pour un projet, accédez au menu -> API et services -> Bibliothèque et recherchez Subscription Linking, ou accédez directement à la page suivante :


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

api

Figure 1. Accéder à la bibliothèque d'API et activer l'API pour un projet GCP

Créer un compte de service dans GCP

Les comptes de service permettent d'autoriser l'accès à l'API Subscription Linking depuis votre application.

  1. Créez un compte de service dans la console de votre projet GCP.
  2. Créez des identifiants pour le compte de service et enregistrez le fichier credentials.json dans un emplacement sécurisé accessible par votre application.

Utiliser des comptes de service avec l'API Subscription Linking

Après avoir créé un compte de service et généré le fichier credentials.json, vous pouvez utiliser une bibliothèque cliente googleapis ou des requêtes signées via l'API REST. Les bibliothèques clientes traitent automatiquement les demandes d'access_token appropriées, tandis que l'interface REST nécessite de signer une requête pour échanger un id_token contre un access_token à envoyer avec votre requête. La bibliothèque cliente suivante et l'API REST utilisent le point de terminaison getReader(). Pour voir une démonstration en direct de toutes les méthodes d'API, veuillez consulter le site de démonstration de l'association d'abonnement (code).

Exemple de requête avec la bibliothèque cliente 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}`,
  })
}

Signature manuelle de la requête de l'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
}