Oracle Apex 24.1.0中通过OpenID Connect SSO后用PLSQL获取ID Token权限
实现方案
在Oracle Apex 24.1中,完全可以通过PL/SQL获取当前登录用户的ID Token并解析其中的权限信息,核心是利用Apex内置的Web凭据和JWT处理API。
步骤1:获取当前会话的ID Token
使用APEX_WEB_CREDENTIALS.GET_ID_TOKEN函数,传入你配置的Web凭据名称,即可获取当前登录用户的ID Token。如果用户未通过该凭据对应的认证方案登录,函数会返回NULL或抛出异常,建议添加异常处理。
DECLARE l_id_token VARCHAR2(32767); l_credential_name VARCHAR2(100) := '你的Web凭据名称'; -- 替换为实际的凭据名称 BEGIN -- 获取当前会话的ID Token l_id_token := APEX_WEB_CREDENTIALS.GET_ID_TOKEN( p_credential_name => l_credential_name ); IF l_id_token IS NULL THEN RAISE_APPLICATION_ERROR(-20001, '未获取到ID Token,请确认用户已通过对应认证方案登录'); END IF; DBMS_OUTPUT.PUT_LINE('ID Token: ' || l_id_token); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('获取ID Token失败: ' || SQLERRM); END; /
步骤2:解码ID Token并提取权限
ID Token是JWT格式,使用APEX_JWT.DECODE函数解析令牌,得到包含用户信息的JSON对象,再用APEX_JSON提取权限字段(假设权限字段名为permissions,根据你的实际Token结构替换)。
DECLARE l_id_token VARCHAR2(32767); l_credential_name VARCHAR2(100) := '你的Web凭据名称'; l_jwt_payload CLOB; l_permissions apex_t_varchar2; -- 存储权限列表 BEGIN -- 1. 获取ID Token l_id_token := APEX_WEB_CREDENTIALS.GET_ID_TOKEN( p_credential_name => l_credential_name ); IF l_id_token IS NULL THEN RAISE_APPLICATION_ERROR(-20001, '未获取到ID Token'); END IF; -- 2. 解码JWT的Payload部分 l_jwt_payload := APEX_JWT.DECODE( p_token => l_id_token, p_verify_signature => FALSE -- 如果不需要验证签名(仅解析内容),设为FALSE;若要验证需传入公钥 ); -- 3. 提取权限字段(假设权限是数组类型,字段名为permissions) apex_json.parse(l_jwt_payload); l_permissions := apex_json.get_t_varchar2(p_path => 'permissions'); -- 输出权限列表 DBMS_OUTPUT.PUT_LINE('用户权限:'); FOR i IN 1..l_permissions.COUNT LOOP DBMS_OUTPUT.PUT_LINE('- ' || l_permissions(i)); END LOOP; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('处理失败: ' || SQLERRM); END; /
注意事项
- 替换
你的Web凭据名称为你在工作区中配置的实际Web凭据名称。 - 如果需要验证JWT签名的合法性,将
p_verify_signature设为TRUE,并通过p_public_key参数传入第三方身份服务器的公钥。 - 权限字段的路径
p_path需要根据你的ID Token实际JSON结构调整,比如如果权限嵌套在claims.permissions下,就写claims.permissions。 - 确保执行代码的用户拥有
APEX_WEB_CREDENTIALS和APEX_JWT包的执行权限。
内容的提问来源于stack exchange,提问作者Sergey Shafiev
相关产品推荐
相关产品推荐

