เปิดใช้งานคลาวด์สนับสนุนกระบวนการอนุญาต OAuth 2.0 โดยมีหรือไม่มี PKCE ขึ้นอยู่กับว่าลูกค้าของคุณเป็นความลับหรือสาธารณะ
- ลูกค้าที่เป็นความลับ เป็นแอปที่สามารถเก็บรักษาข้อมูลลับได้ เช่น เว็บไซต์ที่สามารถเก็บและดึงความลับได้อย่างปลอดภัยบนแบ็คเอนด์
- ลูกค้าสาธารณะ เป็นแอปที่ไม่สามารถเก็บความลับได้ เช่น แอปเบราว์เซอร์มือถือและเว็บ
เราแนะนำการไหลของโค้ดอนุญาต OAuth 2.0 ด้วย PKCE สำหรับ ทั้งหมด ลูกค้า และต้องใช้สำหรับลูกค้าสาธารณะ
เพื่อใช้การไหลของรหัสการอนุญาต แอปของคุณดำเนินการตามขั้นตอนต่อไปนี้:
- สร้างตัวตรวจสอบรหัสและความท้าทายด้านรหัส (เฉพาะ PKCE เท่านั้น)สิ่งนี้ช่วยให้คุณสามารถรวมความท้าทายในคำขอของคุณแทนที่จะเป็นความลับของไคลเอนต์ซึ่งช่วยเพิ่มความปลอดภัย
- ส่งคำขอ GET ไปยังจุดสิ้นสุดการอนุญาตด้วยพารามิเตอร์ที่เหมาะสม
- จัดการการโทรกลับการอนุญาตหลังจากได้รับการอนุญาตแล้วใช้รหัสการอนุญาตจาก Roblox ในคำขอเปลี่ยนเส้นทางไปยัง URL การสร้างสรรค์
- ส่งคำขอ POST ไปยังจุดสิ้นสุดโทเค็นด้วยรหัสการอนุญาตหากประสบความสำเร็จ คุณจะได้รับการเข้าถึงและรีเฟรชโทเค็นที่จะใช้สำหรับการโทร API
- โทรไปยัง API เปิดในเมฆที่สนับสนุนการตรวจสอบ OAuth 2.0 ตามคู่มือการอ้างอิงสำหรับทรัพยากรที่คุณต้องการเข้าถึง
ส่วนต่อไปอธิบายแต่ละขั้นตอนในรายละเอียดมากขึ้น
สร้างความท้าทายด้วยรหัส (สำหรับ PKCE เท่านั้น)
ก่อนที่จะเริ่มกระบวนการอนุญาต คุณต้องสร้างความท้าทายด้วยรหัสจากตัวตรวจสอบรหัสคุณสามารถใช้ไลบรารีหรือฟังก์ชันที่สร้างไว้ล่วงหน้าในภาษาโปรแกรมของคุณเพื่อสร้างตัวตรวจสอบโค้ดคำนวณแฮชและดำเนินการเข้ารหัส Base64 เพื่อสร้างความท้าทายด้านโค้ด
เมื่อสร้างตัวตรวจสอบรหัสเพียงใช้ตัวอักษรที่ไม่ได้รับการจอง รวมถึงตัวอักษรภาษาอังกฤษใหญ่และตัวอักษรภาษาอังกฤษเล็ก (A-Z, a-z) ตัวเลขทศนิยม (0-9) เครื่องหมายขีดเส้นใต้ (-) เครื่องหมายช่องว่าง (.) และเครื่องหมายเส้นใต้ทีลดลง (~) โดยมีความยาวขั้นต่ำ 43 ตัวอักษรและความยาวสูงสุด 128 ตัวอักษร
ตัวอย่างต่อไปนี้แสดงวิธีการใช้ Javascript เพื่อสร้างตัวตรวจสอบรหัสและสร้างความท้าทายรหัสโดยใช้อัลกอริทึ่มการแฮช SHA-256:
Generate Code Challenge
const crypto = require('crypto');
// base64URL encode the verifier and challenge
function base64URLEncode(str) {
return str.toString('base64')
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '');
}
// create sha256 hash from code verifier
function sha256(buffer) {
return crypto.createHash('sha256').update(buffer).digest(`base64`);
}
// create a random code verifier
var code_verifier = base64URLEncode(crypto.randomBytes(32));
// generate a challenge from the code verifier
var code_challenge = base64URLEncode(sha256(code_verifier));
สำหรับ PKCE คุณต้องการทั้งตัวตรวจสอบรหัสและค่าท้าทายในขั้นตอนต่อไป
สร้าง URL การอนุญาต
เพื่อเริ่มต้นกระบวนการอนุญาตผู้ใช้ สร้าง URL การอนุญาตที่มีพารามิเตอร์ที่จำเป็น:
- client_id : รหัสลูกค้าของแอปของคุณที่ได้รับหลังจาก ลงทะเบียนแอปของคุณ
- redirect_uri : รหัสเรียกคืนของแอปของคุณ, จุดเข้าสู่ระบบใหม่ของแอปของคุณ
- scope : ขอบเขตที่ร้องขอที่กำหนดสิทธิ์การเข้าถึงที่แอปของคุณต้องการในรายการแยกพื้นที่
- response_type : ตั้งค่าให้เป็น code เพื่อระบุการไหลของรหัสการอนุญาต จำเป็นสำหรับ PKCE เท่านั้น
- code_challenge : ความท้าทายด้านรหัสที่สร้างจากตัวตรวจสอบรหัส
- code_challenge_method : ตั้งค่าพารามิเตอร์นี้เป็น S256 เพื่อระบุว่าความท้าทายด้านโค้ดถูกเปลี่ยนโดยใช้อัลกอริทึ่ม SHA-256 ซึ่งเป็นความท้าทายด้านโค้ดที่ได้รับการสนับสนุนมากที่สุดและปลอดภัยที่สุด
- state : ค่าสุ่มที่ไม่โปร่งใสและปลอดภัยเพื่อรักษาสถานะระหว่างคำขอและการโทรกลับ จำเป็นสำหรับ non-PKCE เท่านั้น
- client_secret : ความลับของไคลเอนต์แอปของคุณที่ได้รับหลังจาก ลงทะเบียนแอปของคุณหากคุณกำลังใช้การตรวจสอบด้วย PKCE ให้ข้ามพารามิเตอร์นี้URL คำขออนุญาตของคุณต้องมีรูปแบบที่ดี เช่นในตัวอย่างต่อไปนี้:
ตัวอย่าง URL การอนุญาต PKCE
https://apis.roblox.com/oauth/v1/authorize?client_id=7290610391231237934964&code_challenge=PLEKKVCjdD1V_07wOKlAm7P02NC-LZ_1hQfdu5XSXEI&code_challenge_method=S256&redirect_uri=https://example.com/redirect&scope=openid%20profile&response_type=code&state=abc123
เมื่อผู้ใช้ไปที่ URL พวกเขาจะผ่านกระบวนการอนุญาติแล้ว หากสําเร็จ Roblox จะเปลี่ยนผู้ใช้ไปที่ redirect_uri ที่กำหนด
จัดการการโทรกลับการอนุญาติผู้เขียน
เมื่อกระบวนการอนุญาตสําเร็จแล้ว แอปของคุณจะได้รับคําขอ GET จากเซิร์ฟเวอร์การอนุญาตของ Roblox ที่คุณระบุไว้ที่ redirect_uriในคำขอคุณจะได้รับ code (รหัสการอนุญาต) และ state (ถ้าคุณให้ค่าไว้ก่อนหน้านี้) พารามิเตอร์
พารามิเตอร์ code มีรหัสการอนุญาตที่แอปสามารถแลกเปลี่ยนเป็นโทเค็นการเข้าถึงจากเซิร์ฟเวอร์การอนุญาตได้ภาษาเซิร์ฟเวอร์ด้านหลังส่วนใหญ่มีวิธีการเข้าถึงพารามิเตอร์คำถามเป็นวัตถุที่ถูกถอดรหัสแบบมาตรฐานคุณจะต้องรับพารามิเตอร์ code และใช้เพื่อแลกเปลี่ยนเป็นโทเค็นการเข้าถึง
พารามิเตอร์ state เป็นค่าที่ไม่โปร่งใสที่คุณเริ่มต้นให้ในคำขออนุญาตคุณสามารถใช้พารามิเตอร์นี้เพื่อรักษาสถานะหรือบริบทของกระบวนการอนุญาตได้
ตัวอย่างเช่นคุณอาจได้รับคำขอ GET ด้วย URL ต่อไปนี้หากคุณระบุ URL การเปลี่ยนเส้นทางของคุณเป็น https://example.com/redirect
ตัวอย่าง URL เปลี่ยนเส้นทาง
https://example.com/redirect?code=10c45PNuquKnFJ6pUcy5-fHkghEM6lSegm-7hj9mVEprub1dSDuStuKK_EAUXY7AHTD63xcnmvxSLthp-C8g3jzIGZVzuXSd20Y2dEYI9hx0LZmPg95ME4z2K03UheiZbroyXUjYyB3ReoMqobzDVPzyx6IS8kj2Uu-11Xq_0JiTYxtDatuqXRNIAmJT8gMJmbSyOLOP_vnDvbeMUiBsqCRrkTGVbWSwYSc8sTVVE-535kYdqQOgNjH1ffCoZLGl8YYxLnpb2CXJlRQPrcjkA&state=6789
หากการอนุญาตล้มเหลวแอปของคุณจะได้รับคำขอ GET จาก URL เปลี่ยนเส้นทางที่กำหนดไว้พร้อมกับ error , error_description และ state (ที่ใช้บังคับ) พารามิเตอร์
- พารามิเตอร์ error ระบุข้อผิดพลาด OAuth 2.0 เฉพาะที่เกิดขึ้นในระหว่างกระบวนการอนุญาต
- พารามิเตอร์ error_description ให้รายละเอียดเพิ่มเติมของข้อผิดพลาด
- พารามิเตอร์ state ช่วยให้แอปของคุณรักษาสถานะในกรณีที่เกิดความล้มเหลว
แลกรหัสอนุญาตสำหรับโทเค็นการเข้าถึง
เมื่อคุณได้ประมวลผลการอนุญาต code แล้วแลกเปลี่ยนเป็นโทเค็นเพื่อเข้าถึงทรัพยากร Roblox ที่ต้องการ:
แยกโทเค็นที่เกี่ยวข้องจากคำตอบที่ได้รับโทเค็นการเข้าถึงมีอายุ 15 นาทีเก็บโทเค็นการรีเฟรชอย่างปลอดภัยโดยทั่วไปบนด้านเซิร์ฟเวอร์เพื่อให้คุณสามารถใช้เพื่อรับโทเค็นใหม่ในอนาคตได้
ตอบสนองจุดสิ้นสุดโทเค็นตัวอย่าง{"access_token": "eyJhbGciOiJFUzI1NiIsImtpZCI6IlBOeHhpb2JFNE8zbGhQUUlUZG9QQ3FCTE81amh3aXZFS1pHOWhfTGJNOWMiLCJ0eXAiOiJKV11234.eyJzdWIiOiIyMDY3MjQzOTU5IiwiYWlkIjoiM2Q2MWU3NDctM2ExNS00NTE4LWJiNDEtMWU3M2VhNDUyZWIwIiwic2NvcGUiOiJvcGVuaWQ6cmVhZCBwcm9maWxlOnJlYWQiLCJqdGkiOiJBVC5QbmFWVHpJU3k2YkI5TG5QYnZpTCIsIm5iZiI6MTY5MTYzOTY5OCwiZXhwIjoxNjkxNjQwNTk4LCJpYXQiOjE2OTE2Mzk2OTgsImlzcyI6Imh0dHBzOi8vYXBpcy5yb2Jsb3guY29tL29hdXRoLyIsImF1ZCI6IjcyOTA2MTAzOTc5ODc5MzQ5Nj1234.BjwMkC8Q5a_iP1Q5Th8FrS7ntioAollv_zW9mprF1ats9CD2axCvupZydVzYphzQ8TawunnYXp0Xe8k0t8ithg","refresh_token": "eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwia2lkIjoidGpHd1BHaURDWkprZEZkREg1dFZ5emVzRWQyQ0o1NDgtUi1Ya1J1TTBBRSIsInR5cCI6IkpXVCJ9..nKYZvjvXH6msDG8Udluuuw.PwP-_HJIjrgYdY-gMR0Q3cabNwIbmItcMEQHx5r7qStVVa5l4CbrKwJvjY-w9xZ9VFb6P70WmXndNifnio5BPZmivW5QkJgv5_sxLoCwsqB1bmEkz2nFF4ANLzQLCQMvQwgXHPMfCK-lclpVEwnHk4kemrCFOvfuH4qJ1V0Q0j0WjsSU026M67zMaFrrhSKwQh-SzhmXejhKJOjhNfY9hAmeS-LsLLdszAq_JyN7fIvZl1fWDnER_CeDAbQDj5K5ECNOHAQ3RemQ2dADVlc07VEt2KpSqUlHlq3rcaIcNRHCue4GfbCc1lZwQsALbM1aSIzF68klXs1Cj_ZmXxOSOyHxwmbQCHwY7aa16f3VEJzCYa6m0m5U_oHy84iQzsC-_JvBaeFCachrLWmFY818S-nH5fCIORdYgc4s7Fj5HdULnnVwiKeQLKSaYsfneHtqwOc_ux2QYv6Cv6Xn04tkB2TEsuZ7dFwPI-Hw2O30vCzLTcZ-Fl08ER0J0hhq4ep7B641IOnPpMZ1m0gpJJRPbHX_ooqHol9zHZ0gcLKMdYy1wUgsmn_nK_THK3m0RmENXNtepyLw_tSd5vqqIWZ5NFglKSqVnbomEkxneEJRgoFhBGMZiR-3FXMaVryUjq-N.Q_t4NGxTUSMsLVEppkTu0Q6rwt2rKJfFGuvy3s12345","token_type": "Bearer","expires_in": 899,"id_token": "eyJhbGciOiJFUzI1NiIsImtpZCI6IkNWWDU1Mi1zeWh4Y1VGdW5vNktScmtReFB1eW15YTRQVllodWdsd3hnNzgiLCJ0eXAiOiJKV11234.eyJzdWIiOiIyMDY3MjQzOTU5IiwibmFtZSI6ImxpbmtzZ29hdCIsIm5pY2tuYW1lIjoibGlua3Nnb2F0IiwicHJlZmVycmVkX3VzZXJuYW1lIjoibGlua3Nnb2F0IiwiY3JlYXRlZF9hdCI6MTYwNzM1NDIzMiwicHJvZmlsZSI6Imh0dHBzOi8vd3d3LnJvYmxveC5jb20vdXNlcnMvMjA2NzI0Mzk1OS9wcm9maWxlIiwibm9uY2UiOiIxMjM0NSIsImp0aSI6IklELnltd3ZjTUdpOVg4azkyNm9qd1I5IiwibmJmIjoxNjkxNjM5Njk4LCJleHAiOjE2OTE2NzU2OTgsImlhdCI6MTY5MTYzOTY5OCwiaXNzIjoiaHR0cHM6Ly9hcGlzLnJvYmxveC5jb20vb2F1dGgvIiwiYXVkIjoiNzI5MDYxMDM5Nzk4NzkzNDk2NCJ9.kZgCMJQGsariwCi8HqsUadUBMM8ZOmf_IPDoWyQY9gVX4Kx3PubDz-Q6MvZ9eU5spNFz0-PEH-G2WSvq2ljDyg","scope": "openid profile"}
ทำการโทรไปยังวิธีการทรัพยากร
ตอนนี้ที่คุณมีโทเค็นการเข้าถึงที่จำเป็นแล้ว คุณสามารถใช้มันเพื่อสร้างการโทรที่ได้รับการยืนยันไปยังวิธีการทรัพยากรรวมโทเค็นการเข้าถึงในหัวข้อของคำขอ API ทั้งหมดเพื่ออนุญาตให้พวกเขา
ตัวอย่างเช่น คุณสามารถทดสอบได้ว่าฟังก์ชันของแอปทำงานอย่างถูกต้องโดยผ่านกระบวนการอนุญาตทั้งหมดแล้วสร้างคำขอ ไปยังจุดสิ้นสุดข้อมูลผู้ใช้ด้วยโทเค็นการเข้าถึงตรวจสอบให้แน่ใจว่าคุณมี openid หรือทั้งสองระดับ openid และ profile ก่อนที่จะเรียกจุดสิ้นสุดนี้หากสําเร็จการตอบสนองจากจุดจบนั้นจะมีลักษณะดังนี้:
ตอบสนองข้อมูลผู้ใช้ตัวอย่าง
{
"sub": "12345678",
"name": "Jane Doe",
"nickname": "robloxjanedoe",
"preferred_username": "robloxjanedoe",
"created_at": 1607354232,
"profile": "https://www.roblox.com/users/12345678/โปรไฟล์"
}