<?php
/**
 * Вход через Roblox - старт. Живёт на mp.ru.net, потому что адрес возврата
 * зарегистрирован тут же.
 *
 * Секрета приложения на этом хостинге нет и быть не должно: он лежит на
 * rublex.su, туда же уходит одноразовый код на обмен (roblox_cb.php).
 */
$CLIENT_ID = '4386849472223867013';
$REDIRECT  = 'https://mp.ru.net/roblox_cb';

// PKCE: без него перехваченный код можно было бы обменять со стороны.
$verifier  = rtrim(strtr(base64_encode(random_bytes(48)), '+/', '-_'), '=');
$challenge = rtrim(strtr(base64_encode(hash('sha256', $verifier, true)), '+/', '-_'), '=');
$state     = bin2hex(random_bytes(16));

setcookie('rbx_state', json_encode(['s' => $state, 'v' => $verifier]), [
    'expires'  => time() + 900,
    'path'     => '/',
    'httponly' => true,
    'samesite' => 'Lax',   // возврат от Roblox - обычный переход по ссылке
    'secure'   => true,
]);

header('Location: https://apis.roblox.com/oauth/v1/authorize?' . http_build_query([
    'client_id'             => $CLIENT_ID,
    'redirect_uri'          => $REDIRECT,
    'scope'                 => 'openid profile',
    'response_type'         => 'code',
    'state'                 => $state,
    'code_challenge'        => $challenge,
    'code_challenge_method' => 'S256',
]));
