วิธีจัดการสิทธิ์แบบละเอียด

ภาพรวม

การให้สิทธิ์แบบละเอียดช่วยให้ผู้บริโภคควบคุมข้อมูลบัญชีได้ละเอียดยิ่งขึ้น ที่พวกเขาเลือกแชร์กับแต่ละแอป ซึ่งเป็นประโยชน์ต่อทั้งผู้ใช้และนักพัฒนาซอฟต์แวร์ด้วยการมอบ การควบคุม ความโปร่งใส และความปลอดภัย คู่มือนี้จะช่วยให้คุณเข้าใจถึง การเปลี่ยนแปลงและขั้นตอนในการอัปเดตแอปพลิเคชันของคุณให้สำเร็จในการจัดการสิทธิ์แบบละเอียด

สิทธิ์แบบละเอียดคืออะไร

สมมติว่าคุณพัฒนาแอปเพื่อการทำงานที่ขอขอบเขตทั้งอีเมลและปฏิทิน ผู้ใช้ของคุณ อาจต้องการใช้แอปพลิเคชันของคุณกับ Google ปฏิทินเท่านั้น แต่ไม่ใช้กับ Gmail มี OAuth แบบละเอียด สิทธิ์ ผู้ใช้สามารถเลือกที่จะให้สิทธิ์เฉพาะ Google ปฏิทิน แต่ไม่สามารถให้สิทธิ์ Gmail การให้ผู้ใช้ให้สิทธิ์เข้าถึงข้อมูลที่เฉพาะเจาะจงจะช่วยลดการเปิดเผยข้อมูล ซึ่งเป็นการสนับสนุน เชื่อมั่น และช่วยให้ผู้ใช้ควบคุมชีวิตดิจิทัลของตนได้โดยเน้นความเป็นส่วนตัวเป็นอันดับแรก คุณต้อง ออกแบบแอปพลิเคชันให้รองรับสถานการณ์ดังกล่าวได้

เมื่อมีการขอขอบเขตที่ไม่ใช่การลงชื่อเข้าใช้มากกว่า 1 ขอบเขต

ขอบเขตการลงชื่อเข้าใช้และที่ไม่ใช่การลงชื่อเข้าใช้

สำหรับแอปพลิเคชันที่ขอขอบเขตทั้งการลงชื่อเข้าใช้และไม่ได้ลงชื่อเข้าใช้ ผู้ใช้จะเห็นความยินยอมก่อน หน้าสำหรับขอบเขตของการลงชื่อเข้าใช้ (email, profile และ openid) หลังจากผู้ใช้ให้ความยินยอม แชร์ข้อมูลประจำตัวพื้นฐาน (ชื่อ อีเมล และรูปโปรไฟล์) ซึ่งผู้ใช้จะเห็น หน้าจอขอความยินยอมสิทธิ์แบบละเอียดสำหรับขอบเขตที่ไม่ลงชื่อเข้าใช้ ในกรณีนี้ แอปพลิเคชัน ต้องตรวจสอบว่าขอบเขตใดที่ได้รับสิทธิ์จากผู้ใช้ และจะถือว่าผู้ใช้ให้สิทธิ์ทั้งหมดตามที่ขอไม่ได้ ขอบเขต ในตัวอย่างต่อไปนี้ เว็บแอปพลิเคชันจะส่งคำขอขอบเขตการลงชื่อเข้าใช้ทั้ง 3 ขอบเขตและ ขอบเขตที่ไม่มีการลงชื่อเข้าใช้ของ Google ไดรฟ์ หลังจากผู้ใช้ยอมรับขอบเขตการลงชื่อเข้าใช้ ผู้ใช้จะเห็น หน้าจอขอความยินยอมให้ใช้สิทธิ์แบบละเอียดสำหรับสิทธิ์ใน Google ไดรฟ์

ขอบเขตการลงชื่อเข้าใช้และไม่ได้ลงชื่อเข้าใช้

ขอบเขตที่ไม่มีการลงชื่อเข้าใช้มากกว่า 1 ขอบเขต

ระบบจะแสดงหน้าจอขอความยินยอมสิทธิ์แบบละเอียดแก่ผู้ใช้เมื่อแอปพลิเคชันขอเพิ่มเติม ขอบเขตที่ไม่ได้อยู่ในการลงชื่อเข้าใช้ 1 ขอบเขต ผู้ใช้สามารถเลือกสิทธิ์ที่ต้องการอนุมัติเพื่อแชร์ได้ กับแอปพลิเคชัน ต่อไปนี้คือตัวอย่างหน้าจอขอความยินยอมแบบละเอียดที่ขอ สิทธิ์เข้าถึงข้อความ Gmail และข้อมูล Google ปฏิทินของผู้ใช้

ขอบเขตที่ไม่มีการลงชื่อเข้าใช้มากกว่า 1 ขอบเขต

สำหรับแอปพลิเคชันที่ขอเฉพาะการลงชื่อเข้าใช้ ขอบเขต (email, profile และ openid) รายละเอียด หน้าจอยินยอมสิทธิ์ไม่เกี่ยวข้อง ผู้ใช้อนุมัติหรือปฏิเสธการลงชื่อเข้าใช้ทั้งหมด อีกครั้ง กล่าวคือ หากแอปพลิเคชันขอเฉพาะขอบเขตการลงชื่อเข้าใช้ (หนึ่ง สอง หรือทั้งหมด 3) หน้าจอความยินยอมสิทธิ์แบบละเอียดไม่เกี่ยวข้อง

สำหรับแอปพลิเคชันที่ขอขอบเขตที่ไม่ใช่การลงชื่อเข้าใช้เพียงขอบเขตเดียว การตั้งค่า หน้าจอคำยินยอมไม่เกี่ยวข้อง กล่าวคือ ผู้ใช้อนุมัติหรือ ปฏิเสธคำขอทั้งหมด และไม่มีช่องทำเครื่องหมายในหน้าจอคำยินยอม ตารางต่อไปนี้ สรุปข้อมูลเมื่อมีการแสดงหน้าจอขอความยินยอมสำหรับสิทธิ์แบบละเอียด

จำนวนขอบเขตการลงชื่อเข้าใช้ จำนวนขอบเขตที่ไม่ได้ลงชื่อเข้าใช้ หน้าจอขอความยินยอมเกี่ยวกับสิทธิ์แบบละเอียด
1-3 0 ไม่เกี่ยวข้อง
1-3 1+ เกี่ยวข้อง
0 1 ไม่เกี่ยวข้อง
0 2+ เกี่ยวข้อง

ตรวจสอบว่าแอปพลิเคชันได้รับผลกระทบหรือไม่

ดำเนินการตรวจสอบทุกส่วนในใบสมัครของคุณอย่างละเอียด ระบบจะใช้ปลายทางการให้สิทธิ์ Google OAuth 2.0 ในการส่งคำขอสิทธิ์ โปรดทราบ ผู้ใช้ที่ขอขอบเขตหลายรายการเมื่อเปิดใช้งานหน้าจอขอความยินยอมสิทธิ์แบบละเอียด ที่แสดงให้ผู้ใช้เห็น ในกรณีดังกล่าว โปรดตรวจสอบว่าโค้ดของคุณรองรับกรณีที่ผู้ใช้ ให้สิทธิ์ขอบเขตบางส่วน

วิธีตรวจสอบว่าแอปพลิเคชันของคุณใช้หลายขอบเขตหรือไม่

ตรวจสอบโค้ดของแอปหรือ สายโทรออกผ่านเครือข่ายเพื่อให้ทราบว่า Google OAuth 2.0 คำขอการให้สิทธิ์ที่แอปสร้างจะทำให้หน้าจอความยินยอมสิทธิ์แบบละเอียด ที่จะแสดง

ตรวจสอบโค้ดของแอปพลิเคชัน

ตรวจสอบส่วนของโค้ดแอปพลิเคชันที่คุณใช้เรียกใช้ OAuth ของ Google ปลายทางการให้สิทธิ์เพื่อขอสิทธิ์จากผู้ใช้ หากคุณใช้ Google API รายการใดรายการหนึ่ง ไลบรารีไคลเอ็นต์ คุณมักจะดูขอบเขตที่แอปพลิเคชันร้องขอในไคลเอ็นต์ได้ ขั้นตอนการเริ่มต้นทำงาน ตัวอย่างมีดังต่อไปนี้ คุณควรดู เกี่ยวกับ SDK ที่แอปพลิเคชันของคุณใช้ในการจัดการกับ Google OAuth 2.0 เพื่อดูว่า แอปพลิเคชันของคุณได้รับผลกระทบ ตามคำแนะนำที่แสดงในตัวอย่างต่อไปนี้ ข้อมูลอ้างอิง

บริการ Google Identity

บริการ Google Identity ต่อไปนี้ ข้อมูลโค้ดไลบรารี JavaScript จะเริ่มต้น TokenClient ที่มี ขอบเขตที่ไม่ได้ลงชื่อเข้าใช้ หน้าจอขอความยินยอมสิทธิ์แบบละเอียดจะแสดงเมื่อ แอปขอการให้สิทธิ์จากผู้ใช้

const client = google.accounts.oauth2.initTokenClient({
  client_id: 'YOUR_CLIENT_ID',
  scope: 'https://www.googleapis.com/auth/calendar.readonly \
  https://www.googleapis.com/auth/contacts.readonly',
  callback: (response) => {
    ...
  },
});

Python

ข้อมูลโค้ดต่อไปนี้ใช้โมดูล google-auth-oauthlib.flow ในการ สร้างคำขอการให้สิทธิ์ พารามิเตอร์ scope มี ขอบเขตที่ไม่ได้ลงชื่อเข้าใช้ หน้าจอขอความยินยอมสิทธิ์แบบละเอียดจะแสดงเมื่อ แอปพลิเคชันจะขอสิทธิ์จากผู้ใช้

import google.oauth2.credentials
import google_auth_oauthlib.flow

# Use the client_secret.json file to identify the application requesting
# authorization. The client ID (from that file) and access scopes are required.
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/calendar.readonly',
                    'https://www.googleapis.com/auth/contacts.readonly'])

Node.js

ข้อมูลโค้ดที่ตามมาจะสร้างออบเจ็กต์ google.auth.OAuth2 ซึ่งกำหนด ในคำขอการให้สิทธิ์ซึ่งพารามิเตอร์ scope ประกอบด้วย ขอบเขตที่ไม่ได้ลงชื่อเข้าใช้ หน้าจอขอความยินยอมสิทธิ์แบบละเอียดจะแสดงเมื่อเว็บแอป ขอสิทธิ์จากผู้ใช้

const {google} = require('googleapis');

/**
  * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI
  * from the client_secret.json file. To get these credentials for your application, visit
  * https://console.cloud.google.com/apis/credentials.
  */
const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// Access scopes for read-only Calendar and Contacts.
const scopes = [
  'https://www.googleapis.com/auth/calendar.readonly',
  'https://www.googleapis.com/auth/contacts.readonly']
];

// Generate a url that asks permissions
const authorizationUrl = oauth2Client.generateAuthUrl({
  // 'online' (default) or 'offline' (gets refresh_token)
  access_type: 'offline',
  /** Pass in the scopes array defined above.
    * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
  scope: scopes,
  // Enable incremental authorization. Recommended as best practices.
  include_granted_scopes: true
});

ตรวจสอบสายที่โทรออกผ่านเครือข่าย

วิธีตรวจสอบการเรียกเครือข่ายจะแตกต่างกันไปตาม ประเภทไคลเอ็นต์ของแอปพลิเคชัน

ขณะตรวจสอบการเรียกเครือข่าย ให้มองหาคำขอที่ส่งไปยัง OAuth ของ Google ปลายทางการให้สิทธิ์ และตรวจสอบพารามิเตอร์ scope

ค่าเหล่านี้ทำให้หน้าจอความยินยอมสำหรับสิทธิ์แบบละเอียดแสดง

  • พารามิเตอร์ scope มีขอบเขตการลงชื่อเข้าใช้และขอบเขตที่ไม่ได้ลงชื่อเข้าใช้

    ตัวอย่างคำขอต่อไปนี้มีขอบเขตการลงชื่อเข้าใช้ทั้ง 3 ขอบเขต และขอบเขตที่ไม่มีการลงชื่อเข้าใช้ 1 ขอบเขต ในการดูข้อมูลเมตาของไฟล์ Google ไดรฟ์ของผู้ใช้ ให้ทำดังนี้

    https://accounts.google.com/o/oauth2/v2/auth?
    access_type=offline&
    scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile%20openid%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly&
    include_granted_scopes=true&
    response_type=code&
    redirect_uri=YOUR_REDIRECT_URL&
    client_id=YOUR_CLIENT_ID
  • พารามิเตอร์ scope มีขอบเขตที่ไม่ใช่การลงชื่อเข้าใช้มากกว่า 1 ขอบเขต

    คำขอตัวอย่างต่อไปนี้มีขอบเขตที่ไม่ได้ลงชื่อเข้าใช้ 2 ขอบเขตเพื่อดู Google ไดรฟ์ของผู้ใช้ ข้อมูลเมตาและจัดการไฟล์ Google ไดรฟ์ที่เจาะจง

  • https://accounts.google.com/o/oauth2/v2/auth?
    access_type=offline&
    scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.file&
    include_granted_scopes=true&
    response_type=code&
    redirect_uri=YOUR_REDIRECT_URL&
    client_id=YOUR_CLIENT_ID

แนวทางปฏิบัติแนะนำในการจัดการสิทธิ์แบบละเอียด

หากคุณพิจารณาแล้วว่าต้องอัปเดตแอปพลิเคชันเพื่อจัดการ คุณควรอัปเดตโค้ดที่จำเป็นเพื่อให้จัดการความยินยอมได้อย่างเหมาะสม สำหรับหลายขอบเขต แอปพลิเคชันทั้งหมดควรสอดคล้องกับแนวทางปฏิบัติแนะนำต่อไปนี้

  1. ตรวจสอบ บริการ Google API: นโยบายข้อมูลผู้ใช้และตรวจสอบว่าคุณปฏิบัติตามนโยบายดังกล่าว
  2. ส่งคำขอขอบเขตเฉพาะที่จำเป็นสำหรับงาน คุณ ต้องปฏิบัติตามนโยบาย Google OAuth 2.0 ที่คุณ ขอขอบเขตที่คุณ คุณไม่ควรขอ ขอบเขตที่ลงชื่อเข้าใช้ เว้นแต่จำเป็นต่อฟังก์ชันหลักของแอป การรวมกลุ่มอีเมล ร่วมกันในระดับหนึ่ง โดยเฉพาะสำหรับผู้ใช้ครั้งแรกที่ไม่คุ้นเคยกับ ฟีเจอร์ต่างๆ ของแอปพลิเคชัน ก็อาจทำให้พวกเขาเข้าใจความต้องการ สิทธิ์ การทำเช่นนี้จะทำให้การปลุกเกิดขึ้นและทำให้ผู้ใช้ไม่มีส่วนร่วมกับ แอปพลิเคชัน
  3. ให้ข้อมูลเหตุผลแก่ผู้ใช้ก่อนที่จะถาม คำขอการให้สิทธิ์ อธิบายให้ชัดเจนว่าเหตุใดแอปพลิเคชันของคุณจึงต้องการสิทธิ์ที่ขอ สิ่งที่คุณจะทำกับข้อมูลของผู้ใช้ และผู้ใช้จะได้รับประโยชน์อย่างไรจากการอนุมัติคำขอ การวิจัยของเราชี้ให้เห็นว่าคำอธิบายเหล่านี้ช่วยเพิ่มความไว้วางใจและการมีส่วนร่วมของผู้ใช้
  4. การใช้งาน การให้สิทธิ์เพิ่มขึ้น ทุกครั้งที่แอปพลิเคชันขอขอบเขตเพื่อหลีกเลี่ยงการจัดการโทเค็นเพื่อการเข้าถึงหลายรายการ
  5. ตรวจสอบขอบเขตที่ผู้ใช้ให้สิทธิ์ เมื่อส่งคำขอหลายรายการ พร้อมกัน ผู้ใช้อาจไม่ให้สิทธิ์ขอบเขตทั้งหมดที่แอปของคุณร้องขอ แอปของคุณควร ตรวจสอบว่าผู้ใช้ให้สิทธิ์ขอบเขตใดและจัดการการปฏิเสธขอบเขตโดยปิดใช้ขอบเขตที่เกี่ยวข้อง ใหม่ๆ ปฏิบัติตามนโยบาย Google OAuth 2.0 ใน การจัดการความยินยอมสำหรับหลายรายการ ขอบเขต และแจ้งผู้ใช้ให้ขอความยินยอมอีกครั้งเมื่อได้ระบุไว้ชัดเจนแล้วเท่านั้น ต้องการใช้ฟีเจอร์เฉพาะที่ต้องมีขอบเขต

อัปเดตแอปพลิเคชันเพื่อจัดการสิทธิ์แบบละเอียด

แอปพลิเคชัน Android

คุณควรอ่านเอกสารประกอบของ SDK ที่คุณใช้เพื่อโต้ตอบกับ Google OAuth 2.0 และ อัปเดตแอปพลิเคชันของคุณเพื่อจัดการการอนุญาตแบบละเอียดตาม แนวทางปฏิบัติแนะนำ

หากคุณใช้ auth.api.signin คุณสามารถใช้ SDK จากบริการ Google Play เพื่อโต้ตอบกับ OAuth 2.0 ของ Google requestPermissions เพื่อขอขอบเขตจำนวนน้อยสุดที่จำเป็น และ hasPermissions เพื่อตรวจสอบขอบเขตที่ผู้ใช้อนุญาตเมื่อ การขอสิทธิ์แบบละเอียด

แอปพลิเคชันส่วนขยายของ Chrome

คุณควรใช้ Chrome Identity API เพื่อทำงานกับ Google OAuth 2.0 โดยอิงตาม แนวทางปฏิบัติแนะนำ

ตัวอย่างต่อไปนี้แสดงวิธีจัดการสิทธิ์แบบละเอียดอย่างถูกต้อง

manifest.json

ไฟล์ Manifest ตัวอย่างแสดงขอบเขตที่ไม่ได้ลงชื่อเข้าใช้ 2 ขอบเขตสำหรับส่วนขยาย Chrome แอปพลิเคชัน

{
  "name": "Example Chrome extension application",
  ...
  "permissions": [
      "identity"
    ],
  "oauth2" : {
      "client_id": "YOUR_CLIENT_ID",
      "scopes":["https://www.googleapis.com/auth/calendar.readonly",
                "https://www.googleapis.com/auth/contacts.readonly"]
  }
}

แนวทางที่ไม่ถูกต้อง

ทั้งหมดหรือไม่มีเลย

ผู้ใช้คลิกปุ่มเพื่อเริ่มต้นกระบวนการให้สิทธิ์ ข้อมูลโค้ดจะถือว่า ผู้ใช้จะเห็นปุ่ม "ทั้งหมด" หน้าจอขอความยินยอมสำหรับขอบเขต 2 ขอบเขตที่ระบุ ในไฟล์ manifest.json โดยไม่คำนึงถึงขอบเขตที่ผู้ใช้ให้สิทธิ์

oauth.js

...
document.querySelector('button').addEventListener('click', function () {
  chrome.identity.getAuthToken({ interactive: true },
      function (token) {
          if (token === undefined) {
            // User didn't authorize both scopes.
            // Updating the UX and application accordingly
            ...
          } else {
            // User authorized both or one of the scopes.
            // It neglects to check which scopes users granted and assumes users granted all scopes.

            // Calling the APIs, etc.
            ...
          }
      });
});

แนวทางที่ถูกต้อง

ขอบเขตขนาดเล็กที่สุด

เลือกขอบเขตชุดที่เล็กที่สุดที่จำเป็น

แอปพลิเคชันควรขอชุดขอบเขตที่น้อยที่สุดเท่าที่จำเป็นเท่านั้น ขอแนะนำให้ใช้ ที่แอปพลิเคชันจะขอครั้งละ 1 ขอบเขตเมื่อจำเป็นต้องใช้ในการทำงานให้เสร็จสมบูรณ์

ในตัวอย่างนี้ สมมติว่าขอบเขตทั้ง 2 รายการที่ประกาศใน manifest.json เป็นชุดขอบเขตขนาดเล็กที่สุดที่ต้องการ ไฟล์ oauth.js ใช้ Chrome Identity API เพื่อเริ่มต้นกระบวนการให้สิทธิ์กับ Google คุณควรเลือกใช้ เปิดใช้สิทธิ์แบบละเอียด เพื่อให้ผู้ใช้ควบคุมการมอบสิทธิ์ แอปพลิเคชัน แอปพลิเคชันของคุณควรจัดการการตอบสนองจากผู้ใช้อย่างเหมาะสมโดยตรวจสอบ ขอบเขตที่ผู้ใช้ให้สิทธิ์

oauth.js

...
document.querySelector('button').addEventListener('click', function () {
  chrome.identity.getAuthToken({ interactive: true, enableGranularPermissions: true },
      function (token, grantedScopes) {
          if (token === undefined) {
            // User didn't authorize any scope.
            // Updating the UX and application accordingly
            ...
          } else {
            // User authorized the request. Now, check which scopes were granted.
            if (grantedScopes.includes('https://www.googleapis.com/auth/calendar.readonly'))
            {
              // User authorized Calendar read permission.
              // Calling the APIs, etc.
              ...
            }
            else
            {
              // User didn't authorize Calendar read permission.
              // Update UX and application accordingly
              ...
            }

            if (grantedScopes.includes('https://www.googleapis.com/auth/contacts.readonly'))
            {
              // User authorized Contacts read permission.
              // Calling the APIs, etc.
              ...
            }
            else
            {
              // User didn't authorize Contacts read permission.
              // Update UX and application accordingly
              ...
            }
          }
      });
});

แอปพลิเคชัน iOS, iPadOS และ macOS

คุณควรอ่านเอกสารประกอบของ SDK ที่คุณใช้เพื่อโต้ตอบกับ Google OAuth 2.0 และ อัปเดตแอปพลิเคชันของคุณเพื่อจัดการการอนุญาตแบบละเอียดตาม แนวทางปฏิบัติแนะนำ

หากคุณใช้ไลบรารี Google Sign-In สำหรับ iOS และ macOS ในการโต้ตอบกับ Google OAuth 2.0 คุณควรตรวจสอบ เอกสารประกอบเกี่ยวกับการจัดการแบบละเอียด สิทธิ์

เว็บแอปพลิเคชัน

คุณควรอ่านเอกสารประกอบของ SDK ที่คุณใช้เพื่อโต้ตอบกับ Google OAuth 2.0 และ อัปเดตแอปพลิเคชันของคุณเพื่อจัดการการอนุญาตแบบละเอียดตาม แนวทางปฏิบัติแนะนำ

การเข้าถึงฝั่งเซิร์ฟเวอร์ (ออฟไลน์)

โหมดการเข้าถึงฝั่งเซิร์ฟเวอร์ (ออฟไลน์) กำหนดให้คุณต้องดำเนินการต่อไปนี้
  • ตั้งเซิร์ฟเวอร์และกำหนดปลายทางที่เข้าถึงได้แบบสาธารณะเพื่อรับการให้สิทธิ์ โค้ด
  • กําหนดค่า URI การเปลี่ยนเส้นทาง ของปลายทางสาธารณะใน ของคอนโซล Google Cloud

ข้อมูลโค้ดต่อไปนี้แสดงตัวอย่าง NodeJS ขอขอบเขตที่ไม่มีการลงชื่อเข้าใช้ 2 ขอบเขต ผู้ใช้จะ ดูหน้าจอคำยินยอมสิทธิ์แบบละเอียด

แนวทางที่ไม่ถูกต้อง

ทั้งหมดหรือไม่มีเลย

ระบบจะเปลี่ยนเส้นทางผู้ใช้ไปยัง URL การให้สิทธิ์ ข้อมูลโค้ดจะถือว่ามีการแสดงให้ผู้ใช้เห็น ไอคอน "ปรับเปลี่ยนทุกอย่าง" หน้าจอขอความยินยอมสำหรับ 2 ขอบเขตที่ระบุไว้ใน การปกครองของ scopes โดยไม่คำนึงถึงขอบเขตที่ผู้ใช้ให้สิทธิ์

main.js

...
const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// Access scopes for two non-Sign-In scopes - Google Calendar and Contacts
const scopes = [
  'https://www.googleapis.com/auth/contacts.readonly',
  'https://www.googleapis.com/auth/calendar.readonly'
];

// Generate a url that asks permissions for the Google Calendar and Contacts scopes
const authorizationUrl = oauth2Client.generateAuthUrl({
  // 'online' (default) or 'offline' (gets refresh_token)
  access_type: 'offline',
  // Pass in the scopes array defined above
  scope: scopes,
  // Enable incremental authorization. Recommended as best practices.
  include_granted_scopes: true
});

async function main() {
  const server = http.createServer(async function (req, res) {
    // Example on redirecting user to Google OAuth 2.0 server.
    if (req.url == '/') {
      res.writeHead(301, { "Location": authorizationUrl });
    }
    // Receive the callback from Google OAuth 2.0 server.
    if (req.url.startsWith('/oauth2callback')) {
      // Handle the Google OAuth 2.0 server response
      let q = url.parse(req.url, true).query;

      if (q.error) {
        // User didn't authorize both scopes.
        // Updating the UX and application accordingly
        ...
      } else {
        // User authorized both or one of the scopes.
        // It neglects to check which scopes users granted and assumes users granted all scopes.

        // Get access and refresh tokens (if access_type is offline)
        let { tokens } = await oauth2Client.getToken(q.code);
        // Calling the APIs, etc.
        ...
      }
    }
    res.end();
  }).listen(80);
}
แนวทางที่ถูกต้อง

ขอบเขตเล็กที่สุด

เลือกขอบเขตชุดที่เล็กที่สุดที่จำเป็น

แอปพลิเคชันควรขอชุดขอบเขตที่น้อยที่สุดเท่าที่จำเป็นเท่านั้น ขอแนะนำให้ใช้ ที่แอปพลิเคชันจะขอครั้งละ 1 ขอบเขตเมื่อจำเป็นต้องใช้ในการทำงานให้เสร็จสมบูรณ์ เมื่อใดก็ตามที่แอปพลิเคชันของคุณร้องขอขอบเขต ขอบเขตควรใช้ การให้สิทธิ์ที่เพิ่มขึ้น เพื่อจะได้ไม่ต้องจัดการโทเค็นเพื่อการเข้าถึงหลายรายการ

หากแอปพลิเคชันของคุณต้องขอขอบเขตที่ไม่ได้ลงชื่อเข้าใช้หลายรายการ คุณควรใช้ การให้สิทธิ์ที่เพิ่มขึ้น เมื่อส่งคำขอและตรวจสอบขอบเขตที่ผู้ใช้ให้สิทธิ์

ในตัวอย่างนี้ สมมติว่าขอบเขตทั้ง 2 ขอบเขตที่ระบุจำเป็นต่อแอปในการ ทำงานได้อย่างถูกต้อง คุณควรเลือกใช้ เปิดใช้สิทธิ์แบบละเอียด เพื่อให้ผู้ใช้ควบคุมการมอบสิทธิ์ แอปพลิเคชัน แอปพลิเคชันของคุณควรจัดการการตอบสนองจากผู้ใช้อย่างเหมาะสมโดยตรวจสอบ ขอบเขตที่ผู้ใช้ให้สิทธิ์

main.js

...
const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// Access scopes for two non-Sign-In scopes - Google Calendar and Contacts
const scopes = [
  'https://www.googleapis.com/auth/contacts.readonly',
  'https://www.googleapis.com/auth/calendar.readonly'
];

// Generate a url that asks permissions for the Google Calendar and Contacts scopes
const authorizationUrl = oauth2Client.generateAuthUrl({
  // 'online' (default) or 'offline' (gets refresh_token)
  access_type: 'offline',
  // Pass in the scopes array defined above
  scope: scopes,
  // Enable incremental authorization. Recommended as best practices.
  include_granted_scopes: true,
  // Set to true to enable more granular permissions for Google OAuth 2.0 client IDs created before 2019.
  // No effect for newer Google OAuth 2.0 client IDs, since more granular permissions is always enabled for them.
  enable_granular_consent: true
});

async function main() {
  const server = http.createServer(async function (req, res) {
    // Redirect users to Google OAuth 2.0 server.
    if (req.url == '/') {
      res.writeHead(301, { "Location": authorizationUrl });
    }
    // Receive the callback from Google OAuth 2.0 server.
    if (req.url.startsWith('/oauth2callback')) {
      // Handle the Google OAuth 2.0 server response
      let q = url.parse(req.url, true).query;

      if (q.error) {
        // User didn't authorize both scopes.
        // Updating the UX and application accordingly
        ...
      } else {
        // Get access and refresh tokens (if access_type is offline)
        let { tokens } = await oauth2Client.getToken(q.code);
        oauth2Client.setCredentials(tokens);

        // User authorized the request. Now, check which scopes were granted.
        if (tokens.scope.includes('https://www.googleapis.com/auth/calendar.readonly'))
        {
          // User authorized Calendar read permission.
          // Calling the APIs, etc.
          ...
        }
        else
        {
          // User didn't authorize Calendar read permission.
          // Calling the APIs, etc.
          ...
        }

        // Check which scopes user granted the permission to application
        if (tokens.scope.includes('https://www.googleapis.com/auth/contacts.readonly'))
        {
          // User authorized Contacts read permission.
          // Calling the APIs, etc.
          ...
        }
        else
        {
          // User didn't authorize Contacts read permission.
          // Update UX and application accordingly
          ...
        }
      }
    }
    res.end();
  }).listen(80);
}

ตรวจสอบ คู่มือเว็บแอปฝั่งเซิร์ฟเวอร์เกี่ยวกับวิธีเข้าถึง Google API จากแอปพลิเคชันบนเซิร์ฟเวอร์

สิทธิ์การเข้าถึงฝั่งไคลเอ็นต์เท่านั้น

  • สำหรับแอปพลิเคชันที่ใช้บริการข้อมูลประจำตัวของ Google คุณควรตรวจสอบไลบรารี JavaScript เพื่อโต้ตอบกับ Google OAuth 2.0 เอกสารประกอบ เกี่ยวกับการจัดการสิทธิ์แบบละเอียด
  • สำหรับแอปพลิเคชันที่โทรออกโดยตรงโดยใช้ JavaScript ไปยังการให้สิทธิ์ Google OAuth 2.0 ปลายทาง คุณควรตรวจสอบ เอกสารประกอบ เกี่ยวกับการจัดการสิทธิ์แบบละเอียด

ทดสอบแอปพลิเคชันที่อัปเดตเกี่ยวกับการจัดการสิทธิ์แบบละเอียด

  1. สรุปกรณีทั้งหมดที่ผู้ใช้สามารถตอบสนองต่อคำขอสิทธิ์และ จากแอปพลิเคชันของคุณ เช่น หากผู้ใช้อนุญาตเพียง 2 ส่วน จากขอบเขตที่ขอ 3 ขอบเขต แอปพลิเคชันของคุณควรจะทำงานตามนั้น
  2. ทดสอบแอปพลิเคชันโดยเปิดใช้สิทธิ์แบบละเอียด คุณเปิดใช้ได้ 2 วิธี สิทธิ์แบบละเอียด
    1. ตรวจสอบหน้าจอคำยินยอม OAuth 2.0 ของแอปพลิเคชันเพื่อดูว่า สิทธิ์แบบละเอียดเปิดอยู่แล้วสำหรับ แอปพลิเคชัน คุณยังสามารถสร้างรหัสไคลเอ็นต์ Google OAuth 2.0 ใหม่สำหรับเว็บ, Android หรือ iOS ได้ด้วย ผ่านคอนโซล Google Cloud เพื่อการทดสอบ เนื่องจากสิทธิ์แบบละเอียด เปิดใช้ให้
    2. ตั้งค่าพารามิเตอร์ enable_granular_consent ไปยัง true เมื่อเรียกใช้ Google OAuth ปลายทางการให้สิทธิ์ SDK บางรายการมีการสนับสนุนอย่างชัดแจ้งสำหรับการดำเนินการนี้ พารามิเตอร์ สำหรับเครื่องมืออื่นๆ โปรดดูเอกสารประกอบเพื่อดูวิธีเพิ่มพารามิเตอร์นี้และ ด้วยตนเอง หากการใช้งานของคุณไม่รองรับการเพิ่มพารามิเตอร์ดังกล่าว คุณจะสร้างเว็บใหม่ได้ รหัสไคลเอ็นต์ Google OAuth 2.0 ของ Android หรือ iOS ผ่านคอนโซล Google Cloud สำหรับการทดสอบ ตามวัตถุประสงค์ที่ระบุไว้ก่อนหน้านี้เท่านั้น
  3. เมื่อทดสอบแอปพลิเคชันที่อัปเดตของคุณ ให้ใช้บัญชี Google ส่วนบุคคล (@gmail.com) แทน บัญชี Workspace เนื่องจากแอปของ Workspace Enterprise ที่ดำเนินการ การมอบสิทธิ์ทั่วทั้งโดเมน หรือทำเครื่องหมายเป็น เชื่อถือได้ จะไม่ได้รับผลกระทบจากการเปลี่ยนแปลงสิทธิ์แบบละเอียดในขณะนี้ ดังนั้นการทดสอบด้วย Workspace บัญชีจากองค์กรอาจไม่แสดงหน้าจอขอความยินยอมแบบละเอียดใหม่ตามที่ต้องการ