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
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.
- Créez un compte de service dans la console de votre projet GCP.
- 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
}