सर्वर-साइड इंटिग्रेशन

पब्लिशर, सर्वर-साइड इंटिग्रेशन का इस्तेमाल मुख्य रूप से उन पाठकों और उनके लेखों को मैनेज करने के लिए करते हैं एनटाइटलमेंट. मुख्य तौर पर, पब्लिशर UpdateReaderEntitlements का इस्तेमाल करके किसी पीपीआईडी के लिए, प्रॉडक्ट आईडी के एनटाइटलमेंट से जुड़ा Google का रिकॉर्ड.

Google Cloud का सेटअप

Google Cloud में Subscription Linking API कॉन्फ़िगर करने की प्रक्रिया में दो अहम चरण शामिल हैं:

  1. दिए गए प्रोजेक्ट के लिए एपीआई चालू करना
  2. एपीआई ऐक्सेस करने के लिए, सेवा खाता बनाना

Subscription Linking API चालू करना

सेवा खाते का इस्तेमाल करने और लोगों के एनटाइटलमेंट मैनेज करने के लिए, Google Cloud प्रोजेक्ट में Subscription Linking API चालू होना चाहिए और सही तरीके से कॉन्फ़िगर किया गया OAuth सेवा खाता. किसी प्रोजेक्ट के लिए, मेन्यू से नेविगेट करें -> API और सेवाएं -> लाइब्रेरी और इसके लिए खोजें Subscription Linking या सीधे इस पेज पर जाएं:


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

एपीआई

पहला डायग्राम. एपीआई लाइब्रेरी पर जाना और Google के लिए एपीआई चालू करना Cloud प्रोजेक्ट शामिल है.

सेवा खाता बनाना

सेवा खातों का इस्तेमाल आपके ऐप्लिकेशन से Subscription Linking API.

  1. अपने प्रोजेक्ट के अंदर सेवा खाता बनाएं कंसोल.
  2. सेवा खाते के लिए क्रेडेंशियल बनाएं और स्टोर credentials.json फ़ाइल को किसी सुरक्षित स्थान पर रखें, जहां से आपका ऐप्लिकेशन इसे ऐक्सेस कर सके.
  3. "सदस्यता लिंक करने वाले एडमिन" को आईएएम की भूमिका दें तक आपके बनाए गए सेवा खाते पर टैप करें. एडमिन की क्षमताओं पर बारीकी से कंट्रोल करने के लिए, सेवा खाते के तौर पर सेट अप किया है, तो नीचे दी गई टेबल से सही भूमिका असाइन की जा सकती है.
क्षमता / भूमिका सदस्यता लिंक करने का एडमिन सदस्यता लिंक करने वाला व्यूअर सदस्यता लिंक करने के एनटाइटलमेंट व्यूअर
पढ़ने वाले लोगों के एनटाइटलमेंट पाना
पाठक पाएं
लोगों के एनटाइटलमेंट अपडेट करना
पढ़ने वाले लोगों को मिटाएं

Subscription Linking API के साथ सेवा खाते इस्तेमाल करना

Subscription Linking API की पुष्टि का अनुरोध करने के लिए, सेवा खातों का इस्तेमाल करना googleapis क्लाइंट लाइब्रेरी से या अनुरोधों पर हस्ताक्षर करके REST API के साथ काम करता है. क्लाइंट लाइब्रेरी सही access_token है, जबकि REST API को id_token की ज़रूरत होती है और फिर इसे access_token के लिए एक्सचेंज करें.

नीचे दिए गए दोनों क्लाइंट लाइब्रेरी और REST API के उदाहरणों में, getReader() एंडपॉइंट का इस्तेमाल किया जाता है. लाइव स्ट्रीम के लिए एपीआई के सभी तरीकों की जानकारी के साथ, Subscription Linking Demo साइट या इसका कोड.

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}`,
  });
};

async function updateEntitlements(ppid) {
  const publicationId = process.env.PUBLICATION_ID;
  const requestBody = {
    /*
    Refer to
    https://developers.google.com/news/subscribe/subscription-linking/appendix/glossary#entitlements_object
    */
    entitlements : [{
      product_id: `${publicationId}:basic`,
      subscription_token: 'abc1234',
      detail: 'This is our basic plan',
      expire_time: '2025-10-21T03:05:08.200564Z'
    }]
  };
  return await client.publications.readers.updateEntitlements({
    name: `publications/${publicationId}/readers/${ppid}`,
    requestBody
  });
};

REST API के अनुरोधों पर, मैन्युअल तरीके से साइन करना

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
}