Kullanıcı Haklarının Senkronizasyonu (Sunucu tarafı entegrasyon)

Yayıncılar, öncelikli olarak okuyucuları ve haklar. Esas olarak, yayıncılar güncelleme yapmak için UpdateReaderEntitlements kullanıyor. Google'ın PPID için Ürün Kimliği'nden yararlanma hakkı kaydı.

Google Cloud kurulumu

Google Cloud'da abonelik bağlamayı yapılandırmanın iki temel bileşeni vardır:

  1. Belirli bir proje için API'yi etkinleştirme
  2. API'ye erişmek için hizmet hesabı oluşturma

Subscription linking API'yi etkinleştirme

Hizmet hesabı kullanmak ve okuyucunun yararlanma haklarını yönetmek için Google Cloud projesinde hem Subscription linking API'nin etkinleştirilmiş olması hem de OAuth hizmet hesabını yapılandırdınız. Subscription Connectivity API'yi bir , menüden gidin -> API'ler ve Hizmetler -> Kitaplık ve arama Subscription Linking veya sayfayı doğrudan ziyaret edin:


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

api

Şekil 1. API Kitaplığı'nda gezinme ve Google Cloud projesi.

Hizmet Hesabı oluşturma

Hizmet hesapları, uygulamanızdan Subscription Connectivity API.

  1. Bir hizmet hesabı oluşturun konsolu.
  2. Hizmet hesabı için kimlik bilgileri oluşturun ve credentials.json dosyasını uygulamanızın erişebileceği güvenli bir konumda tutun.
  3. "Abonelik Bağlama Yöneticisi" IAM rolünü verin değerini öğrenebilirsiniz. Gemini'ın işlevleri üzerinde ayrıntılı denetim hizmet hesabı için aşağıdaki tablodan uygun rolü atayabilirsiniz.
Kapasite / Rol Abonelik Bağlama Yöneticisi Abonelik Bağlama Görüntüleyicisi Abonelik Bağlama Yararlanma Hakları Görüntüleyici
Okuyucudan yararlanma hakları al
Okuyucu kazanın
Okuyucu yararlanma haklarını güncelleyin
Okuyucuları sil

Subscription linking API ile hizmet hesaplarını kullanma

Subscription Connectivity API'ye yapılan çağrıların kimliğini doğrulamak için hizmet hesaplarını kullanın, googleapis istemci kitaplığıyla veya imzalama isteği göndererek ile başlayın. İstemci kitaplıkları, REST API bir id_token almayı gerektirirken uygun access_token ve sonra bunu bir access_token ile değiştiriyoruz.

Aşağıdaki istemci kitaplığı ve REST API örnekleri, getReader() uç noktasını kullanır. Canlı yayın için görmek için bkz. Abonelik Bağlama Demosu sitesine veya bu sitenin koduna bakın.

Node.js googleapis istemci kitaplığını içeren örnek istek

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

REST API isteklerini manuel olarak imzalama

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
}