如何实现从工时表网站到Oracle APEX的单点登录(SSO)自动登录?
跨应用SSO到Oracle APEX的解决方案
1. 安全传输用户会话的方法
绝对不要直接传递用户明文凭证,最安全高效的方式是使用加密签名令牌(比如JWT)或者标准化SSO协议(SAML/OAuth2):
- 令牌生成:工时表应用在用户已认证的前提下,生成包含用户唯一标识、过期时间的加密签名令牌(用双方共享密钥或非对称密钥签名)。
- 传输方式:通过HTTPS重定向将令牌作为查询参数(或POST参数)传递到APEX的自定义认证端点,全程加密避免明文泄露。
- 安全校验:APEX端接收令牌后,必须验证签名有效性、过期时间、用户合法性,额外可校验请求来源(比如限制referer或IP范围)。
2. 适合的APEX认证方案及配置步骤
方案一:自定义认证方案(最灵活,适配自定义SSO场景)
- 在APEX工作区创建新认证方案,类型选择「自定义」。
- 设置「认证过程」为PL/SQL函数,核心逻辑包括:
- 接收传入的令牌参数
- 解析令牌并验证签名、过期时间
- 检查用户是否存在于APEX工作区
- 验证通过返回用户ID,否则返回NULL
- 配置「登录URL」为APEX内的自定义认证端点(比如专门处理令牌校验的页面)。
- 开启「会话保护」和「强制HTTPS」,防止会话劫持。
方案二:OAuth2.0 客户端认证(适合工时表作为OAuth服务端的场景)
- 在APEX中创建OAuth2客户端,配置工时表应用作为授权服务器的信息(授权URL、令牌URL、客户端ID/密钥)。
- 创建新认证方案,类型选择「OAuth2.0」,关联刚才创建的客户端。
- 设置用户映射规则,将OAuth返回的用户标识映射到APEX工作区用户。
- 配置APEX应用登录流程自动跳转至OAuth授权页面。
方案三:SAML 2.0 认证(适合企业级统一身份管理场景)
- 在APEX中创建SAML认证方案,作为服务提供商(SP)。
- 导入工时表应用作为身份提供商(IdP)的元数据文件,配置断言消费者URL(ACS)。
- 设置SAML响应的签名验证规则,确保断言来自可信IdP。
- 配置用户属性映射,将SAML断言中的用户信息关联到APEX用户。
3. 示例实现与参考方向
自定义认证的PL/SQL示例(简化版JWT验证)
FUNCTION validate_sso_token(p_token IN VARCHAR2) RETURN VARCHAR2 IS l_jwt_payload JSON; l_user_name VARCHAR2(100); l_expiry_timestamp NUMBER; l_shared_key VARCHAR2(256) := '共享密钥'; -- 与工时表应用保持一致 BEGIN -- 解析JWT令牌 l_jwt_payload := JSON(apex_web_service.parse_jwt(p_token)); l_user_name := l_jwt_payload.get_string('sub'); l_expiry_timestamp := l_jwt_payload.get_number('exp'); -- 验证令牌未过期 IF l_expiry_timestamp < EXTRACT(EPOCH FROM SYSDATE) THEN RETURN NULL; END IF; -- 验证JWT签名(HMAC-SHA256算法) IF NOT apex_web_service.verify_jwt_signature( p_jwt => p_token, p_algorithm => 'HS256', p_secret => l_shared_key ) THEN RETURN NULL; END IF; -- 验证用户在APEX工作区存在 IF EXISTS (SELECT 1 FROM apex_workspace_users WHERE user_name = l_user_name) THEN RETURN l_user_name; ELSE RETURN NULL; END IF; END validate_sso_token;
参考文档方向
- Oracle APEX官方文档中「自定义认证方案」章节,详细说明了PL/SQL函数要求和配置步骤。
- APEX官方教程中关于OAuth2和SAML认证的配置指南,包含步骤式操作说明。
- Oracle社区论坛中的实战案例,可参考跨应用SSO的令牌实现细节。
内容的提问来源于stack exchange,提问作者Medam Anji Reddy
相关产品推荐
相关产品推荐

