Die serverseitige Integration verwenden Verlage und Webpublisher hauptsächlich, um Leser und ihre Berechtigungen zu verwalten. Um den Google-Eintrag einer Produkt-ID-Berechtigung für eine PPID zu aktualisieren, nutzen Verlage und Webpublisher in der Regel UpdateReaderEntitlements
.
GCP-Einrichtung
Subscription Linking API in der GCP aktivieren
Damit ein Dienstkonto verwendet und die Berechtigungen eines Lesers verwaltet werden können, müssen in einem GCP-Projekt sowohl die Subscription Linking API als auch ein ordnungsgemäß konfiguriertes OAuth-Dienstkonto aktiviert sein. Wenn du die Subscription Linking API für ein Projekt aktivieren möchtest, öffne das Menü -> „APIs und Dienste“ -> „Bibliothek“ und suche nach Subscription Linking
. Du kannst die Seite aber auch direkt aufrufen:
https://console.cloud.google.com/apis/library?project=gcp_project_id
Abbildung 1: API-Bibliothek aufrufen und die API für ein GCP-Projekt aktivieren
Dienstkonto in der GCP erstellen
Dienstkonten werden verwendet, um den Zugriff deiner Anwendung auf die Subscription Linking API zu gewähren.
- Erstelle ein Dienstkonto in der Konsole deines GCP-Projekts.
- Erstelle Anmeldedaten für das Dienstkonto und speichere die Datei
credentials.json
an einem sicheren Ort, auf den deine Anwendung zugreifen kann.
Dienstkonten mit der Subscription Linking API verwenden
Nachdem du ein Dienstkonto erstellt und die Datei credentials.json
generiert hast, kannst du eine googleapis-Clientbibliothek oder signierte Anfragen über die REST API verwenden. Die Clientbibliotheken fordern automatisch das entsprechende access_token
an. Die REST API hingegen erfordert das Signieren einer Anfrage, um ein id_token
gegen ein access_token
auszutauschen, das mit deiner Anfrage gesendet werden muss. Die folgende Clientbibliothek und die folgende REST API verwenden den Endpunkt getReader()
. Eine Live-Demo aller API-Methoden findest du auf der Demoseite für die Aboverknüpfung (Code).
Beispielanfrage mit der googleapis-Clientbibliothek für 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}`,
})
}
REST API-Anfrage manuell signieren
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
}