Я пытаюсь использовать Auth0 в качестве поставщика Open ID Connect для аутентификации с помощью Oracle APEX. Настроив схему аутентификации, я смог войти в систему с использованием Auth0, а APEX может получить #sub#
лайк auth0|66042494aef3827a64c1f9e5
, так что, по крайней мере, это частично удалось.
Проблема в том, что Auth0 будет перенаправляться на APEX с URL-адресом типа https://(myapexsite)/ords/apex_authentication.callback?code=(something)&state=(something)
(я думаю, это стандартно для OpenID Connect/OAuth2). Мне нужно использовать значение параметра code
для дальнейшей связи с сервером Auth0. Однако я не уверен, как получить значение в APEX. Он где-то автоматически сохраняется? Или я должен написать свою собственную процедуру обратного вызова вместо стандартной?
В документации APEX APEX_AUTHENTICATION.CALLBACK об этом ничего не сказано.
Отвечая на мой вопрос. Подводя итог, code
бесполезен. Oracle уже использовал и сделал результат доступным в процедуре пост-аутентификации, например, apex_json.get_clob('access_token')
.
Длинный ответ:
Вся строка запроса (т. е. code=(something)&state=(something)
в приведенном выше примере) доступна в процедуре пост-аутентификации как owa_util.get_cgi_env('QUERY_STRING')
. Чтобы извлечь с помощью процедур манипуляции со строками:
procedure post_authentication
is
q_string varchar2(1000);
start_pos number;
end_pos number;
BEGIN
...
q_string := owa_util.get_cgi_env('QUERY_STRING');
start_pos := instr(q_string, 'code=');
end_pos := instr(q_string, '&', start_pos + 1);
if end_pos <= 0 then
end_pos := length(q_string) + 1;
end if;
:G_AUTH0_CODE := substr(q_string, start_pos + length('code='), end_pos - length('code=') - 1);
...
end;
Здесь наступает ключевой момент: APEX уже использовал код (который является одноразовым). В результате извлеченный код бесполезен. Целью кода является получение токена доступа (помимо прочего), и APEX сделал его доступным в процедуре пост-аутентификации как apex_json.get_clob('access_token')
или apex_json.get_clob('id_token')
. Говорят, что APEX отказался от refresh_token
(по крайней мере, до APEX 23.1).
Отмечаю это как ответ (сам).