Open Cloud는 클라이언트가 비공개 또는 공개인지 여부에 관계없이 PKCE를 통해 OAuth 2.0 인증 흐름을 지원합니다.
- 기밀 클라이언트는 백엔드에서 보안 세кре트를 안전하게 저장하고 검색할 수 있는 웹 사이트와 같은 자격 증명을 비공개로 유지할 수 있는 앱입니다.
- 공개 클라이언트는 모바일 및 웹 브라우저 등과 같이 비밀을 유지할 수 없는 앱입니다.
모든 클라이언트에 대해 PKCE에 대한 OAuth 2.0 인증 코드 흐름을 권장하고 공개 클라이언트에 대해 필요합니다.
권한 코드 흐름을 구현하기 위해 앱은 다음과 같은 단계를 수행합니다.
- 코드 검사기 및 코드 챌린지(PKCE만)를 생성합니다. 이렇게 하면 클라이언트 비밀이 아닌 대신 요청에 도전을 포함할 수 있습니다. 이렇게 하면 보안이 향상됩니다.
- 필요한 매개 변수로 권한 부여 엔드포인트에 GET 요청을 보내십시오.
- 권한 처리 콜백을 처리합니다. 권한을 획득한 후 Roblox에서 지정한 URL로 리디렉션 요청을 사용하여 콘텐츠 작품중에 지정한 권한을 사용하십시오. 나중에 사용할 수 있도록 권한 코드를 분석하십시오.
- 자격 증명 코드가 있는 토큰 엔드포인트에 POST 요청을 보내십시오. 성공하면 액세스 및 새로 고침 토큰을 받아 응용 프로그램 호출을 수행할 수 있습니다.
- 액세스할 리소스에 대한 인증을 위한 OAuth 2.0 인증을 지원하는 모든 Open Cloud API를 호출하십시오.
다음 섹션에서는 각 단계를 자세히 설명합니다.
코드 챌린지 생성(PKCE만 해당)
신뢰 프로세스를 시작하기 전에 코드 검사소에서 코드 도전을 생성해야 합니다. 프로그래밍 언어의 라이브러리 또는 내장 함수를 사용하여 코드 검사소를 생성하고 해시를 계산하고 기본 64 인코딩을 수행하여 코드 도전을 생성할 수 있습니다.
코드 검사기를 생성할 때 대문자와 소문자 문자(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 : 앱 등록 후 얻은 앱의 클라이언트 ID입니다.
- redirect_uri : 앱의 리디렉션 URL, 앱의 재입장 지점.
- scope : 앱에 필요한 공간 별도 목록에 정의된 액세스 권한을 정의하는 요청된 범위입니다.
- response_type : 권한 코드 흐름을 나타내려면 code 로 설정하십시오. PKCE 전용
- code_challenge : 코드 검사소에서 생성된 코드 도전.
- code_challenge_method : 이 매개 변수 값을 S256로 설정하여 코드 도전이 SHA-256 알고리즘을 사용하여 변환되었음을 나타내기 위해 코드 도전 메서드입니다.
- state : 요청과 콜백 사이에 상태를 유지하는 불투명한 안전한 랜덤 값입니다. PKCE 없음 필요
- client_secret : 앱 등록 후에 얻은 앱의 클라이언트 비밀입니다. PKCE와 인증을 사용하는 경우 이 매개 변수를 생략하십시오. 권한 요청 URL은 다음 예에 잘 형식화되어야 합니다.
PKCE 인증 URL 예시
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 요청을 수신합니다. 요청에서 redirect_uri (권한 코드) 및 code (이전에 값을 지정한 경우) 매개 변수를 수신합니다.
code 매개 변수에는 앱이 권한 서버로부터 액세스 토큰을 교환할 수 있는 권한 코드가 포함되어 있습니다. 대부분의 백엔드 서버 언어에는 쿼리 매개 변수를 익숙한 개체로 액세스할 수 있는 표준 방법이 있습니다. 액세스 토큰을 교환하려면 code 매개
state 매개 변수는 초기에 인증 요청에 제공한 불투명한 값입니다. 이 매개 변수를 사용하여 인증 프로세스의 상태 또는 컨텍스트를 유지할 수 있습니다.
예를 들어, 리디렉션 URL을 https://Example.com/Redirect로 지정하면 다음과 같은 GET 요청을 받습니다.
예시 리디렉션 URL
https://example.com/redirect?code=10c45PNuquKnFJ6pUcy5-fHkghEM6lSegm-7hj9mVEprub1dSDuStuKK_EAUXY7AHTD63xcnmvxSLthp-C8g3jzIGZVzuXSd20Y2dEYI9hx0LZmPg95ME4z2K03UheiZbroyXUjYyB3ReoMqobzDVPzyx6IS8kj2Uu-11Xq_0JiTYxtDatuqXRNIAmJT8gMJmbSyOLOP_vnDvbeMUiBsqCRrkTGVbWSwYSc8sTVVE-535kYdqQOgNjH1ffCoZLGl8YYxLnpb2CXJlRQPrcjkA&state=6789
권한 부여 실패 시 앱은 GET 요청을 수신하고, error , error_description 및 2>state2> (해당경우) 매개 변수를 포함한 지정된 리디렉션 URL로 리디렉션합니다.
- Error 매개 변수는 인증 과정 동안 발생한 특정 OAuth 2.0 오류를 나타냅니다.
- Error_description 매개 변수는 오류에 대한 추가 세부 정보를 제공합니다.
- state 매개 변수는 응용 프로그램이 장애 조치(failover) 상태를 유지하도록 도와줍니다.
권한 코드를 액세스 토큰으로 교환
권한 code 을 분석한 후 토큰으로 액세스 하려는 Roblox 리소스에 액세스:
액세스 토큰을 요청하고 토큰 교환 엔드포인트에 액세스 토큰을 새로 고칠 수 있도록 POST 요청을 보내십시오. 요청에는 권한 코드, 클라이언트 ID 및 코드 검증 값(PKCE) 또는 클라이언트 비밀(PKCE)이 포함되어 있어야 합니다. 이 코드는 x-www
응답에서 적용할 토큰을 검색합니다. 액세스 토큰은 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 요청의 헤더에 액세스 토큰을 포함하여 권한을 부여하십시오.
예를 들어, 전체 권한 흐름을 통과한 다음 GET 요청을 사용자 정보 엔드포인트에 액세스 토큰으로 만드세요. openid 또는 2>openid2> 및 5>프로필5> 범위
사용자 정보 응답 예시
{
"sub": "12345678",
"name": "Jane Doe",
"nickname": "robloxjanedoe",
"preferred_username": "robloxjanedoe",
"created_at": 1607354232,
"profile": "https://www.roblox.com/users/12345678/profile"
}