รับนโยบาย OAuthV2Info

คุณกำลังดูเอกสารประกอบ Apigee Edge
ไปที่ เอกสารประกอบเกี่ยวกับ Apigee X.
ข้อมูล

อะไร

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

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

โทเค็นเพื่อการเข้าถึงที่คุณส่งไปยังนโยบายนี้ต้องใช้งานได้ มิฉะนั้นนโยบายจะส่ง ข้อผิดพลาด invalid_access_token รายการ

ตัวอย่าง

ตัวอย่างต่อไปนี้ใช้นโยบายรับข้อมูล OAuth V2 เพื่อเรียกข้อมูลเกี่ยวกับ ของเวิร์กโฟลว์ OAuth2 แล้วจึงเข้าถึงข้อมูลนั้นภายในโค้ด

โทเค็นเพื่อการเข้าถึง

หากต้องการการอ้างอิงโทเค็นเพื่อการเข้าถึง ให้ใช้องค์ประกอบ <AccessToken> ใน นโยบายของคุณ

ตัวอย่างต่อไปนี้คาดว่าจะพบโทเค็นเพื่อการเข้าถึงในพารามิเตอร์การค้นหาที่ชื่อว่า &quot;access_token&quot; (รายละเอียดการใช้งานจริงขึ้นอยู่กับคุณ):

<GetOAuthV2Info name="MyTokenAttrsPolicy">
  <AccessToken ref="request.queryparam.access_token"></AccessToken>
</GetOAuthV2Info>

เมื่อได้รับโทเค็นเพื่อการเข้าถึง นโยบายจะค้นหาโปรไฟล์ของโทเค็นและป้อนข้อมูลชุดของ กับข้อมูลโปรไฟล์

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

var scope = context.getVariable('oauthv2accesstoken.MyTokenAttrsPolicy.scope');

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

รหัสการตรวจสอบสิทธิ์

หากต้องการรับแอตทริบิวต์รหัสการให้สิทธิ์ ให้ใช้ <AuthorizationCode> ในนโยบายของคุณ

ตัวอย่างต่อไปนี้คาดว่าจะพบโทเค็นเพื่อการเข้าถึงในแบบฟอร์ม พารามิเตอร์ชื่อ "code" (รายละเอียดการใช้งานจริงขึ้นอยู่กับคุณ):

<GetOAuthV2Info name="MyAuthCodeAttrsPolicy">
  <AuthorizationCode ref="request.formparam.code"></AuthorizationCode>
</GetOAuthV2Info>

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

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

var attr = context.getVariable(oauthv2authcode.MyAuthCodeAttrsPolicy.custom_attribute_name);

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

โทเค็นการรีเฟรช

หากต้องการรับแอตทริบิวต์โทเค็นการรีเฟรช ให้ใช้เอลิเมนต์ <RefreshToken> ใน

ตัวอย่างต่อไปนี้คาดว่าจะพบโทเค็นเพื่อการเข้าถึงในพารามิเตอร์การค้นหาที่ชื่อว่า &quot;refresh_token&quot; (รายละเอียดการใช้งานจริงขึ้นอยู่กับคุณ):

<GetOAuthV2Info name="MyRefreshTokenAttrsPolicy">
  <RefreshToken ref="request.queryparam.refresh_token"/>
</GetOAuthV2Info>

จากโทเค็นการรีเฟรช นโยบายจะค้นหาข้อมูลของโทเค็นการรีเฟรชและป้อนข้อมูล ชุดของตัวแปรที่มีข้อมูลโทเค็นการรีเฟรช

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

var attr = context.getVariable(oauthv2refreshtoken.MyRefreshTokenAttrsPolicy.accesstoken.custom_attribute_name);

โปรดทราบว่าในการเข้าถึงตัวแปรในโค้ด คุณต้องใส่คำนำหน้าด้วย "oauthv2refreshtoken" สำหรับรายการตัวแปรทั้งหมดที่ใช้ผ่านโทเค็นการรีเฟรช โปรดดูที่ รีเฟรชตัวแปรโทเค็น

คงที่

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

<GetOAuthV2Info name="GetTokenAttributes">
  <AccessToken>shTUmeI1geSKin0TODcGLXBNe9vp</AccessToken>
</GetOAuthV2Info>

คุณสามารถดำเนินการนี้ได้กับโทเค็นประเภทอื่นๆ ทั้งหมด (รหัสไคลเอ็นต์ รหัสการให้สิทธิ์ และการรีเฟรช โทเค็น) ด้วย

Client-ID

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

<GetOAuthV2Info name="GetClientAttributes">
  <ClientId ref="request.queryparam.client_id"></ClientId>
</GetOAuthV2Info>

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

context.getVariable("oauthv2client.GetClientAttributes.developer.email");
context.getVariable("oauthv2client.GetClientAttributes.developer.app.name");

การอ้างอิงองค์ประกอบ

การอ้างอิงองค์ประกอบจะอธิบายองค์ประกอบและแอตทริบิวต์ของนโยบาย GetOAuthV2Info

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<GetOAuthV2Info async="false" continueOnError="false" enabled="true" name="GetOAuthV2Info-1"
    <DisplayName>Get OAuth v2.0 Info 1</DisplayName>
    <AccessToken ref="variable"></AccessToken>
    <AuthorizationCode ref="variable"></AuthorizationCode>
    <ClientId ref="variable"></ClientId>
    <RefreshToken ref="variable"></RefreshToken>
</GetOAuthV2Info>

<GetOAuthV2Info> แอตทริบิวต์

<GetOAuthV2Info async="false" continueOnError="false" enabled="true" name="Get-OAuth-v20-Info-1">

ตารางต่อไปนี้อธิบายแอตทริบิวต์ทั่วไปในองค์ประกอบระดับบนสุดของนโยบายทั้งหมด

แอตทริบิวต์ คำอธิบาย ค่าเริ่มต้น การมีบุคคลอยู่
name

ชื่อภายในของนโยบาย ค่าของแอตทริบิวต์ name สามารถ ประกอบด้วยตัวอักษร ตัวเลข การเว้นวรรค ขีดกลางสั้น ขีดล่าง และจุด ค่านี้ไม่สามารถ เกิน 255 อักขระ

(ไม่บังคับ) ใช้องค์ประกอบ <DisplayName> เพื่อติดป้ายกำกับนโยบายใน เครื่องมือแก้ไขพร็อกซี UI การจัดการด้วยชื่อที่เป็นภาษาธรรมชาติต่างกัน

ไม่มี ต้องระบุ
continueOnError

ตั้งค่าเป็น false เพื่อแสดงผลข้อผิดพลาดเมื่อนโยบายล้มเหลว เป็นเรื่องปกติ พฤติกรรมสำหรับนโยบายส่วนใหญ่

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

เท็จ ไม่บังคับ
enabled

ตั้งค่าเป็น true เพื่อบังคับใช้นโยบาย

ตั้งค่าเป็น false เพื่อปิดนโยบาย นโยบายจะไม่ บังคับใช้ แม้ว่าจะยังคงแนบกับขั้นตอน

จริง ไม่บังคับ
async

แอตทริบิวต์นี้เลิกใช้งานแล้ว

เท็จ เลิกใช้

&lt;DisplayName&gt; องค์ประกอบ

ใช้เพิ่มเติมจากแอตทริบิวต์ name เพื่อติดป้ายกำกับนโยบายใน เครื่องมือแก้ไขพร็อกซี UI การจัดการด้วยชื่อที่เป็นภาษาธรรมชาติต่างกัน

<DisplayName>Policy Display Name</DisplayName>
ค่าเริ่มต้น

ไม่มี

หากไม่ใส่องค์ประกอบนี้ ค่าของแอตทริบิวต์ name ของนโยบายจะเป็น

การมีบุคคลอยู่ ไม่บังคับ
ประเภท สตริง

&lt;AccessToken&gt; องค์ประกอบ

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

<AccessToken ref="request.queryparam.access_token"></AccessToken>

ค่าเริ่มต้น:

request.formparam.access_token (x-www-form-url encrypted และระบุไว้ในคำขอ เนื้อความ)

การตรวจหาบุคคล:

ไม่บังคับ

ประเภท: สตริง
ค่าที่ใช้ได้มีดังนี้

ตัวแปรโฟลว์ที่มีสตริงโทเค็นเพื่อการเข้าถึงหรือสตริงตรง


&lt;AuthorizationCode&gt; องค์ประกอบ

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

<AuthorizationCode ref="request.queryparam.authorization_code"></AuthorizationCode>

ค่าเริ่มต้น:

request.formparam.access_token (x-www-form-url encrypted และระบุไว้ในคำขอ เนื้อความ)

การตรวจหาบุคคล:

ไม่บังคับ

ประเภท: สตริง
ค่าที่ใช้ได้มีดังนี้

ตัวแปรโฟลว์ที่มีสตริงรหัสการตรวจสอบสิทธิ์หรือสตริงลิเทอรัล

&lt;ClientId&gt; องค์ประกอบ

เรียกข้อมูลที่เกี่ยวข้องกับรหัสไคลเอ็นต์ ในตัวอย่างนี้มีการดึงข้อมูลรหัสไคลเอ็นต์ จากพารามิเตอร์การค้นหาที่ส่งผ่านในคำขอ สำหรับรายการตัวแปรที่การดำเนินการนี้เติม ดู "ตัวแปรโฟลว์"

<ClientId ref="request.queryparam.client_id"></ClientId>

ค่าเริ่มต้น:

request.formparam.access_token (x-www-form-url encrypted และระบุไว้ในคำขอ เนื้อความ)

การตรวจหาบุคคล:

ไม่บังคับ

ประเภท: สตริง
ค่าที่ใช้ได้มีดังนี้ ตัวแปรโฟลว์ที่มีสตริงรหัสการตรวจสอบสิทธิ์หรือสตริงลิเทอรัล

&lt;IgnoreAccessTokenStatus&gt; องค์ประกอบ

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

<IgnoreAccessTokenStatus>true</IgnoreAccessTokenStatus>

ค่าเริ่มต้น:

เท็จ

การตรวจหาบุคคล:

ไม่บังคับ

ประเภท: บูลีน
ค่าที่ใช้ได้มีดังนี้ จริงหรือเท็จ

&lt;RefreshToken&gt; องค์ประกอบ

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

<RefreshToken ref="request.queryparam.refresh_token"></RefreshToken>

ค่าเริ่มต้น:

request.formparam.access_token (x-www-form-url encrypted และระบุไว้ในคำขอ เนื้อความ)

การตรวจหาบุคคล:

ไม่บังคับ

ประเภท: สตริง
ค่าที่ใช้ได้มีดังนี้

ตัวแปรโฟลว์ที่มีสตริงโทเค็นการรีเฟรชหรือสตริงลิเทอรัล

ตัวแปรโฟลว์

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

ตัวแปรรหัสไคลเอ็นต์

ระบบจะเติมค่าตัวแปรเหล่านี้เมื่อมีการตั้งค่าองค์ประกอบ ClientId

oauthv2client.{policy_name}.client_id
oauthv2client.{policy_name}.client_secret
oauthv2client.{policy_name}.redirection_uris // Note the spelling -- 'redirection_uris'
oauthv2client.{policy_name}.developer.email
oauthv2client.{policy_name}.developer.app.name
oauthv2client.{policy_name}.developer.id
oauthv2client.{policy_name}.{developer_app_custom_attribute_name}

ตัวแปรโทเค็นเพื่อการเข้าถึง

จะมีการเติมค่าตัวแปรเหล่านี้เมื่อมีการตั้งค่าองค์ประกอบ AccessToken

oauthv2accesstoken.{policy_name}.developer.id
oauthv2accesstoken.{policy_name}.developer.app.name
oauthv2accesstoken.{policy_name}.developer.app.id
oauthv2accesstoken.{policy_name}.developer.email

oauthv2accesstoken.{policy_name}.organization_name
oauthv2accesstoken.{policy_name}.api_product_list

oauthv2accesstoken.{policy_name}.access_token
oauthv2accesstoken.{policy_name}.scope
oauthv2accesstoken.{policy_name}.expires_in //in seconds
oauthv2accesstoken.{policy_name}.status
oauthv2accesstoken.{policy_name}.client_id
oauthv2accesstoken.{policy_name}.accesstoken.{custom_attribute_name}

oauthv2accesstoken.{policy_name}.refresh_token
oauthv2accesstoken.{policy_name}.refresh_token_status
oauthv2accesstoken.{policy_name}.refresh_token_expires_in //in seconds

oauthv2accesstoken.{policy_name}.refresh_count
oauthv2accesstoken.{policy_name}.refresh_token_issued_at
oauthv2accesstoken.{policy_name}.revoke_reason //Apigee hybrid only with value of REVOKED_BY_APP, REVOKED_BY_ENDUSER, REVOKED_BY_APP_ENDUSER, or TOKEN_REVOKED

ตัวแปรรหัสการให้สิทธิ์

ระบบจะเติมค่าตัวแปรเหล่านี้เมื่อมีการตั้งค่าองค์ประกอบ AuthorizationCode

oauthv2authcode.{policy_name}.code
oauthv2authcode.{policy_name}.scope       
oauthv2authcode.{policy_name}.redirect_uri 
oauthv2authcode.{policy_name}.client_id
oauthv2authcode.{policy_name}.{auth_code_custom_attribute_name}

รีเฟรชตัวแปรโทเค็น

จะมีการเติมค่าตัวแปรเหล่านี้เมื่อมีการตั้งค่าองค์ประกอบ RefreshToken

oauthv2refreshtoken.{policy_name}.developer.id
oauthv2refreshtoken.{policy_name}.developer.app.name
oauthv2refreshtoken.{policy_name}.developer.app.id
oauthv2refreshtoken.{policy_name}.developer.email
oauthv2refreshtoken.{policy_name}.organization_name
oauthv2refreshtoken.{policy_name}.api_product_list

oauthv2refreshtoken.{policy_name}.access_token
oauthv2refreshtoken.{policy_name}.scope
oauthv2refreshtoken.{policy_name}.expires_in //in seconds

oauthv2refreshtoken.{policy_name}.status
oauthv2refreshtoken.{policy_name}.client_id
oauthv2refreshtoken.{policy_name}.accesstoken.{custom_attribute_name}

oauthv2refreshtoken.{policy_name}.refresh_token
oauthv2refreshtoken.{policy_name}.refresh_token_status
oauthv2refreshtoken.{policy_name}.refresh_token_expires_in //in seconds

oauthv2refreshtoken.{policy_name}.refresh_count
oauthv2refreshtoken.{policy_name}.refresh_token_issued_at
oauthv2refreshtoken.{policy_name}.revoke_reason //Apigee hybrid only with value of REVOKED_BY_APP, REVOKED_BY_ENDUSER, REVOKED_BY_APP_ENDUSER, or TOKEN_REVOKED

สคีมา

นโยบายแต่ละประเภทจะกำหนดโดยสคีมา XML (.xsd) สคีมานโยบายสำหรับใช้อ้างอิง ที่มีอยู่ใน GitHub

ข้อมูลอ้างอิงข้อผิดพลาด

This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.

Runtime errors

These errors can occur when the policy executes. The error names shown below are the strings that are assigned to the fault.name variable when an error occurs. See the Fault variables section below for more details.

Fault code HTTP status Cause
steps.oauth.v2.access_token_expired 500 The access token sent to the policy is expired.
steps.oauth.v2.authorization_code_expired 500 The authorization code sent to the policy is expired.
steps.oauth.v2.invalid_access_token 500 The access token sent to the policy is invalid.
steps.oauth.v2.invalid_client-invalid_client_id 500 The client ID sent to the policy is invalid.
steps.oauth.v2.invalid_refresh_token 500 The refresh token sent to the policy is invalid.
steps.oauth.v2.invalid_request-authorization_code_invalid 500 The authorization code sent to the policy is invalid.
steps.oauth.v2.InvalidAPICallAsNoApiProductMatchFound 401 Please see this Apigee Community post for information about troubleshooting this error.
steps.oauth.v2.refresh_token_expired 500 The refresh token sent to the policy is expired.

Deployment errors

Refer to the message reported in the UI for information about deployment errors.

Fault variables

These variables are set when this policy triggers an error at runtime.

Variables Where Example
fault.name="fault_name" fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. fault.name Matches "IPDeniedAccess"
oauthV2.policy_name.failed policy_name is the user-specified name of the policy that threw the fault. oauthV2.GetTokenInfo.failed = true
oauthV2.policy_name.fault.name policy_name is the user-specified name of the policy that threw the fault. oauthV2.GetToKenInfo.fault.name = invalid_client-invalid_client_id
oauthV2.policy_name.fault.cause policy_name is the user-specified name of the policy that threw the fault. oauthV2.GetTokenInfo.cause = ClientID is Invalid

Example error response

{  
   "fault":{  
      "faultstring":"ClientId is Invalid",
      "detail":{  
         "errorcode":"keymanagement.service.invalid_client-invalid_client_id"
      }
   }
}

Example fault rule

<FaultRule name="OAuthV2 Faults">
    <Step>
        <Name>AM-InvalidClientIdResponse</Name>
    </Step>
    <Condition>(fault.name = "invalid_client-invalid_client_id")</Condition>
</FaultRule>

หัวข้อที่เกี่ยวข้อง