การอนุญาตแบบกําหนดเองด้วยฟังก์ชันข้อมูลผู้ใช้สําหรับ GraphQL API (พรีวิว)

Authorizer User-Defined Functions (UDF) ให้คุณเรียกใช้ตรรกะการให้สิทธิ์แบบกําหนดเองก่อนที่คําขอ GraphQL API จะได้รับการประมวลผล ความสามารถนี้ช่วยให้เจ้าของ API สามารถบังคับใช้กฎการเข้าถึงเฉพาะธุรกิจที่นอกเหนือไปจากการกําหนดบทบาทแบบคงที่ เมื่อใช้ Authorizer UDF คุณจะประเมินข้อมูลจากคําขอที่ตรวจสอบสิทธิ์แล้ว เช่น การอ้างสิทธิ์ในโทเค็น JSON Web Token (JWT) และตัดสินใจว่าควรอนุญาตคําขอหรือไม่ ตรรกะถูกนําไปใช้เป็นฟังก์ชันและเรียกใช้โดยอัตโนมัติสําหรับการเรียก API ขาเข้า

กรณีการใช้งาน

ใช้ฟังก์ชันข้อมูลผู้ใช้ของผู้ให้สิทธิ์เมื่อคุณต้องการ:

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

วิธีการทํางานของฟีเจอร์การให้สิทธิ์

เมื่อเปิดใช้งานการให้สิทธิ์แบบกําหนดเองด้วยฟังก์ชันข้อมูลผู้ใช้:

  • ฟังก์ชันจะทํางานก่อนที่ GraphQL API จะทํางาน
  • ได้รับบริบทจากคําขอที่รับรองความถูกต้อง
  • ตรรกะแบบกําหนดเองจะตรวจสอบการอนุญาต
  • คําขอ API จะดําเนินการต่อไปหากการให้สิทธิ์สําเร็จ มิฉะนั้นจะถูกปฏิเสธ
  • ผลลัพธ์จะเกิดขึ้นได้เร็วขึ้นสําหรับคําขอในอนาคต

สร้างฟังก์ชันข้อมูลผู้ใช้

ฟังก์ชันผู้ให้สิทธิ์ภายในฟังก์ชันข้อมูลผู้ใช้ Fabric จําเป็นต้องมีรูปแบบเฉพาะ

  1. ชื่อฟังก์ชันสามารถกําหนดโดยผู้ใช้ได้ ไม่มีข้อจํากัดเฉพาะของ GraphQL และควรกําหนดตามข้อจํากัดของฟังก์ชันข้อมูลผู้ใช้
  2. อาร์กิวเมนต์ฟังก์ชัน/ชื่อพารามิเตอร์ควรถูกร้องขอและควรเป็นพจนานุกรมประเภท เมื่อบริการ GraphQL เรียกใช้ฟังก์ชัน บริการจะส่งเพย์โหลดที่มีพจนานุกรมที่เรียกว่าคําขอด้วยฟิลด์ต่อไปนี้:
    • tokenClaims (พจนานุกรม): คู่คีย์-ค่าที่มีการอ้างสิทธิ์โทเค็นที่แยกจากโทเค็นผู้ใช้ขาเข้า
    • query(string): สตริงการสืบค้นที่ส่งผ่านเมื่อมีการเรียกใช้ GraphQL API
    • variables(dictionary): คู่คีย์-ค่าที่มีตัวแปรที่ส่งผ่านเมื่อมีการเรียกใช้ GraphQL API
    • ประเภทการส่งคืน (พจนานุกรม): ฟังก์ชันจะส่งกลับisAuthorizedและroles roles เป็นทางเลือกและจําเป็นต้องส่งเมื่อเปิดใช้งานคุณสมบัติ RBAC

ตัวอย่าง

สร้างฟังก์ชันข้อมูลผู้ใช้ในพอร์ทัล Fabric อัปเดตรหัสฟังก์ชันด้วยฟังก์ชันตัวให้สิทธิ์ตัวอย่างนี้

from typing import TYPE_CHECKING
import fabric.functions as fn
import logging

user data function = fn.UserDataFunctions()

@user data function.function()
def invokeauthudf(request: dict) -> dict:
    
    token_claims: dict = request.get("tokenClaims", {})
    query: str = request.get("query", "")
    variables: dict = request.get("variables", {})
    domain = "onmicrosoft.com"
    spn = "<SPN-ID>"

    # Extract claims from token_claims dictionary
    tid_claim = token_claims.get("tid")
    upn_claim = token_claims.get("upn")
    appid_claim = token_claims.get("appid")
    logging.info(f"Query: {query}");
    logging.info(f"Claims: {token_claims}");
    logging.info(f"Tenant: {tid_claim}");
    logging.info(f"UPN: {upn_claim}");
    logging.info(f"SPN: {appid_claim}");

    # Authorization logic
    ## Optional: Do role-based access check
    roles = []

    if upn_claim is not None:
        is_authorized = domain in upn_claim
        roles = ["Default"]
    else:
        is_authorized =  spn in appid_claim
        roles = ["SPN"]

    logging.info(f"Authorized: {is_authorized}")
    logging.info(f"Roles: {roles}")
    logging.info(f"SPN: {spn}")
    logging.info(f"App ID: {appid_claim}")
    return {

            "isAuthorized": is_authorized,
            "roles": roles
    }

ฟังก์ชันนี้ทําหน้าที่อะไร?

  • ฟังก์ชันข้อมูลผู้ใช้ Authorizer นี้จะทํางานก่อนที่คําขอ GraphQL จะดําเนินการ อ่านการอ้างสิทธิ์ข้อมูลประจําตัว (UPN, รหัสแอป) จากโทเค็น JSON Web Token (JWT) ของผู้เรียก และบันทึกรายละเอียดคําขอ
  • โดยให้สิทธิ์ผู้ใช้โดยการตรวจสอบว่าอีเมล (UPN) ของพวกเขาเป็นของโดเมนเฉพาะหรือไม่ และให้สิทธิ์บริการหลักโดยการจับคู่รหัสแอปที่รู้จัก
  • ตามผลลัพธ์ จะส่งกลับ isAuthorized

เพิ่มการเชื่อมต่อกับฟังก์ชันข้อมูลผู้ใช้

ก่อนเปิดใช้งานคุณลักษณะ คุณต้องเพิ่มการเชื่อมต่อสําหรับชนิดฟังก์ชันข้อมูลผู้ใช้

  1. ภายใต้ การตั้งค่า ให้เลือก จัดการการเชื่อมต่อและเกตเวย์
  2. บนแท็บ การเชื่อมต่อ ให้เลือก สร้าง
  3. ในหน้า การเชื่อมต่อใหม่ ให้เลือก คลาวด์ ระบุชื่อสําหรับการเชื่อมต่อของคุณ และเลือก ฟังก์ชันข้อมูลผู้ใช้ เป็นประเภทการเชื่อมต่อ ใช้เมธอด OAUth และอัปเดตข้อมูลประจําตัวเพื่อรับรองความถูกต้อง คุณไม่จําเป็นต้องเลือก "อนุญาตให้ใช้การเชื่อมต่อนี้กับเกตเวย์ข้อมูลภายในองค์กรหรือเกตเวย์ข้อมูล VNet" เมื่อสร้างการเชื่อมต่อนี้

เปิดใช้งานคุณลักษณะการให้สิทธิ์

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

  1. เปิดรายการ API สําหรับ GraphQL แล้วเลือกการตั้งค่า
  2. เลือก การให้สิทธิ์ (พรีวิว) และเปิดใช้งานคุณลักษณะ
  3. ระบุรายการฟังก์ชันข้อมูลผู้ใช้และฟังก์ชันการตรวจสอบสิทธิ์ที่คุณต้องการใช้

ข้อจํากัดและพฤติกรรม

ประเภท ราย ละเอียด
การรับรองความถูกต้อง รองรับเฉพาะ OAuth เท่านั้น
รองรับ B2B ไม่สามารถใช้ได้กับผู้ใช้ทั่วไปเนื่องจากข้อจํากัดในการเชื่อมต่อ
Permissions เขียนที่จําเป็นสําหรับการกําหนดค่า ดําเนินการที่จําเป็นสําหรับการเรียก API
การกําหนดค่าที่ไม่รองรับ ไม่รองรับ SPN ที่มีตัวระบุวัตถุ (OID)
Caching การเปลี่ยนแปลงอาจใช้เวลาถึง 15 นาทีในการนําไปใช้
การขึ้นต่อกันของภูมิภาค UDF และ GraphQL ต้องอยู่ในภูมิภาคเดียวกัน
ลิงค์ส่วนตัว ไม่รองรับการเข้าถึงแบบสาธารณะที่ถูกบล็อก
ความล้มเหลวในการให้สิทธิ์ คําขอล้มเหลวเมื่อ isAuthorized เป็นเท็จ หรือเมื่อเปิดใช้งาน RBAC และบทบาทที่ส่งคืนหายไปหรือไม่ตรงกับบทบาทที่กําหนดค่าไว้
การจัดการบทบาท เมื่อเปิดใช้งาน RBAC ฟังก์ชันจะต้องส่งคืนบทบาท ระบบจะใช้เฉพาะบทบาทที่ตรงกันแรกเท่านั้น

ขั้นตอนถัดไป