部署在Azure的应用如何通过SAML认证使用SAP HANA Node.js客户端连接HANA数据库?
使用@sap/hana-client通过SAML认证连接HANA(部署在Azure非SAP环境)
一、HANA端前置配置
- 启用SAML认证:在HANA Cockpit或Studio中,修改
instance_config.ini的[authentication]节点,设置saml_enabled = true,确保数据库开启SAML身份验证支持。 - 注册Azure AD作为SAML身份提供商(IdP):
- 从Azure AD导出IdP元数据XML文件(包含公钥、实体ID等核心信息)。
- 在HANA中执行SQL注册该IdP:
CREATE SAML PROVIDER AZURE_AD_IDP WITH METADATA FROM '<Azure AD元数据XML文件路径或直接填入XML内容>' ACTIVE = TRUE; - 配置用户映射:将Azure AD用户与HANA数据库用户关联,示例SQL:
ALTER USER HANA_DB_USER SET SAML IDENTITY '<Azure AD用户的名称标识符>' FOR AZURE_AD_IDP;
二、Azure应用端获取SAML断言
通过Azure AD的Node.js SDK获取针对HANA的有效SAML断言:
- 在Azure AD中注册你的Node.js应用,配置企业应用SAML单点登录,指定HANA的受众URI(即HANA的SAML服务提供者实体ID)和断言消费者服务URL。
- 使用
@azure/msal-nodeSDK获取断言,核心逻辑是通过客户端凭证流获取目标为HANA的令牌:const { PublicClientApplication } = require('@azure/msal-node'); const msalConfig = { auth: { clientId: '你的Azure应用客户端ID', authority: 'https://login.microsoftonline.com/你的租户ID', clientSecret: '你的Azure应用客户端密钥' } }; const pca = new PublicClientApplication(msalConfig); async function getSamlAssertion() { const tokenRequest = { scopes: ['https://你的HANA实例域名/saml'], // 需与HANA配置的受众URI一致 }; const response = await pca.acquireTokenByClientCredential(tokenRequest); return response.idToken; // 此处返回的即为Base64编码的SAML断言 }
三、使用@sap/hana-client建立SAML连接
核心连接参数
serverNode:HANA数据库地址,格式为<主机名>:<加密端口>(生产环境推荐用443端口)authentication:固定设为samlsamlAssertion:填入从Azure AD获取的SAML断言字符串encrypt:设为true(生产环境强制加密)sslValidateCertificate:生产环境设为true,需确保HANA的SSL证书被Azure应用信任
完整连接代码示例
const hanaClient = require('@sap/hana-client'); const { PublicClientApplication } = require('@azure/msal-node'); // 初始化MSAL客户端 const msalConfig = { auth: { clientId: 'YOUR_AZURE_APP_CLIENT_ID', authority: 'https://login.microsoftonline.com/YOUR_TENANT_ID', clientSecret: 'YOUR_AZURE_APP_CLIENT_SECRET' } }; const pca = new PublicClientApplication(msalConfig); async function connectToHana() { try { // 获取SAML断言 const samlAssertion = await getSamlAssertion(); // 建立HANA连接 const conn = hanaClient.createConnection(); const connParams = { serverNode: 'YOUR_HANA_HOST:443', authentication: 'saml', samlAssertion: samlAssertion, encrypt: true, sslValidateCertificate: true }; conn.connect(connParams, (err) => { if (err) { console.error('连接失败:', err.message); return; } console.log('成功连接到HANA数据库'); // 测试查询 conn.exec('SELECT CURRENT_USER, CURRENT_TIMESTAMP FROM DUMMY', (err, result) => { if (err) { console.error('查询失败:', err.message); } else { console.log('查询结果:', result); } conn.disconnect(); }); }); } catch (err) { console.error('认证或连接异常:', err.message); } } // 封装获取断言的函数 async function getSamlAssertion() { const tokenRequest = { scopes: ['https://your-hana-instance.com/saml'], }; const response = await pca.acquireTokenByClientCredential(tokenRequest); return response.idToken; } connectToHana();
四、关键注意事项
- 网络连通性:确保Azure应用所在的虚拟网络能访问HANA数据库的端口,需在Azure网络安全组和HANA防火墙中配置相应的入站规则。
- 证书信任:启用
sslValidateCertificate后,需将HANA的SSL根证书导入Azure应用的信任存储,或通过sslCertificate参数指定证书路径。 - 断言有效性:HANA会验证SAML断言的签名、受众、过期时间,需确保Azure AD生成的断言参数与HANA配置完全匹配。
- 权限配置:Azure应用需拥有获取SAML断言的权限,HANA映射用户需具备相应的数据库操作权限。
内容的提问来源于stack exchange,提问作者Claus Harbach
相关产品推荐
相关产品推荐

