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

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

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

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

หัวข้อนี้จะอธิบายและให้ภาพรวมทั่วไปของขั้นตอนประเภทการให้สิทธิ์ OAuth 2.0 และอธิบายวิธีใช้ขั้นตอนดังกล่าวใน Apigee Edge

วิดีโอ

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

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

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

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

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

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

{redirect_uri}?code={authorization_code}&state={some_string}

6. ไคลเอ็นต์จะดึงรหัสการให้สิทธิ์และขอโทเค็นเพื่อการเข้าถึงจาก Edge

ตอนนี้ไคลเอ็นต์สามารถขอโทเค็นเพื่อเข้าถึงจาก Edge ได้แล้วโดยใช้รหัสการให้สิทธิ์ที่ถูกต้อง โดยทำดังนี้ POST รหัสไคลเอ็นต์และคีย์รหัสลับไคลเอ็นต์ (ได้รับเมื่อลงทะเบียนแอปใน 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'

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

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

8. ไคลเอ็นต์เรียกใช้ 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>

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

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

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

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

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

$ 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 เพื่อรับรหัสการให้สิทธิ์คือ POST และต้องส่ง client_id, response_type, redirect_uri และขอบเขตและสถานะ (ไม่บังคับ) ในเนื้อความของคำขอเป็นพารามิเตอร์แบบฟอร์ม ดังที่แสดงในตัวอย่างนี้

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

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

นโยบายนี้แนบอยู่กับเส้นทาง /oauth/accesstoken โดยจะใช้นโยบาย OAuthV2 ที่มีการระบุการดำเนินการ GenerateAccessToken ในกรณีนี้ ระบบคาดหวังให้พารามิเตอร์ grant_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 'code={authorization_code}&client_id=bBGAQrXgivA9lKu7NMPyoYpVKNhGar6K&client_secret=hAr4Gn0gA9vAyvI4'

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

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

แนบนโยบาย VerifyAccessToken (นโยบาย OAuthV2 ที่ระบุการดำเนินการ VerifyAccessToken ) ไว้ที่จุดเริ่มต้นของโฟลว์ใดก็ตามที่เข้าถึง 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

ดูเพิ่มเติมที่การส่งโทเค็นเพื่อการเข้าถึง