Open Cloud soporta el flujo de autorización OAuth 2.0 con y sin PKCE, dependiendo de si sus clientes son confidenciales o públicos.
- Clientes confidenciales son aplicaciones que son capaces de mantener las credenciales confidenciales, como un sitio web que puede almacenar y recuperar secretos de forma segura en su infraestructura de back-end.
- Los clientes públicos son aplicaciones que no pueden guardar secretos, como aplicaciones de móvil y navegador web.
Recomendamos el flujo de autorización de OAuth 2.0 con PKCE para todos los clientes todos y requerirlo para los clientes públicos.
Para implementar el flujo de código de autorización, tu aplicación realiza los siguientes pasos:
- Genera un verificador de código y un desafío de código (solo PKCE). Esto te permite incluir un desafío en tus solicitudes en lugar de la clave del cliente, lo que mejora la seguridad.
- Envía una solicitud de GET al punto de autorización con los parámetros apropiados.
- Manipula el retorno de llamada de autorización. Después de obtener la autorización, usa el código de autorización de Roblox en una solicitud de redirección a la URL que especificaste durante la creacionesde la aplicación. Para usar el código de autorización más tarde, procesa el código de autorización.
- Envía una solicitud de POST a la dirección de token con el código de autorización. Si tiene éxito, recibirá acceso y actualizará fichas de actualización con las que se pueden realizar llamadas de API.
- Llamar a cualquier API de Open Cloud que soporte la autentificación de OAuth 2.0 según la documentación de referencia para las que quieres acceso.
Las siguientes secciones describen cada paso con más detalle.
Generando un Desafío de Código (solo para PKCE)
Antes de iniciar el proceso de autorización, debe generar un desafío de código desde un verificador de códigos. Puede usar bibliotecas o funciones integradas en el lenguaje de programación de su elección para crear el verificador de códigos, calcular el hashr y realizar el enlace Base64 para generar el desafío de código.
Al crear el verificador de código, solo use caracteres no restringidos, incluidos mayúsculas y minúsculas (A-Z, a-z), decenas (0-9), signos de interrogación (-), puntos (.) , subrayado ( _ ) y guiones ( ~ ) con una longitud mínima de 43 caracteres y una longitud máxima de 128 caracteres.
El siguiente ejemplo muestra cómo usar Javascript para crear un verificador de códigos y generar el desafío de código usando el algoritmo de enlace 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));
Para PKCE, necesitas tanto el verificador de código como los valores de desafío en los pasos posteriores.
Construyendo la URL de autorización
Para iniciar el proceso de autorización del usuario, construye una URL de autorización con los parámetros requeridos:
- client_id : El ID del client de tu aplicación (app)obtenido después de registrar tu aplicación .
- redirect_uri : La URL de redirección de tu aplicación (app), el punto de reingreso de tu aplicación (app).
- scope : Los escenarios solicitados que definen las autorizaciones de acceso que necesita tu aplicación en una lista separada por espacio.
- response_type : Establece el valor en code para indicar el flujo de código de autorización. Requerido solo para PKCE
- code_challenge : El desafío de código generado por un verificador de códigos.
- code_challenge_method : Establece este valor de parámetro a S256 para indicar que el desafío de código se transformó en el método de desafío de código más ampliamente adoptado y seguro.
- state : Un valor aleatorio y seguro opaco para mantener el estado entre la solicitud y el devolución de llamada. Requerido solo para no-PKCE
- client_secret : Tu secreto de cliente de aplicación (app)obtenido después de registrar tu aplicación . Si estás usando autentificación con PKCE, omita este parámetro. Tu solicitud de autorización debe tener una buena forma, como en el siguiente ejemplo:
Ejemplo de URL de autorización 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
Cuando los usuarios visitan la URL, se los llevará a través del flujo de autorización. Si es exitoso, Roblox redirige al usuario al redirect_uri especificado.
Manipulación de autorización
Cuando un flujo de autorización tenga éxito, tu app recibe una solicitud de GET de Roblox en el redirect_uri que especificaste. En la solicitud, recibes code (código de autorización) y 2> state2> (si proporcionaste un valor anteriormente).
El parámetro code contiene un código de autorización que la aplicación puede intercambiar por un token de acceso desde el servidor de autorización. La mayoría de los lenguajes de servidor tienen formas estándar para acceder a los parámetros de consulta como objetos descompuestos. Necesitarás obtener el parámetro code y usarlo para intercambiar por tokens de acceso.
El parámetro state es un valor opaco que proporcionaste inicialmente en la solicitud de autorización. Puedes usar este parámetro para mantener el estado o contexto del proceso de autorización.
Por ejemplo, puede recibir una solicitud de GET con la siguiente URL si especificó su URL de redirección para ser https://example.com/redirect .
Ejemplo de URL de redirección
https://example.com/redirect?code=10c45PNuquKnFJ6pUcy5-fHkghEM6lSegm-7hj9mVEprub1dSDuStuKK_EAUXY7AHTD63xcnmvxSLthp-C8g3jzIGZVzuXSd20Y2dEYI9hx0LZmPg95ME4z2K03UheiZbroyXUjYyB3ReoMqobzDVPzyx6IS8kj2Uu-11Xq_0JiTYxtDatuqXRNIAmJT8gMJmbSyOLOP_vnDvbeMUiBsqCRrkTGVbWSwYSc8sTVVE-535kYdqQOgNjH1ffCoZLGl8YYxLnpb2CXJlRQPrcjkA&state=6789
Si la autorización falla, tu aplicación recibe una solicitud de GET a la URL de redirección especificada con el error , error_description y 2>state2> (si es aplicable) parámetros.
- El parámetro error indica el error específico de OAuth 2.0 que ocurrió durante el proceso de autorización.
- El parámetro error_description proporciona detalles adicionales del error.
- El parámetro state ayuda a tu aplicación a mantener el estado en caso de un fallo.
Intercambiando un código de autorización para obtener fichas de acceso
Cuando hayas procesado la autorización code, intercambia por fichas para acceder a los recursos deseados de Roblox:
Solicite un token de acceso y actualice un token enviando una solicitud POST a la interfaz de intercambio de tokens . La solicitud debe incluir el código de autorización, el ID del cliente y el valor del verificador de código (PKCE) o del cliente secreto (no-PKCE) en x-www-form-urlencoded forma.
Parse los tokens aplicables de la respuesta recibida. El token de acceso es válido durante 15 minutos. Almacene el token de actualización con seguridad, generalmente en el lado del servidor, para que pueda usarlo para obtener nuevos tokens en el futuro.
Respuesta de Token Endpoint{"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"}
Hacer una llamada a un método de recursos
Ahora que tienes la llave de acceso requerida, puedes usarla para hacer llamadas autenticadas a los métodos de recursos. Incluye la llave de acceso en el encabezado de todas las solicitudes de API para autorizarlas.
Por ejemplo, puede probar si su aplicación funciona correctamente al pasar por todo el flujo de autorización y luego hacer una solicitud de GET a la información del usuario con un token de acceso. Asegúrese de tener el openid o ambos los 2>openid2> y 5> perfil5> escenarios antes de llamar
Respuesta de información del usuario de ejemplo
{
"sub": "12345678",
"name": "Jane Doe",
"nickname": "robloxjanedoe",
"preferred_username": "robloxjanedoe",
"created_at": 1607354232,
"profile": "https://www.roblox.com/users/12345678/profile"
}