ข้ามไปยังเนื้อหาหลัก

OAuth 2.0

บทนำ

Casdoor รองรับการใช้ Access Token เพื่อตรวจสอบสิทธิ์ของลูกค้า ในส่วนนี้ เราจะแสดงวิธีการได้รับ Access Token วิธีการตรวจสอบ Access Token และวิธีการใช้ Access Token

วิธีการได้รับ Access Token

มีสองวิธีในการได้รับ Access Token: คุณสามารถใช้ Casdoor SDKs สำหรับข้อมูลเพิ่มเติม กรุณาดูที่เอกสาร SDK ที่นี่ เราจะแสดงวิธีการใช้ API เพื่อรับ Access Token

Casdoor รองรับ OAuth grant types สี่ประเภท: Authorization Code Grant, Implicit Grant, Resource Owner Password Credentials Grant, และ Client Credentials Grant

ด้วยเหตุผลด้านความปลอดภัย Casdoor app มีโหมด authorization code เปิดใช้งานโดยค่าเริ่มต้น หากคุณต้องการใช้โหมดอื่นๆ กรุณาไปที่แอปที่เหมาะสมเพื่อตั้งค่า

ประเภทของ Grant

Authorization Code Grant

ก่อนอื่น เปลี่ยนเส้นทางผู้ใช้ของคุณไปที่:

https://<CASDOOR_HOST>/login/oauth/authorize?
client_id=CLIENT_ID&
redirect_uri=REDIRECT_URI&
response_type=code&
scope=openid&
state=STATE

ขอบเขตที่มีให้

ชื่อคำอธิบาย
openid (no scope)sub (id ของผู้ใช้), iss (ผู้ออก), และ aud (ผู้รับ)
profileข้อมูลโปรไฟล์ผู้ใช้ รวมถึงชื่อ, displayName และ avatar
emailที่อยู่อีเมลของผู้ใช้
addressที่อยู่ของผู้ใช้
phoneหมายเลขโทรศัพท์ของผู้ใช้
ข้อมูล

แอปพลิเคชัน OAuth ของคุณสามารถขอขอบเขตในการเปลี่ยนเส้นทางเริ่มต้น คุณสามารถระบุขอบเขตหลายอย่างโดยแยกด้วยช่องว่างโดยใช้ %20:

https://<CASDOOR_HOST>/login/oauth/authorize?
client_id=...&
scope=openid%20email

สำหรับรายละเอียดเพิ่มเติม กรุณาดูที่ มาตรฐาน OIDC

หลังจากผู้ใช้ของคุณได้รับการตรวจสอบสิทธิ์กับ Casdoor Casdoor จะเปลี่ยนเส้นทางพวกเขาไปที่:

https://REDIRECT_URI?code=CODE&state=STATE

ตอนนี้ที่คุณได้รับ authorization code แล้ว ทำการส่งคำขอ POST ไปที่:

https://<CASDOOR_HOST>/api/login/oauth/access_token

ในแอปพลิเคชันแบ็กเอนด์ของคุณ:

{
"grant_type": "authorization_code",
"client_id": ClientId,
"client_secret": ClientSecret,
"code": Code,
}

คุณจะได้รับคำตอบดังนี้:

{
"access_token": "eyJhb...",
"id_token": "eyJhb...",
"refresh_token": "eyJhb...",
"token_type": "Bearer",
"expires_in": 10080,
"scope": "openid"
}
หมายเหตุ

Casdoor ยังรองรับคุณสมบัติ PKCE เมื่อได้รับ authorization code คุณสามารถเพิ่มสองพารามิเตอร์เพื่อเปิดใช้งาน PKCE:

&code_challenge_method=S256&code_challenge=YOUR_CHANNELLENGE

เมื่อได้รับโทเค็น คุณต้องส่งพารามิเตอร์ code_verifier เพื่อตรวจสอบ PKCE ควรทราบว่าเมื่อเปิดใช้งาน PKCE Client_Secret ไม่จำเป็นต้องมี แต่ถ้าคุณส่งมันไป มันต้องเป็นค่าที่ถูกต้อง

Implicit Grant

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

https://<CASDOOR_HOST>/login/oauth/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&response_type=token&scope=openid&state=STATE

หลังจากผู้ใช้ของคุณได้รับการตรวจสอบสิทธิ์กับ Casdoor Casdoor จะเปลี่ยนเส้นทางพวกเขาไปที่:

https://REDIRECT_URI/#access_token=ACCESS_TOKEN

Casdoor ยังรองรับ id_token เป็น response_type ซึ่งเป็นคุณสมบัติของ OpenID

Resource Owner Password Credentials Grant

หากแอปพลิเคชันของคุณไม่มีฟรอนต์เอนด์ที่เปลี่ยนเส้นทางผู้ใช้ไปยัง Casdoor คุณอาจต้องการสิ่งนี้

ก่อนอื่น คุณต้องแน่ใจว่าคุณได้เปิดใช้งาน Password Credentials Grant และส่งคำขอ POST ไปที่:

https://<CASDOOR_HOST>/api/login/oauth/access_token
{
"grant_type": "password",
"client_id": ClientId,
"client_secret": ClientSecret,
"username": Username,
"password": Password,
}

คุณจะได้รับคำตอบดังนี้:

{
"access_token": "eyJhb...",
"id_token": "eyJhb...",
"refresh_token": "eyJhb...",
"token_type": "Bearer",
"expires_in": 10080,
"scope": "openid"
}

Client Credentials Grant

คุณยังสามารถใช้ Client Credentials Grant เมื่อแอปพลิเคชันของคุณไม่มีฟรอนต์เอนด์

ก่อนอื่น คุณต้องแน่ใจว่าคุณได้เปิดใช้งาน Client Credentials Grant และส่งคำขอ POST ไปที่ https://<CASDOOR_HOST>/api/login/oauth/access_token:

{
"grant_type": "client_credentials",
"client_id": ClientId,
"client_secret": ClientSecret,
}

คุณจะได้รับคำตอบดังนี้:

{
"access_token": "eyJhb...",
"id_token": "eyJhb...",
"refresh_token": "eyJhb...",
"token_type": "Bearer",
"expires_in": 10080,
"scope": "openid"
}

สำคัญที่จะต้องทราบว่า AccessToken ที่ได้รับในลักษณะนี้แตกต่างจากสามอันแรกตรงที่มันสอดคล้องกับแอปพลิเคชันมากกว่าผู้ใช้

Refresh Token

บางทีคุณอาจต้องการอัปเดต Access Token ของคุณ แล้วคุณสามารถใช้ refreshToken ที่คุณได้รับข้างต้น

ก่อนอื่น คุณต้องตั้งเวลาหมดอายุของ Refresh Token ในแอปพลิเคชัน (ค่าเริ่มต้นคือ 0 ชั่วโมง) และส่งคำขอ POST ไปที่ https://<CASDOOR_HOST>/api/login/oauth/refresh_token

{
"grant_type": "refresh_token",
"refresh_token": REFRESH_TOKEN,
"scope": SCOPE,
"client_id": ClientId,
"client_secret": ClientSecret,
}

คุณจะได้รับคำตอบเช่นนี้:

{
"access_token": "eyJhb...",
"id_token": "eyJhb...",
"refresh_token": "eyJhb...",
"token_type": "Bearer",
"expires_in": 10080,
"scope": "openid"
}

วิธีการตรวจสอบ Access Token

Casdoor ปัจจุบันรองรับ endpoint token introspection endpoint นี้ได้รับการป้องกันด้วย Basic Authentication (ClientId:ClientSecret)

POST /api/login/oauth/introspect HTTP/1.1
Host: CASDOOR_HOST
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Authorization: Basic Y2xpZW50X2lkOmNsaWVudF9zZWNyZXQ=

token=ACCESS_TOKEN&token_type_hint=access_token

คุณจะได้รับคำตอบดังนี้:

{
"active": true,
"client_id": "c58c...",
"username": "admin",
"token_type": "Bearer",
"exp": 1647138242,
"iat": 1646533442,
"nbf": 1646533442,
"sub": "7a6b4a8a-b731-48da-bc44-36ae27338817",
"aud": [
"c58c..."
],
"iss": "http://localhost:8000"
}

วิธีการใช้ AccessToken

คุณสามารถใช้ AccessToken เพื่อเข้าถึง Casdoor APIs ที่ต้องการการตรวจสอบสิทธิ์

ตัวอย่างเช่น มีสองวิธีที่แตกต่างกันในการขอ /api/userinfo

ประเภทที่ 1: พารามิเตอร์คิวรี

https://<CASDOOR_HOST>/api/userinfo?accessToken=<your_access_token>

ประเภทที่ 2: โทเค็น HTTP Bearer

https://<CASDOOR_HOST>/api/userinfo with the header: "Authorization: Bearer <your_access_token>"

Casdoor จะแยกวิเคราะห์ access_token และคืนข้อมูลผู้ใช้ที่สอดคล้องกับ scope คุณจะได้รับคำตอบเดียวกัน ซึ่งดูเหมือนนี้:

{
"sub": "7a6b4a8a-b731-48da-bc44-36ae27338817",
"iss": "http://localhost:8000",
"aud": "c58c..."
}

หากคุณคาดหวังข้อมูลผู้ใช้เพิ่มเติม ให้เพิ่ม scope เมื่อได้รับ AccessToken ในขั้นตอน Authorization Code Grant

ความแตกต่างระหว่าง APIs userinfo และ get-account

  • /api/userinfo: API นี้คืนข้อมูลผู้ใช้เป็นส่วนหนึ่งของโปรโตคอล OIDC มันให้ข้อมูลจำกัด รวมเฉพาะข้อมูลพื้นฐานที่กำหนดในมาตรฐาน OIDC สำหรับรายการขอบเขตที่มีให้ที่ Casdoor รองรับ กรุณาดูที่ส่วน ขอบเขตที่มีให้

  • /api/get-account: API นี้ดึงข้อมูลวัตถุผู้ใช้สำหรับบัญชีที่เข้าสู่ระบบในปัจจุบัน มันเป็น API ที่เฉพาะเจาะจงของ Casdoor ที่ช่วยให้คุณสามารถได้รับข้อมูลทั้งหมดของ ผู้ใช้ ใน Casdoor