이 문서는 OAuth 2.0 권한 부여 코드 흐름을 구현하기 위해 호출하는 엔드포인트와 앱에서 인증을 구현하는 데 유용한 다른 엔드포인트를 설명합니다.
기본 URLhttps://apis.roblox.com/oauth
엔드포인트GET v1/authorizePOST v1/tokenPOST v1/token/introspectPOST v1/token/resourcesPOST v1/token/revokeGET v1/userinfoGET .well-known/openid-configuration
권한 부여
GET v1/authorize
사용자로부터 인증을 받을 수 있도록 권한을 얻습니다. 지정된 매개변수로 구성된 유효한 권한 부여 URL을 기대합니다. 이 엔드포인트는 PKCE 권한 부여를 지원합니다.
쿼리 매개변수
| 이름 | 설명 | 필수 | 예시 |
|---|---|---|---|
| client_id | 앱의 클라이언트 ID입니다. | 예 | 816547628409595165403873012 |
| redirect_uri | 사용자들이 권한 부여 흐름을 완료한 후 다시 리디렉션되는 URL입니다. | 예 | `https://www.roblox.com/example-redirect`` |
| scope | 요청된 범위로, 공백으로 구분됩니다. openid 범위를 사용하여 ID 토큰을 받을 수 있습니다. openid 및 profile 범위를 사용하여 더 많은 사용자 정보를 얻을 수 있습니다. | 예 | openid profile |
| response_type | 앱이 반환되길 원하는 자격 증명입니다. 기본값은 권한 부여 코드 부여 유형입니다. | 예 | none, code |
| prompt | 사용자에게 표시되는 인증 및 동의 페이지를 지정합니다. 특정 화면은 제3자 앱에 대해 필수이며 건너뛸 수 없습니다. | 아니오 | none, login, consent, select_account |
| nonce | 토큰을 클라이언트와 바인딩하는 암호화된 숫자입니다. | 아니오 | <random_value_1> |
| state | 사이트 간 요청 위조를 방지하는 불투명한 값이며, 권한 부여 후 앱에 다시 전달됩니다. | 아니오 | <app-provided-opaque-value> |
| code_challenge | code_verifier에 code_challenge_method를 적용한 결과 문자열입니다. | 아니오 | Base64-URL-인코딩 문자열 |
| code_challenge_method | code_verifier에 적용되는 함수입니다. | 아니오 | S256 |
요청
권한 부여 흐름으로의 요청 예제https://apis.roblox.com/oauth/v1/authorize?client_id=816547628409595165403873012&redirect_uri=https://my-app.com/redirect&scope=openid&response_type=code&nonce=12345&state=6789
응답
이 엔드포인트를 호출한 후 사용자는 code 쿼리 매개변수에 권한 부여 코드와 함께 지정된 리디렉션 URL로 리디렉션됩니다. 권한 부여 코드는 다음과 같습니다:
- 유효 기간이 1분입니다.
- 한 번만 사용할 수 있습니다.
- 사용 후에는 무효입니다.
토큰 교환
API에 접근하기 위한 토큰을 얻으려면 권한 부여 코드를 비밀 토큰 세트로 교환하십시오. 모든 토큰 엔드포인트는 두 가지 유형의 클라이언트 인증을 지원합니다:
- 권한 부여 헤더가 포함된 HTTP 기본 인증 스킴: Authorization: Basic Base64 인코딩(<client_id>:<client_secret>).
- 요청 본문에 매개변수로 포함된 클라이언트 ID 및 비밀.
다음 목록은 이 엔드포인트에서 수신하는 다양한 토큰을 설명합니다.
액세스 토큰 - 제3자 앱이 보호된 Roblox 리소스에 접근하기 위한 크리에이터 또는 사용자로부터의 권한을 나타냅니다. 특정_scope_, 수명 및 기타 접근 속성을 나타내는 문자열입니다. Roblox 권한 부여 서버가 앱에 액세스 토큰을 발급하면, 토큰은:
- 15분 동안 유효합니다.
- 만료되기 전에 여러 번 사용할 수 있습니다.
- 앱 사용자가 권한을 철회하면 만료되기 전에 무효화될 수 있습니다.
리프레시 토큰 - 권한 부여 세션을 갱신합니다. 앱은 리프레시 토큰을 사용하여 액세스 토큰, 리프레시 토큰 및 ID 토큰을 포함하는 새 토큰 세트를 얻을 수 있습니다. 리프레시 토큰은:
- 90일 동안 유효합니다.
- 만료되기 전에 토큰을 리프레시하는 데 단 한 번만 사용할 수 있습니다.
- 앱 사용자가 권한을 철회하면 만료되기 전에 무효화될 수 있습니다.
ID 토큰 - 사용자의 신원이 인증되었다는 증명을 제공합니다. 내용은 요청된 범위에 따라 달라지며, 사용자 정보를 포함할 수 있습니다. 사용자의 Roblox 표시 이름 및 사용자 이름을 포함합니다. ID 토큰은 신원 인증 목적을 위해서만 사용되며, 어떤 Roblox 리소스에 대한 접근을 제공하지 않습니다.
POST v1/token
권한 부여 코드를 사용하여 토큰 세트를 얻습니다.
요청
(x-www-form-urlencoded)
| 키 | 값 |
|---|---|
| code | <authorization code> |
| code_verifier | <pkce code verifier value> |
| grant_type | authorization_code |
| client_id | <client_id> |
| client_secret | <client_secret> |
토큰 요청 예시curl --location --request POST 'https://apis.roblox.com/oauth/v1/token' \--header 'Content-Type: application/x-www-form-urlencoded' \--data-urlencode 'client_id=840974200211308101' \--data-urlencode 'client_secret=RBX-CR9...St12L' \--data-urlencode 'grant_type=authorization_code' \--data-urlencode 'code=yCnq4ofX1...XmGpdx'
응답
토큰 요청 응답 예시
{
"access_token": "...",
"refresh_token": "...",
"token_type": "Bearer",
"expires_in": 899,
"scope": "universe-messaging-service:publish"
}
POST v1/token
리프레시 토큰을 사용하여 토큰 세트를 얻습니다.
요청
(x-www-form-urlencoded)
| 키 | 값 |
|---|---|
| grant_type | refresh_token |
| refresh_token | <refresh_token> |
| client_id | <client_id> |
| client_secret | <client_secret> |
리프레시 토큰 요청 예시curl --location --request POST 'https://apis.roblox.com/oauth/v1/token' \--header 'Content-Type: application/x-www-form-urlencoded' \--data-urlencode 'grant_type=refresh_token' \--data-urlencode 'refresh_token=Ujfstayclfdlbm...BGydlsnU' \--data-urlencode 'client_id=840974200211308101' \--data-urlencode 'client_secret=RBX-CR9...St12L'
응답
리프레시 토큰 요청 응답 예시
{
"access_token": "...",
"refresh_token": "...",
"token_type": "Bearer",
"expires_in": 899,
"scope": "universe-messaging-service:publish"
}
POST v1/token/introspect
토큰에 대한 정보를 수신합니다. 토큰이 현재 유효하며 아직 만료되지 않았는지 확인합니다. 무상태 유효성을 검증하는 데 유용합니다. 접근하려는 API가 자원을 요구하지 않거나(예: 자산 API), 토큰의 특정 클레임을 보고 싶을 때만 사용합니다.
요청
(x-www-form-urlencoded)
| 키 | 값 |
|---|---|
| token | <access_token>, <refresh_token> 또는 <id_token> |
| client_id | <client_id> |
| client_secret | <client_secret> |
토큰 검사 요청 예시curl --location --request POST 'https://apis.roblox.com/oauth/v1/token/introspect' \--header 'Content-Type: application/x-www-form-urlencoded' \--data-urlencode 'token=eyjlflabtfl...4gxqYBG' \--data-urlencode 'client_id=840974200211308101' \--data-urlencode 'client_secret=RBX-CR9...St12L'
응답
토큰 검사 요청 응답 예시
{
"active": true,
"jti": "RT.2GcjvTduKzk6QY9tjTfm",
"iss": "https://apis.roblox.com/oauth/",
"token_type": "Bearer",
"client_id": "840974200211308101",
"aud": "4239311013248676173",
"sub": "1516563360",
"scope": "universe-messaging-service:publish",
"exp": 1676394509,
"iat": 1660842510
}
POST v1/token/resources
특정 자원에 접근할 수 있는지 확인하기 위해 사용자가 허가한 사용자 자원의 목록을 얻습니다. 이는 상태 기반 유효성 검증에 유용합니다.
요청
(x-www-form-urlencoded)
| 키 | 값 |
|---|---|
| token | <access_token> |
| client_id | <client_id> |
| client_secret | <client_secret> |
토큰 자원 요청 예시curl --location --request POST 'https://apis.roblox.com/oauth/v1/token/resources' \--header 'Content-Type: application/x-www-form-urlencoded' \--data-urlencode 'token=eyjlflabtfl...4gxqYBG' \--data-urlencode 'client_id=840974200211308101' \--data-urlencode 'client_secret=RBX-CR9...St12L'
응답
ids의 값 U는 범위가 권한 부여한 owner의 자원에 대한 접근 권한을 부여했다는 것을 의미합니다.
토큰 자원 요청 응답 예시
{
"resource_infos": [
{
"owner": {
"id": "1516563360",
"type": "User"
},
"resources": {
"universe": {
"ids": ["3828411582"]
},
"creator": {
"ids": ["U"]
}
}
}
]
}
POST v1/token/revoke
제공된 리프레시 토큰을 사용하여 권한 부여 세션을 철회합니다.
요청
(x-www-form-urlencoded)
| 키 | 값 |
|---|---|
| token | <refresh_token> |
| client_id | <client_id> |
| client_secret | <client_secret> |
토큰 철회 요청 예시curl --location --request POST 'https://apis.roblox.com/oauth/v1/token/revoke' \--header 'Content-Type: application/x-www-form-urlencoded' \--data-urlencode 'token=Ujfstayclfdlbm...BGydlsnU' \--data-urlencode 'client_id=840974200211308101' \--data-urlencode 'client_secret=RBX-CR9...St12L'
응답
200 OK와 빈 응답
사용자 정보
GET /v1/userinfo
Roblox 사용자 ID 및 기타 사용자 메타데이터를 가져옵니다.
요청
권한 부여 헤더: Authorization: Bearer <access_token>
사용자 정보 요청 예시curl --location --request GET 'https://apis.roblox.com/oauth/v1/userinfo' \--header 'Authorization: Bearer eyjlflabtfl...4gxqYBG'
응답
sub 값을 사용하여 사용자를 고유하게 식별할 수 있습니다. 사용자는 자신의 Roblox 사용자 이름과 표시 이름을 변경할 수 있으므로, 앱에서 사용자를 참조할 때 이들을 고유 식별자로 사용하지 마십시오.
| 클레임 | 설명 |
|---|---|
| sub | Roblox 사용자 ID입니다. |
| name | Roblox 표시 이름입니다. |
| nickname | Roblox 표시 이름입니다. |
| preferred_username | Roblox 사용자 이름입니다. |
| created_at | Roblox 계정 생성 시간(Unix 타임스탬프)입니다. |
| profile | Roblox 계정 프로필 URL입니다. |
| picture | Roblox 아바타 헤드샷 이미지입니다. 아바타 헤드샷 이미지가 생성되지 않았거나 검열된 경우 null일 수 있습니다. |
프로필 범위가 있는 사용자 예시
{
"sub": "1516563360",
"name": "exampleuser",
"nickname": "exampleuser",
"preferred_username": "exampleuser",
"created_at": 1584682495,
"profile": "https://www.roblox.com/users/1516563360/profile",
"picture": "https://tr.rbxcdn.com/03dc2a9abe7b1aacaaf93ea46d5c0646/150/150/AvatarHeadshot/Png"
}
프로필 범위가 없는 사용자 예시
{
"sub": "1516563360"
}
디스커버리
OpenID Connect (OIDC) 디스커버리 문서는 Open Cloud 구성 세부 정보에 대한 메타데이터가 포함된 JSON 문서입니다. 여기에는 지원되는 인증 관련 범위 및 클레임 목록이 포함되어 있습니다. 이를 통해 Open Cloud OAuth 2.0 엔드포인트와 권한 부여 엔드포인트, 토큰 엔드포인트 및 공개 키 세트와 같은 정보를 동적으로 발견할 수 있습니다.
디스커버리 문서를 디스커버리 문서 URI에서 검색하고 가져온 후, 응답의 필드를 수동으로 검사하여 정보를 확인하거나, 응답 스키마의 필드에 매핑되는 사용자 정의 라이브러리를 생성하여 작업 흐름을 자동화할 수 있습니다.
GET .well-known/openid-configuration
응답
모든 디스커버리 문서 응답은 다음 예시 응답과 동일한 스키마를 따릅니다.
디스커버리 문서 응답 예시
{
"issuer": "https://apis.roblox.com/oauth/",
"authorization_endpoint": "https://apis.roblox.com/oauth/v1/authorize",
"token_endpoint": "https://apis.roblox.com/oauth/v1/token",
"introspection_endpoint": "https://apis.roblox.com/oauth/v1/token/introspect",
"revocation_endpoint": "https://apis.roblox.com/oauth/v1/token/revoke",
"resources_endpoint": "https://apis.roblox.com/oauth/v1/token/resources",
"userinfo_endpoint": "https://apis.roblox.com/oauth/v1/userinfo",
"jwks_uri": "https://apis.roblox.com/oauth/v1/certs",
"registration_endpoint": "https://create.roblox.com/dashboard/credentials",
"service_documentation": "https://create.roblox.com/docs/reference/cloud",
"scopes_supported": [
"openid",
"profile",
"email",
"verification",
"credentials",
"age",
"premium",
"roles"
],
"response_types_supported": ["none", "code"],
"subject_types_supported": ["public"],
"id_token_signing_alg_values_supported": ["ES256"],
"claims_supported": [
"sub",
"type",
"iss",
"aud",
"exp",
"iat",
"nonce",
"name",
"nickname",
"preferred_username",
"created_at",
"profile",
"email",
"email_verified",
"verified",
"age_bracket",
"premium",
"roles",
"internal_user"
],
"token_endpoint_auth_methods_supported": [
"client_secret_post",
"client_secret_basic"
]
}