我尝试使用 Auth0 作为 Open ID Connect 提供程序来通过 Oracle APEX 进行身份验证。通过设置身份验证方案,我可以使用 Auth0 登录,并且 APEX 可以像
#sub#
一样获得 auth0|66042494aef3827a64c1f9e5
,所以至少部分成功了。
问题是 Auth0 会使用类似
https://(myapexsite)/ords/apex_authentication.callback?code=(something)&state=(something)
的 URL 重定向到 APEX(我认为这是 OpenID Connect / OAuth2 的标准)。我需要使用 code
参数的值来与 Auth0 服务器进一步通信。但是,我不确定如何获取 APEX 中的值。它是否自动存储在某个地方?或者我应该编写自己的回调过程而不是使用标准回调过程?
APEX APEX_AUTHENTICATION.CALLBACK 的文档对此只字未提
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')
.将此标记为已回答(我自己)。