ผู้เผยแพร่เนื้อหาใช้การผสานรวมฝั่งเซิร์ฟเวอร์เป็นหลักสำหรับการจัดการผู้อ่านและ
การให้สิทธิ์ ผู้เผยแพร่โฆษณาจะใช้ UpdateReaderEntitlements
ในการอัปเดตเป็นหลัก
บันทึกของ Google เกี่ยวกับการให้สิทธิ์รหัสผลิตภัณฑ์สำหรับ PPID
การตั้งค่า Google Cloud
การกําหนดค่าการลิงก์การสมัครใช้บริการใน Google Cloud มีคอมโพเนนต์หลัก 2 ส่วน ได้แก่
- การเปิดใช้ API สำหรับโปรเจ็กต์ที่ระบุ
- การสร้างบัญชีบริการสำหรับการเข้าถึง API
เปิดใช้ Subscription Linking API
หากต้องการใช้บัญชีบริการและจัดการการให้สิทธิ์ของผู้อ่าน Google Cloud
โปรเจ็กต์ต้องเปิดใช้ทั้ง Subscription Linking API และ
บัญชีบริการของ OAuth ที่กำหนดค่าแล้ว วิธีเปิดใช้ Subscription Linking API สำหรับ
นำทางจากเมนู -> API และ บริการ -> คลังและค้นหา
Subscription Linking
หรือไปที่หน้าเว็บโดยตรง:
https://console.cloud.google.com/apis/library?project=gcp_project_id
รูปที่ 1 การไปยังไลบรารี API และเปิดใช้ API สำหรับ โปรเจ็กต์ที่อยู่ในระบบคลาวด์
สร้างบัญชีบริการ
บัญชีบริการใช้เพื่ออนุญาตการเข้าถึงจากแอปพลิเคชันไปยัง API การลิงก์การสมัครใช้บริการ
- สร้างบัญชีบริการภายใน คอนโซลผู้ดูแลระบบ
- สร้างข้อมูลเข้าสู่ระบบสำหรับบัญชีบริการ แล้วจัดเก็บไว้
ไฟล์
credentials.json
ในตำแหน่งที่ปลอดภัยที่แอปพลิเคชันเข้าถึงได้ - มอบบทบาท IAM "ผู้ดูแลระบบการลิงก์การสมัครใช้บริการ" ไปยัง บัญชีบริการที่คุณสร้างขึ้น สำหรับการควบคุมความสามารถของ บัญชีบริการ คุณสามารถมอบหมายบทบาทที่เหมาะสมจากตารางต่อไปนี้
ความสามารถ / บทบาท | ผู้ดูแลระบบการลิงก์การสมัครใช้บริการ | ผู้ดูการลิงก์การสมัครใช้บริการ | ผู้ดูการให้สิทธิ์การลิงก์การสมัครใช้บริการ |
---|---|---|---|
รับการให้สิทธิ์ผู้อ่าน | |||
รับผู้อ่าน | |||
อัปเดตการให้สิทธิ์ผู้อ่าน | |||
ลบผู้อ่าน |
ใช้บัญชีบริการกับ Subscription Linking API
ใช้บัญชีบริการเพื่อตรวจสอบสิทธิ์การเรียกใช้ Subscription Linking API
โดยใช้ไลบรารีไคลเอ็นต์ googleapis หรือด้วยการลงชื่อคำขอ
ด้วย REST API ไลบรารีของไคลเอ็นต์จะจัดการคำขอ
access_token
ที่เหมาะสม ในขณะที่ REST API จำเป็นต้องมีการเรียก id_token
แล้วเปลี่ยนเป็น access_token
ทั้งไคลเอ็นต์ต่อไปนี้
ตัวอย่างไลบรารีและ REST API ใช้ปลายทาง getReader()
สำหรับการถ่ายทอดสด
วิธีการ API ทั้งหมดให้ดูที่
เว็บไซต์การสาธิตการลิงก์การสมัครใช้บริการ หรือรหัสของเว็บไซต์
ตัวอย่างคำขอที่มีไลบรารีของไคลเอ็นต์ 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
}