Les éditeurs utilisent principalement l'intégration côté serveur pour gérer les lecteurs et leurs droits d'accès. Les éditeurs utilisent principalement UpdateReaderEntitlements
pour mettre à jour l'enregistrement Google du droit d'accès d'un ID produit pour un PPID.
Configuration de Google Cloud
La configuration de l'API Subscription Linking dans Google Cloud se fait en deux étapes:
- Activer l'API pour un projet donné
- Créer un compte de service pour accéder à l'API
Activer l'API Subscription Linking
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 Google Cloud. 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 Google Cloud
Créer un compte de service
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.
- Créez des identifiants pour le compte de service et stockez le fichier
credentials.json
dans un emplacement sécurisé accessible par votre application. - Accordez le rôle IAM "Administrateur de l'association d'abonnements" au compte de service que vous avez créé. Pour un contrôle précis des fonctionnalités du compte de service, vous pouvez attribuer le rôle approprié à partir du tableau suivant.
Capacité / Rôle | Administrateur d'associations d'abonnements | Lecteur d'associations d'abonnements | Lecteur des droits d'accès aux associations d'abonnements |
---|---|---|---|
Obtenir les droits d'accès des lecteurs | |||
Attirer des lecteurs | |||
Mettre à jour les droits d'accès du lecteur | |||
Supprimer les lecteurs |
Utiliser des comptes de service avec l'API Subscription Linking
Utilisez des comptes de service pour authentifier les appels à l'API Subscription Linking, soit à l'aide de la bibliothèque cliente googleapis, soit en signant des requêtes à l'aide de l'API REST. Les bibliothèques clientes traitent automatiquement les demandes d'access_token
, tandis que l'API REST nécessite de récupérer un id_token
, puis de l'échanger contre un access_token
.
La bibliothèque cliente et les exemples de l'API REST utilisent le point de terminaison getReader()
. Pour voir une démonstration en direct de toutes les méthodes d'API, consultez le site de démonstration de l'association d'abonnement ou son code.
Exemple de requête avec la bibliothèque cliente Node.js googleapis
import {readerrevenuesubscriptionlinking_v1, Auth} from 'googleapis'
const subscriptionLinking = readerrevenuesubscriptionlinking_v1.Readerrevenuesubscriptionlinking
class SubscriptionLinking {
constructor() {
this.auth = new Auth.GoogleAuth({
keyFile: process.env.KEY_FILE,
scopes: [
'https://www.googleapis.com/auth/readerrevenue.subscriptionlinking.manage'
],
})
}
init() {
return new subscriptionLinking(
{version: 'v1', auth: this.auth})
}
}
const api = new SubscriptionLinking()
const client = api.init()
async function getReader (ppid) {
const publicationId = process.env.PUBLICATION_ID
return await client.publications.readers.get({
name: `publications/${publicationId}/readers/${ppid}`,
})
}
Signer manuellement des requêtes 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
}