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

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

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

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

เพื่อความสะดวกของคุณ นโยบายและปลายทางที่กล่าวถึงในหัวข้อนี้พร้อมใช้งานใน GitHub ในโปรเจ็กต์ oauth-doc-examples ในที่เก็บ api-platform-samples ของ Apigee คุณสามารถติดตั้งใช้งานโค้ดตัวอย่างและลองใช้คำขอตัวอย่างที่แสดงในหัวข้อนี้ได้ ดูรายละเอียดได้ที่ README ของโปรเจ็กต์

การขอโทเค็นเพื่อการเข้าถึง: ประเภทการให้สิทธิ์รหัสการให้สิทธิ์

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

ตัวอย่าง คำขอ

$ curl -i -H 'Content-Type: application/x-www-form-urlencoded' \
   -H 'Authorization: Basic c3FIOG9vSGV4VHo4QzAyg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ' \
   -X POST 'https://docs-test.apigee.net/oauth/accesstoken' \
   -d 'code=I9dMGHAN&grant_type=authorization_code&redirect_uri=http://example-callback.com'

พารามิเตอร์ที่จำเป็น

โดยค่าเริ่มต้น พารามิเตอร์เหล่านี้ต้องเป็น x-www-form-urlencoded และระบุไว้ใน เนื้อหาคำขอ (ดังที่แสดงในตัวอย่างด้านบน) อย่างไรก็ตาม คุณสามารถเปลี่ยนค่าเริ่มต้นนี้ได้โดย การกำหนดค่าองค์ประกอบ <GrantType>, <Code> และ <RedirectUri> ในนโยบาย OAuthV2 ที่แนบมากับ ปลายทาง /accesstoken นี้ ดูรายละเอียดได้ที่นโยบาย OAuthV2

  • grant_type - ต้องตั้งค่าเป็นค่า authorization_code
  • code - รหัสการให้สิทธิ์ที่ได้รับจากปลายทาง /authorize (หรือชื่อที่คุณเลือก) หากต้องการขอโทเค็นเพื่อการเข้าถึงในขั้นตอนประเภทการให้สิทธิ์ รหัสการให้สิทธิ์ คุณต้องรับรหัสการให้สิทธิ์ก่อน ดูการขอรหัสการให้สิทธิ์ด้านล่าง ดูเพิ่มเติมที่การใช้ ประเภทการให้สิทธิ์รหัสการให้สิทธิ์
  • redirect_uri - คุณต้องระบุพารามิเตอร์นี้หากรวมพารามิเตอร์ redirect_uri ไว้ในคำขอรหัสการให้สิทธิ์ก่อนหน้า หากไม่ได้รวมพารามิเตอร์ redirect_uri ไว้ในคำขอรหัสการให้สิทธิ์ และหากคุณไม่ได้ระบุพารามิเตอร์นี้ นโยบายนี้จะใช้ค่าของ URL เรียกกลับที่ระบุไว้เมื่อลงทะเบียนแอปของนักพัฒนาซอฟต์แวร์

พารามิเตอร์ ที่ไม่บังคับ

  • state - สตริงที่จะส่งกลับพร้อมกับการตอบกลับ โดยทั่วไปจะใช้ เพื่อป้องกันการโจมตีแบบ Cross-Site Request Forgery
  • ขอบเขต - ช่วยให้คุณกรองรายการผลิตภัณฑ์ API ที่ใช้โทเค็นที่สร้างขึ้นได้ ดูข้อมูลโดยละเอียดเกี่ยวกับขอบเขตได้ที่การทำงานกับขอบเขต OAuth2

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

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

ตัวอย่างปลายทาง

นี่คือตัวอย่างการกำหนดค่าปลายทางสำหรับการสร้างโทเค็นเพื่อการเข้าถึง โดยจะดำเนินการตามนโยบาย GenerateAccessToken ซึ่งต้องกำหนดค่าให้รองรับประเภทการให้สิทธิ์ authorization_code

...
       <Flow name="generate-access-token">
            <Description>Generate a token</Description>
            <Request>
                <Step>
                    <Name>GenerateAccessToken</Name>
                </Step>
            </Request>
            <Response/>
            <Condition>(proxy.pathsuffix MatchesPath "/token") and (request.verb = "POST")</Condition>
        </Flow>
...

นโยบายตัวอย่าง

นี่คือนโยบาย GenerateAccessToken พื้นฐานที่กำหนดค่าให้ยอมรับauthorization_codeประเภทการให้สิทธิ์ ดูข้อมูลเกี่ยวกับองค์ประกอบการกำหนดค่าที่ไม่บังคับ ซึ่งคุณกำหนดค่าได้ด้วยนโยบายนี้ได้ที่นโยบาย OAuthV2

<OAuthV2 name="GenerateAccessToken">
    <Operation>GenerateAccessToken</Operation>
    <ExpiresIn>1800000</ExpiresIn>
    <RefreshTokenExpiresIn>86400000</RefreshTokenExpiresIn>
    <SupportedGrantTypes>
      <GrantType>authorization_code</GrantType>
    </SupportedGrantTypes>
    <GenerateResponse enabled="true"/>
</OAuthV2>

การคืนสินค้า

เมื่อเปิดใช้ <GenerateResponse> นโยบายจะแสดงผลการตอบกลับ JSON ที่มีโทเค็นเพื่อการเข้าถึง ดังที่แสดงด้านล่าง ประเภทการให้สิทธิ์ authorization_code จะสร้าง โทเค็นเพื่อการเข้าถึงและโทเค็นการรีเฟรช ดังนั้นคำตอบอาจมีลักษณะดังนี้

{
    "issued_at": "1420262924658",
    "scope": "READ",
    "application_name": "ce1e94a2-9c3e-42fa-a2c6-1ee01815476b",
    "refresh_token_issued_at": "1420262924658",
    "status": "approved",
    "refresh_token_status": "approved",
    "api_product_list": "[PremiumWeatherAPI]",
    "expires_in": "1799", //--in seconds
    "developer.email": "tesla@weathersample.com",
    "organization_id": "0",
    "token_type": "BearerToken",
    "refresh_token": "fYACGW7OCPtCNDEnRSnqFlEgogboFPMm",
    "client_id": "5jUAdGv9pBouF0wOH5keAVI35GBtx3dT",
    "access_token": "2l4IQtZXbn5WBJdL6EF7uenOWRsi",
    "organization_name": "docs",
    "refresh_token_expires_in": "86399", //--in seconds
    "refresh_count": "0"
}

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

oauthv2accesstoken.{policy-name}.access_token
oauthv2accesstoken.{policy-name}.expires_in //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token
oauthv2accesstoken.{policy-name}.refresh_token_expires_in //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token_issued_at
oauthv2accesstoken.{policy-name}.refresh_token_status

เช่น

oauthv2accesstoken.GenerateAccessToken.access_token
oauthv2accesstoken.GenerateAccessToken.expires_in
oauthv2accesstoken.GenerateAccessToken.refresh_token
oauthv2accesstoken.GenerateAccessToken.refresh_token_expires_in
oauthv2accesstoken.GenerateAccessToken.refresh_token_issued_at
oauthv2accesstoken.GenerateAccessToken.refresh_token_status

การขอโทเค็นเพื่อการเข้าถึง: ประเภทการให้สิทธิ์ข้อมูลเข้าสู่ระบบของไคลเอ็นต์

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

ตัวอย่าง คำขอ

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

$ curl -i -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Authorization: Basic c3FIOG9vSGV4VHoAyg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ' \
  -X POST 'https://docs-test.apigee.net/oauth/accesstoken' \
  -d 'grant_type=client_credentials'

พารามิเตอร์ที่จำเป็น

โดยค่าเริ่มต้น พารามิเตอร์ grant_type ที่จำเป็นต้องเป็น x-www-form-urlencoded และ ระบุไว้ในเนื้อหาคำขอ (ดังที่แสดงในตัวอย่างด้านบน) อย่างไรก็ตาม คุณสามารถเปลี่ยน ค่าเริ่มต้นนี้ได้โดยการกำหนดค่าองค์ประกอบ <GrantType> ในนโยบาย OAuthV2 ที่ แนบมากับปลายทาง /accesstoken นี้ เช่น คุณอาจเลือกส่งพารามิเตอร์ ในพารามิเตอร์การค้นหา ดูรายละเอียดได้ที่นโยบาย OAuthV2

  • grant_type - ต้องตั้งค่าเป็นค่า client_credentials

พารามิเตอร์ ที่ไม่บังคับ

  • state - สตริงที่จะส่งกลับพร้อมกับการตอบกลับ โดยทั่วไปจะใช้ เพื่อป้องกันการโจมตีแบบ Cross-Site Request Forgery
  • ขอบเขต - ช่วยให้คุณกรองรายการผลิตภัณฑ์ API ที่ใช้โทเค็นที่สร้างขึ้นได้ ดูข้อมูลโดยละเอียดเกี่ยวกับขอบเขตได้ที่การทำงานกับขอบเขต OAuth2

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

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

ตัวอย่างปลายทาง

นี่คือตัวอย่างการกำหนดค่าปลายทางสำหรับการสร้างโทเค็นเพื่อการเข้าถึง โดยจะดำเนินการตามนโยบาย GenerateAccessToken ซึ่งต้องกำหนดค่าให้รองรับประเภทการให้สิทธิ์ client_credentials

...
       <Flow name="generate-access-token">
            <Request>
                <Step>
                    <Name>GenerateAccessToken</Name>
                </Step>
            </Request>
            <Response/>
            <Condition>(proxy.pathsuffix MatchesPath "/token") and (request.verb = "POST")</Condition>
        </Flow>
...

นโยบายตัวอย่าง

นี่คือนโยบาย GenerateAccessToken พื้นฐานที่กำหนดค่าให้ยอมรับclient_credentialsประเภทการให้สิทธิ์ ดูข้อมูลเกี่ยวกับองค์ประกอบการกำหนดค่าที่ไม่บังคับ ซึ่งคุณกำหนดค่าได้ด้วยนโยบายนี้ได้ที่นโยบาย OAuthV2

<OAuthV2 name="GenerateAccessToken">
    <Operation>GenerateAccessToken</Operation>
    <ExpiresIn>1800000</ExpiresIn> <!-- 30 minutes -->
    <SupportedGrantTypes>
      <GrantType>client_credentials</GrantType>
    </SupportedGrantTypes>
    <GenerateResponse enabled="true"/>
</OAuthV2>

การคืนสินค้า

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

{
    "issued_at": "1420260525643",
    "application_name": "ce1e94a2-9c3e-42fa-a2c6-1ee01815476b",
    "scope": "READ",
    "status": "approved",
    "api_product_list": "[PremiumWeatherAPI]",
    "expires_in": "1799", //--in seconds
    "developer.email": "tesla@weathersample.com",
    "organization_id": "0",
    "token_type": "BearerToken",
    "client_id": "5jUAdGv9pBouF0wOH5keAVI35GBtx3dT",
    "access_token": "XkhU2DFnMGIVL2hvsRHLM00hRWav",
    "organization_name": "docs"
}

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

oauthv2accesstoken.{policy-name}.access_token
oauthv2accesstoken.{policy-name}.expires_in //--in seconds

เช่น

oauthv2accesstoken.GenerateAccessToken.access_token
oauthv2accesstoken.GenerateAccessToken.expires_in     //--in seconds

การขอโทเค็นเพื่อการเข้าถึง: ประเภทการให้สิทธิ์รหัสผ่าน

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

ดูรายละเอียดเพิ่มเติมเกี่ยวกับประเภทการให้สิทธิ์รหัสผ่าน รวมถึงวิดีโอ 4 นาทีที่แสดงวิธี ติดตั้งใช้งานได้ที่การติดตั้งใช้งานประเภทการให้สิทธิ์ รหัสผ่าน

ตัวอย่าง คำขอ

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

$ curl -i -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Authorization: Basic c3FIOG9vSGV4VHo4QzAySVg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ' \
  -X POST https://docs-test.apigee.net/oauth/token \
  -d 'grant_type=password&username=the-user-name&password=the-users-password'

พารามิเตอร์ที่จำเป็น

โดยค่าเริ่มต้น พารามิเตอร์เหล่านี้ต้องเป็น x-www-form-urlencoded และระบุไว้ใน เนื้อหาคำขอ (ดังที่แสดงในตัวอย่างด้านบน) อย่างไรก็ตาม คุณสามารถเปลี่ยนค่าเริ่มต้นนี้ได้โดย การกำหนดค่าองค์ประกอบ <GrantType>, <Username> และ <Password> ในนโยบาย OAuthV2 ที่แนบมากับ ปลายทาง /token นี้ ดูรายละเอียดได้ที่นโยบาย OAuthV2

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

  • grant_type - ต้องตั้งค่าเป็น password
  • username - ชื่อผู้ใช้ของเจ้าของทรัพยากร
  • password - รหัสผ่านของเจ้าของทรัพยากร

พารามิเตอร์ ที่ไม่บังคับ

  • state - สตริงที่จะส่งกลับพร้อมกับการตอบกลับ โดยทั่วไปจะใช้ เพื่อป้องกันการโจมตีแบบ Cross-Site Request Forgery
  • ขอบเขต - ช่วยให้คุณกรองรายการผลิตภัณฑ์ API ที่ใช้โทเค็นที่สร้างขึ้นได้ ดูข้อมูลโดยละเอียดเกี่ยวกับขอบเขตได้ที่การทำงานกับขอบเขต OAuth2

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

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

ตัวอย่างปลายทาง

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

...
       <Flow name="generate-access-token">
            <Request>
                <Step>
                    <Name>GenerateAccessToken</Name>
                </Step>
            </Request>
            <Response/>
            <Condition>(proxy.pathsuffix MatchesPath "/token") and (request.verb = "POST")</Condition>
        </Flow>
...

นโยบายตัวอย่าง

นี่คือนโยบาย GenerateAccessToken พื้นฐานที่กำหนดค่าให้ยอมรับประเภทการให้สิทธิ์รหัสผ่าน ดูข้อมูลเกี่ยวกับองค์ประกอบการกำหนดค่าที่ไม่บังคับซึ่งคุณกำหนดค่าได้ด้วยนโยบายนี้ได้ที่นโยบาย OAuthV2

<OAuthV2 name="GenerateAccessToken">
    <Operation>GenerateAccessToken</Operation>
    <ExpiresIn>1800000</ExpiresIn> <!-- 30 minutes -->
    <RefreshTokenExpiresIn>28800000</RefreshTokenExpiresIn> <!-- 8 hours -->
    <SupportedGrantTypes>
      <GrantType>password</GrantType>
    </SupportedGrantTypes>
    <GenerateResponse enabled="true"/>
</OAuthV2>

การคืนสินค้า

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

{
    "issued_at": "1420258685042",
    "scope": "READ",
    "application_name": "ce1e94a2-9c3e-42fa-a2c6-1ee01815476b",
    "refresh_token_issued_at": "1420258685042",
    "status": "approved",
    "refresh_token_status": "approved",
    "api_product_list": "[PremiumWeatherAPI]",
    "expires_in": "1799", //--in seconds
    "developer.email": "tesla@weathersample.com",
    "organization_id": "0",
    "token_type": "BearerToken",
    "refresh_token": "IFl7jlijYuexu6XVSSjLMJq8SVXGOAAq",
    "client_id": "5jUAdGv9pBouF0wOH5keAVI35GBtx3dT",
    "access_token": "I6daIgMSiUgYX1K2qgQWPi37ztS6",
    "organization_name": "docs",
    "refresh_token_expires_in": "28799", //--in seconds
    "refresh_count": "0"
}

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

oauthv2accesstoken.{policy-name}.access_token
oauthv2accesstoken.{policy-name}.expires_in   //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token
oauthv2accesstoken.{policy-name}.refresh_token_expires_in  //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token_issued_at
oauthv2accesstoken.{policy-name}.refresh_token_status

เช่น

oauthv2accesstoken.GenerateAccessToken.access_token
oauthv2accesstoken.GenerateAccessToken.expires_in
oauthv2accesstoken.GenerateAccessToken.refresh_token
oauthv2accesstoken.GenerateAccessToken.refresh_token_expires_in
oauthv2accesstoken.GenerateAccessToken.refresh_token_issued_at
oauthv2accesstoken.GenerateAccessToken.refresh_token_status

การขอโทเค็นเพื่อการเข้าถึง: การให้สิทธิ์โดยนัย type

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

ตัวอย่าง คำขอ

$ curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
  'https://docs-test.apigee.net/oauth/implicit?response_type=token&client_id=ABC123&redirect_uri=http://callback-example.com'

พารามิเตอร์ที่จำเป็น

โดยค่าเริ่มต้น พารามิเตอร์เหล่านี้ต้องเป็นพารามิเตอร์การค้นหา (ตามที่แสดงในตัวอย่างด้านบน) อย่างไรก็ตาม คุณสามารถเปลี่ยนค่าเริ่มต้นนี้ได้โดยการกำหนดค่าองค์ประกอบ <ResponseType> <ClientId> และ <RedirectUri> ในนโยบาย OAuthV2 ที่แนบมากับปลายทาง /token นี้ ดูรายละเอียดได้ที่นโยบาย OAuthV2

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

  • response_type - ต้องตั้งค่าเป็น token
  • client_id - รหัสไคลเอ็นต์ของแอปนักพัฒนาซอฟต์แวร์ที่ลงทะเบียน
  • redirect_uri - พารามิเตอร์นี้จำเป็นต้องระบุหากไม่ได้ระบุ URI เรียกกลับเมื่อลงทะเบียนแอปของนักพัฒนาซอฟต์แวร์ไคลเอ็นต์ หากมีการระบุ URL เรียกกลับเมื่อลงทะเบียนไคลเอ็นต์ ระบบจะเปรียบเทียบกับค่านี้และต้องตรงกันทุกประการ

พารามิเตอร์ ที่ไม่บังคับ

  • state - สตริงที่จะส่งกลับพร้อมกับการตอบกลับ โดยทั่วไปจะใช้ เพื่อป้องกันการโจมตีแบบ Cross-Site Request Forgery
  • ขอบเขต - ช่วยให้คุณกรองรายการผลิตภัณฑ์ API ที่ใช้โทเค็นที่สร้างขึ้นได้ ดูข้อมูลโดยละเอียดเกี่ยวกับขอบเขตได้ที่การทำงานกับขอบเขต OAuth2

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

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

ตัวอย่างปลายทาง

นี่คือตัวอย่างการกำหนดค่าปลายทางสำหรับการสร้างโทเค็นเพื่อการเข้าถึง โดยจะดำเนินการตามนโยบาย GenerateAccessTokenImplicitGrant

...
       <Flow name="generate-access-token-implicit">
            <Request>
                <Step>
                    <Name>GenerateAccessTokenImplicitGrant</Name>
                </Step>
            </Request>
            <Response/>
            <Condition>(proxy.pathsuffix MatchesPath "/implicit") and (request.verb = "POST")</Condition>
        </Flow>
...

นโยบายตัวอย่าง

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

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<OAuthV2 name="GenerateAccessTokenImplicit">
    <DisplayName>GenerateAccessTokenImplicit</DisplayName>
    <Operation>GenerateAccessTokenImplicitGrant</Operation>
    <GenerateResponse enabled="true"/>
</OAuthV2>

การคืนสินค้า

เมื่อ<GenerateResponse>เปิดใช้ นโยบายจะแสดงการเปลี่ยนเส้นทาง 302 Location ในส่วนหัวการตอบกลับ การเปลี่ยนเส้นทางจะชี้ไปยัง URL ที่ระบุในพารามิเตอร์ redirect_uri และต่อท้ายด้วยโทเค็นเพื่อการเข้าถึงและเวลาหมดอายุของโทเค็น โปรดทราบว่าประเภทการให้สิทธิ์โดยนัย ไม่รองรับโทเค็นการรีเฟรช เช่น

https://callback-example.com#expires_in=1799&access_token=In4dKm4ueoGZRbIYJhC9yZCmTFw5

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

oauthv2accesstoken.{policy-name}.access_token
oauthv2accesstoken.{policy-name}.expires_in  //--in seconds

เช่น

oauthv2accesstoken.GenerateAccessToken.access_token
oauthv2accesstoken.GenerateAccessToken.expires_in   //--in seconds

การขอรหัสการให้สิทธิ์

หากใช้ขั้นตอนประเภทการให้สิทธิ์รหัสการให้สิทธิ์ คุณต้องขอรหัสการให้สิทธิ์ ก่อนจึงจะขอโทเค็นเพื่อการเข้าถึงได้

ตัวอย่างคำขอ

$ curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
  'http://myorg-test.apigee.net/oauth/authorize?client_id={consumer_key}&response_type=code'

ซึ่งมีการแนบนโยบาย GenerateAuthorizationCode ของ OAuthV2 ที่ /oauth/authorizeพร็อกซีปลายทาง (ดูตัวอย่างปลายทางด้านล่าง)

พารามิเตอร์ที่จำเป็น

โดยค่าเริ่มต้น พารามิเตอร์เหล่านี้ต้องเป็นพารามิเตอร์การค้นหา (ตามที่แสดงในตัวอย่างด้านบน) อย่างไรก็ตาม คุณสามารถเปลี่ยนค่าเริ่มต้นนี้ได้โดยการกำหนดค่าองค์ประกอบ <ResponseType> <ClientId> และ <RedirectUri> ในนโยบาย OAuthV2 ที่แนบมากับปลายทาง /authorize นี้ ดูรายละเอียดได้ที่นโยบาย OAuthV2

  • response_type - ต้องตั้งค่าเป็น code
  • client_id - รหัสไคลเอ็นต์ของแอปนักพัฒนาซอฟต์แวร์ที่ลงทะเบียน

พารามิเตอร์ ที่ไม่บังคับ

  • redirect_uri - หากระบุ URI ของการเรียกกลับแบบเต็ม (ไม่ใช่แบบบางส่วน) ใน แอปไคลเอ็นต์ที่ลงทะเบียน พารามิเตอร์นี้จะมีหรือไม่มีก็ได้ มิฉะนั้นจะต้องระบุ การเรียกกลับ คือ URL ที่ Edge ส่งรหัสการให้สิทธิ์ที่สร้างขึ้นใหม่ ดูลงทะเบียนแอปและจัดการคีย์ API ด้วย
  • state - สตริงที่จะส่งกลับพร้อมกับการตอบกลับ โดยทั่วไปจะใช้ เพื่อป้องกันการโจมตีแบบ Cross-Site Request Forgery
  • ขอบเขต - ช่วยให้คุณกรองรายการผลิตภัณฑ์ API ที่ใช้โทเค็นที่สร้างขึ้นได้ ดูข้อมูลโดยละเอียดเกี่ยวกับขอบเขตได้ที่การทำงานกับขอบเขต OAuth2

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

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

ตัวอย่างปลายทาง

ตัวอย่างการกำหนดค่าปลายทางสำหรับการสร้างรหัสการให้สิทธิ์มีดังนี้

<OAuthV2 name="GenerateAuthorizationCode">
  <Operation>GenerateAuthorizationCode</Operation>
    <!--
    ExpiresIn, in milliseconds. The ref is optional. The explicitly specified
    value is the default, when the variable reference cannot be resolved.
        60000 = 1 minute
       120000 = 2 minutes
    -->
  <ExpiresIn>60000</ExpiresIn>
  <GenerateResponse enabled="true"/>
</OAuthV2>

นโยบายตัวอย่าง

นี่คือนโยบาย GenerateAuthorizationCode พื้นฐาน ดูข้อมูลเกี่ยวกับองค์ประกอบการกำหนดค่าที่ไม่บังคับ ซึ่งคุณกำหนดค่าได้ด้วยนโยบายนี้ได้ที่นโยบาย OAuthV2

<OAuthV2 name="GenerateAuthorizationCode">
    <Operation>GenerateAuthorizationCode</Operation>
    <GenerateResponse enabled="true"/>
</OAuthV2>

การคืนสินค้า

เมื่อ<GenerateResponse>เปิดใช้ นโยบายจะแสดงพารามิเตอร์การค้นหา ?code ไปยังตำแหน่ง redirect_uri (URI ติดต่อกลับ) พร้อมรหัสการให้สิทธิ์ ที่แนบมา โดยจะส่งผ่านการเปลี่ยนเส้นทางของเบราว์เซอร์ 302 พร้อม URL ในส่วนหัวข้อมูลตำแหน่งของการตอบกลับ ตัวอย่างเช่น ?code=123456

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

oauthv2authcode.{policy-name}.code
oauthv2authcode.{policy-name}.scope
oauthv2authcode.{policy-name}.redirect_uri
oauthv2authcode.{policy-name}.client_id

เช่น

oauthv2authcode.GenerateAuthorizationCode.code
oauthv2authcode.GenerateAuthorizationCode.scope
oauthv2authcode.GenerateAuthorizationCode.redirect_uri
oauthv2authcode.GenerateAuthorizationCode.client_id

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

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

วิธีขอโทเค็นเพื่อการเข้าถึงใหม่โดยใช้โทเค็นการรีเฟรช

ตัวอย่างคำขอ

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

$ curl -X POST \
  -H "Content-type: application/x-www-form-urlencoded" \
  -H 'Authorization: Basic c3FIOG9vSGV4VHo4QzAyg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ' \
  https://myorg-test.apigee.net/my_oauth_endpoint/refresh_accesstoken \
  -d 'grant_type=refresh_token&refresh_token=my-refresh-token'

พารามิเตอร์ที่จำเป็น

  • grant_type - ต้องตั้งค่าเป็น refresh_token
  • refresh_token - โทเค็นการรีเฟรชที่เชื่อมโยงกับโทเค็นเพื่อการเข้าถึงที่คุณต้องการต่ออายุ

โดยค่าเริ่มต้น นโยบายจะค้นหาพารามิเตอร์เหล่านี้เป็นx-www-form-urlencodedพารามิเตอร์ ที่ระบุไว้ในเนื้อหาคำขอ ดังที่แสดงในตัวอย่างด้านบน หากต้องการกำหนดค่าตำแหน่งอื่น สำหรับข้อมูลเหล่านี้ คุณสามารถใช้องค์ประกอบ <GrantType> และ <RefreshToken> ในนโยบาย OAuthV2 ดูรายละเอียดได้ที่นโยบาย OAuthV2

พารามิเตอร์ที่ไม่บังคับ

  • state - สตริงที่จะส่งกลับพร้อมกับการตอบกลับ โดยทั่วไปจะใช้ เพื่อป้องกันการโจมตีแบบ Cross-Site Request Forgery
  • ขอบเขต - ช่วยให้คุณกรองรายการผลิตภัณฑ์ API ที่ใช้โทเค็นที่สร้างขึ้นได้ ดูข้อมูลโดยละเอียดเกี่ยวกับขอบเขตได้ที่การทำงานกับขอบเขต OAuth2

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

  • client_id
  • client_secret

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

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

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

 ...
       <Flow name="generate-refresh-token">
            <Request>
                <Step>
                    <Name>RefreshAccessToken</Name>
                </Step>
            </Request>
            <Response/>
            <Condition>(proxy.pathsuffix MatchesPath "/refresh") and (request.verb = "POST")</Condition>
       </Flow>
...

นโยบายตัวอย่าง

นี่คือนโยบาย RefreshAccessToken พื้นฐานที่กำหนดค่าให้ยอมรับrefresh_tokenประเภทการให้สิทธิ์ ดูข้อมูลเกี่ยวกับองค์ประกอบการกำหนดค่าที่ไม่บังคับซึ่งคุณกำหนดค่าได้ด้วยนโยบายนี้ได้ที่นโยบาย OAuthV2

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<OAuthV2 name="RefreshAccessToken">
    <Operation>RefreshAccessToken</Operation>
    <GenerateResponse enabled="true"/>
    <ExpiresIn>1800000</ExpiresIn> <!-- 30 minutes -->
    <RefreshTokenExpiresIn>28800000</RefreshTokenExpiresIn> <!-- 8 hours -->
</OAuthV2>

การคืนสินค้า

เมื่อ<GenerateResponse>เปิดใช้ นโยบายจะแสดงการตอบกลับเป็น JSON ซึ่งมีโทเค็นเพื่อการเข้าถึงใหม่ ประเภทการให้สิทธิ์ refresh_token รองรับการสร้างทั้ง โทเค็นเพื่อการเข้าถึงและโทเค็นการรีเฟรชใหม่ เช่น

{
    "issued_at": "1420301470489",
    "application_name": "ce1e94a2-9c3e-42fa-a2c6-1ee01815476b",
    "scope": "READ",
    "refresh_token_issued_at": "1420301470489",
    "status": "approved",
    "refresh_token_status": "approved",
    "api_product_list": "[PremiumWeatherAPI]",
    "expires_in": "1799", //--in seconds
    "developer.email": "tesla@weathersample.com",
    "token_type": "BearerToken",
    "refresh_token": "8fKDHLryAD9KFBsrpixlq3qPJnG2fdZ5",
    "client_id": "5jUAdGv9pBouF0wOH5keAVI35GBtx3dT",
    "access_token": "jmZ2Hqv3iNsABUtAAsfWR3QGNctw",
    "organization_name": "docs",
    "refresh_token_expires_in": "28799", //--in seconds
    "refresh_count": "2"
}

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

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

oauthv2accesstoken.{policy-name}.access_token
oauthv2accesstoken.{policy-name}.expires_in   //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token
oauthv2accesstoken.{policy-name}.refresh_token_expires_in  //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token_issued_at
oauthv2accesstoken.{policy-name}.refresh_token_status

เช่น

oauthv2accesstoken.RefreshAccessToken.access_token
oauthv2accesstoken.RefreshAccessToken.expires_in
oauthv2accesstoken.RefreshAccessToken.refresh_token
oauthv2accesstoken.RefreshAccessToken.refresh_token_expires_in
oauthv2accesstoken.RefreshAccessToken.refresh_token_issued_at
oauthv2accesstoken.RefreshAccessToken.refresh_token_status

การเข้ารหัส ข้อมูลเข้าสู่ระบบการตรวจสอบสิทธิ์พื้นฐาน

เมื่อทำการเรียก API เพื่อขอโทเค็นหรือรหัสการให้สิทธิ์ แนวทางปฏิบัติที่ดีและข้อกำหนด OAuth 2.0 แนะนำให้ส่งค่า client_id และ client_secret เป็นส่วนหัวการตรวจสอบสิทธิ์ HTTP-Basic ตามที่อธิบายไว้ใน IETF RFC 2617 โดยคุณต้อง เข้ารหัส Base64 ผลลัพธ์ของการรวมค่าทั้ง 2 เข้าด้วยกันโดยใช้เครื่องหมายโคลอนคั่น

ในซูโดโค้ด

result = Base64Encode(concat('ns4fQc14Zg4hKFCNaSzArVuwszX95X', ':', 'ZIjFyTsNgQNyxI'))

ในตัวอย่างนี้ ns4fQc14Zg4hKFCNaSzArVuwszX95X คือ client_id และ ZIjFyTsNgQNyxI คือรหัสลับไคลเอ็นต์

ไม่ว่าคุณจะใช้ภาษาโปรแกรมใดในการคำนวณค่าที่เข้ารหัสแบบ Base64 สำหรับข้อมูลเข้าสู่ระบบไคลเอ็นต์ที่ระบุ ผลลัพธ์ที่เข้ารหัสแบบ Base64 จะเป็นดังนี้ bnM0ZlFjMTRaZzRoS0ZDTmFTekFyVnV3c3pYOTVYOlpJakZ5VHNOZ1FOeXhJOg==

จากนั้นคุณสามารถส่งคำขอโทเค็นได้ดังนี้

$ curl -i -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Authorization: Basic bnM0ZlFjMTRaZzRoS0ZDTmFTekFyVnV3c3pYOTVYOlpJakZ5VHNOZ1FOeXhJOg==' \
  -X POST 'https://docs-test.apigee.net/oauth/accesstoken' \
  -d 'grant_type=client_credentials'

curl จะสร้างส่วนหัว HTTP Basic ให้คุณจริงๆ หากคุณใช้ตัวเลือก -u ข้อความต่อไปนี้มีความหมายเหมือนกับข้อความด้านบน

$ curl -i -H 'Content-Type: application/x-www-form-urlencoded' \
  -u 'ns4fQc14Zg4hKFCNaSzArVuwszX95X:ZIjFyTsNgQNyxI' \
  -X POST 'https://docs-test.apigee.net/oauth/accesstoken' \
  -d 'grant_type=client_credentials'

สภาพแวดล้อมการเขียนโปรแกรมอื่นๆ อาจมีแป้นพิมพ์ลัดที่คล้ายกันซึ่งสร้างส่วนหัวที่เข้ารหัส base64 โดยอัตโนมัติ

การแฮชโทเค็นในฐานข้อมูล

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

พร็อพเพอร์ตี้ระดับองค์กรต่อไปนี้จะควบคุมการแฮชโทเค็น OAuth

features.isOAuthTokenHashingEnabled = true
features.OAuthTokenHashingAlgorithm = SHA1 | SHA256 | SHA384 | SHA512 | PLAIN

หากมีโทเค็นที่แฮชอยู่แล้วและต้องการเก็บโทเค็นเหล่านั้นไว้จนกว่าจะหมดอายุ ให้ตั้งค่าพร็อพเพอร์ตี้ต่อไปนี้ในองค์กร โดยที่อัลกอริทึมการแฮชตรงกับอัลกอริทึมที่มีอยู่ (เช่น SHA1 ซึ่งเป็นค่าเริ่มต้นเดิมของ Edge) หากไม่ได้แฮชโทเค็น ให้ใช้ PLAIN

features.isOAuthTokenFallbackHashingEnabled = true
features.OAuthTokenFallbackHashingAlgorithm = SHA1 | SHA256 | SHA384 | SHA512 | PLAIN

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

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