การใช้งานประเภทการให้สิทธิ์รหัสการให้สิทธิ์

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

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

เกี่ยวกับหัวข้อนี้

หัวข้อนี้มีคำอธิบายทั่วไปและภาพรวมของโฟลว์ประเภทการให้สิทธิ์ OAuth 2.0 รวมถึงอธิบายวิธีใช้โฟลว์นี้ใน Apigee Edge

วิดีโอ

ดูวิดีโอสั้นๆ เพื่อเรียนรู้วิธีใช้ประเภทการให้สิทธิ์ OAuth 2.0 เพื่อรักษาความปลอดภัยให้ API ของคุณ

Use Case

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

ตัวอย่างโค้ด

คุณค้นหาตัวอย่างการใช้งานแบบเต็มของประเภทการให้สิทธิ์รหัสการให้สิทธิ์ใน Apigee Edge ได้ในที่เก็บ api-platform-samples บน GitHub โปรดดูตัวอย่าง oauth-advanced ในไดเรกทอรี api-platform-samples/sample-proxies ดูรายละเอียดเกี่ยวกับตัวอย่างในไฟล์ README

แผนภาพโฟลว์

แผนภาพโฟลว์ต่อไปนี้แสดงโฟลว์ OAuth ของรหัสการให้สิทธิ์ที่มี Apigee Edge ทำหน้าที่เป็นเซิร์ฟเวอร์การให้สิทธิ์

เคล็ดลับ: หากต้องการดูแผนภาพนี้ที่ใหญ่ขึ้น ให้คลิกขวาที่แผนภาพแล้วเปิดในแท็บใหม่ หรือบันทึกและเปิดในโปรแกรมดูรูปภาพ

ขั้นตอนในกระบวนการรหัสการให้สิทธิ์

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

สิ่งที่ต้องทำก่อน: แอปไคลเอ็นต์ต้องลงทะเบียนกับ Apigee Edge เพื่อรับรหัสไคลเอ็นต์และคีย์รหัสลับไคลเอ็นต์ โปรดดูรายละเอียดที่การลงทะเบียนแอปไคลเอ็นต์

1. ผู้ใช้เริ่มโฟลว์

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

2. ผู้ใช้ป้อนข้อมูลเข้าสู่ระบบ

ตอนนี้ผู้ใช้จะเห็นหน้าเข้าสู่ระบบที่ระบบจะขอให้ผู้ใช้ป้อนข้อมูลเข้าสู่ระบบ หากการเข้าสู่ระบบสำเร็จ เราจะไปยังขั้นตอนถัดไป

3. ผู้ใช้ให้ความยินยอม

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

4. แอปเข้าสู่ระบบส่งคำขอ Apigee Edge

หากการเข้าสู่ระบบและขอความยินยอมสำเร็จ แอปเข้าสู่ระบบจะ POST ข้อมูลไปยังปลายทาง /Authorizationcode ของ Apigee Edge ข้อมูลดังกล่าวรวมถึง URI การเปลี่ยนเส้นทาง, รหัสไคลเอ็นต์, ขอบเขต, ข้อมูลเฉพาะของผู้ใช้ที่ต้องการรวมไว้ และตัวบ่งชี้ว่าการเข้าสู่ระบบสำเร็จ

5. Apigee Edge จะสร้างรหัสการให้สิทธิ์

เมื่อ Edge ได้รับคำขอ GET จากแอปเข้าสู่ระบบในปลายทาง /Authorizationcode จะมี 2 สิ่งต่อไปนี้เกิดขึ้น ขั้นแรก Edge จะระบุว่าการเข้าสู่ระบบสำเร็จ (โดยการตรวจสอบสถานะ HTTP หรือวิธีอื่นๆ) Edge ถัดไปจะตรวจสอบเพื่อให้แน่ใจว่า URI การเปลี่ยนเส้นทางที่ส่งจากแอปการเข้าสู่ระบบตรงกับ URI การเปลี่ยนเส้นทางที่ระบุไว้เมื่อลงทะเบียนแอปกับ Apigee Edge หากทุกอย่างเรียบร้อยดี Edge จะสร้างรหัสการให้สิทธิ์ เช่น

http://myorg-test.apigee.net/oauth/authorizationcode?client_id={consumer_key}&response_type=code&redirect_uri={redirect_uri}&scope=scope1%20scope2&state={some_string}

6. Edge ส่งรหัสการให้สิทธิ์กลับไปให้ไคลเอ็นต์

Edge ส่งการเปลี่ยนเส้นทาง 302 พร้อมรหัสการให้สิทธิ์ที่แนบมาเป็นพารามิเตอร์การค้นหาไปยังไคลเอ็นต์

7. ไคลเอ็นต์เรียกรหัสการให้สิทธิ์และขอรหัสการเข้าถึงจาก Edge

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

$ curl https://{org_name}-test.apigee.net/my_oauth_proxy/accesstoken?code=Xyz123&grant_type=authorization_code -X POST -d 'client_id=bBGAQrXgivA9lKu7NMPyoYpKNhGar6K&client_secret=hAr4GngA9vAyvI4'

8. ไคลเอ็นต์ได้รับโทเค็นเพื่อการเข้าถึง

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

9. ไคลเอ็นต์เรียก API ที่มีการป้องกัน

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

$ curl -H "Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z" http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282

การกำหนดค่าโฟลว์และนโยบาย

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

  • การสร้างขั้นตอนที่กำหนดเอง
  • การเพิ่มและกำหนดค่านโยบาย OAuthV2

การกำหนดค่าขั้นตอนที่กำหนดเอง

โดยปกติแล้ว คุณจะกำหนดค่าโฟลว์ประเภทการให้สิทธิ์นี้เพื่อให้แต่ละขั้นตอนหรือ "ขั้นตอน" ของโฟลว์กำหนดโดยโฟลว์ในพร็อกซี Apigee Edge แต่ละกระบวนการมีปลายทางและนโยบายที่ดำเนินงานเฉพาะสำหรับ OAuth เช่น การสร้างรหัสการให้สิทธิ์หรือโทเค็นเพื่อการเข้าถึง ตัวอย่างเช่น ดังที่แสดงใน XML ด้านล่าง ปลายทาง /oauth/authorizationcode มีนโยบายที่เชื่อมโยงอยู่ชื่อ GenerateAuthCode (ซึ่งเป็นนโยบาย OAuthV2 ที่มีการระบุการดำเนินการ GenerateAuthorizationCode ไว้)

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

โปรดดูตัวอย่างการใช้งานใน GitHub

<Flows>
<Flow name="RedirectToLoginApp">
<!--
Publish this URI to developers to use for their 'login' link
-->
<Condition>proxy.pathsuffix == "/oauth/authorize"</Condition>
<Request>
<Step><Name>RedirectToLoginPage</Name></Step>
</Request>
</Flow>
<Flow name="GetAuthCode">
<!--
Call this URL from your Login app after you authenticate the user.
The policy will automatically return the auth code in the response to the
redirect_uri registered by the calling app
-->
<Condition>proxy.pathsuffix == "/oauth/authorizationcode"</Condition>
<Request>
<Step><Name>GenerateAuthCode</Name></Step>
</Request>
</Flow>
<Flow name="GetAccessToken">
<!-- This policy flow is triggered when the URI path suffix
matches /oauth/accesstoken. Publish this URL to app developers
to use when obtaining an access token using an auth code
-->
<Condition>proxy.pathsuffix == "/oauth/accesstoken"</Condition>
<Request>
<Step><Name>GenerateAccessToken</Name></Step>
</Request>
</Flow>
</Flows>

กำหนดค่าโฟลว์ด้วยนโยบาย

แต่ละปลายทางจะมีนโยบายที่เชื่อมโยงอยู่ มาดูตัวอย่างนโยบายกัน โปรดดูภาพรวมคร่าวๆ ของขั้นตอนที่จำเป็นในการเพิ่มนโยบาย OAuthV2 ไปยังปลายทางของพร็อกซีได้ที่การกำหนดค่าปลายทางและนโยบาย OAuth

เปลี่ยนเส้นทางการเข้าสู่ระบบ

นี่คือเส้นทาง /oauth/authorize นโยบายที่แนบมามีหน้าที่ในการเปลี่ยนเส้นทางผู้ใช้ไปยังแอปเข้าสู่ระบบ ซึ่งผู้ใช้ปลายทางจะตรวจสอบสิทธิ์ได้อย่างปลอดภัยและอนุญาตให้แอปไคลเอ็นต์เข้าถึงทรัพยากรที่มีการป้องกันโดยไม่ต้องเปิดเผยชื่อผู้ใช้และรหัสผ่านกับแอปไคลเอ็นต์ คุณดำเนินการนี้ได้โดยใช้นโยบายไฮไลต์บริการ, JavaScript, Node.js หรือวิธีอื่นๆ

การเรียก API เพื่อสร้างคำขอคือ GET และต้องใช้พารามิเตอร์การค้นหา client_id, Response_type, redirect_uri, scope และสถานะ

$ curl http://myorg-test.apigee.net/oauth/authorize?client_id={consumer_key}&response_type=code&redirect_uri={redirect_uri}&scope=scope1%20scope2&state={some_string}

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

นี่คือเส้นทาง /oauth/authorizationcode โดยใช้นโยบาย OAuthV2 ที่มีการดำเนินการ GenerateAuthorizationCode ที่ระบุ

<OAuthV2 async="false" continueOnError="false" enabled="true" name="GetAuthCode">
    <DisplayName>GetAuthCode</DisplayName>
    <Operation>GenerateAuthorizationCode</Operation>
    <ExpiresIn>600000</ExpiresIn>
    <GenerateResponse/>
</OAuthV2>

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

$curl http://myorg-test.apigee.net/oauth/authorizationcode?client_id={consumer_key}&response_type=code&scope=scope1%20scope2&state={some_string}

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

นโยบายนี้แนบอยู่กับเส้นทาง /oauth/accesstoken ซึ่งใช้นโยบาย OAuthV2 ที่ระบุการดำเนินการ GenerateAccessCode ไว้ ในกรณีนี้ คาดว่าพารามิเตอร์ Grants_type จะเป็นพารามิเตอร์การค้นหา

<OAuthV2 name="GetAccessToken">
    <Operation>GenerateAccessToken</Operation>
    <ExpiresIn>360000000</ExpiresIn> 
    <SupportedGrantTypes> 
        <GrantType>authorization_code</GrantType> 
    </SupportedGrantTypes> 
    <GrantType>request.queryparam.grant_type</GrantType> 
    <GenerateResponse/> 
</OAuthV2>

การเรียก API สำหรับขอรับรหัสการเข้าถึงเป็น POST และต้องมี client_id, client_secret,grant_type=authorization_code และรวมขอบเขตด้วยหรือไม่ก็ได้ เช่น

$ curl https://{org_name}-test.apigee.net/oauth/accesstoken?grant_type=authorization_code -X POST -d 'client_id=bBGAQrXgivA9lKu7NMPyoYpVKNhGar6K&client_secret=hAr4Gn0gA9vAyvI4'

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

กำลังแนบนโยบายโทเค็นเพื่อการเข้าถึง

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

<OAuthV2 async="false" continueOnError="false" enabled="true" name="VerifyAccessToken">
    <DisplayName>VerifyAccessToken</DisplayName>
    <ExternalAuthorization>false</ExternalAuthorization>
    <Operation>VerifyAccessToken</Operation>
    <SupportedGrantTypes/>
    <GenerateResponse enabled="true"/>
    <Tokens/>
</OAuthV2>

การเรียกใช้ API ที่มีการป้องกัน

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

$ curl -H "Authorization: Bearer UAj2yiGAcMZGxfN2DhcUbl9v8WsR" \
  http://myorg-test.apigee.net/v0/weather/forecastrss?w=12797282 

โปรดดูหัวข้อการส่งโทเค็นเพื่อการเข้าถึง