You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Okta SAML 2FA通过Python SQLAlchemy连接Redshift

使用Okta MFA + SQLAlchemy连接Redshift并加载数据到Pandas

前置依赖安装

先安装必要的Python包:

pip install redshift_connector sqlalchemy-redshift pandas beautifulsoup4 pyotp

完整代码实现

import redshift_connector
from sqlalchemy import create_engine
import pandas as pd
import requests
from bs4 import BeautifulSoup
import pyotp

# -------------------------- 配置参数 --------------------------
OKTA_DOMAIN = "your-okta-domain.okta.com"
OKTA_APP_ID = "your-okta-app-id"  # Redshift在Okta中的应用ID,可从Okta应用页面URL提取
USERNAME = "your-okta-username"
PASSWORD = "your-okta-password"
TOTP_SECRET = "your-totp-secret"  # Okta账号MFA设置中获取的TOTP密钥
REDSHIFT_HOST = "your-redshift-cluster-url.redshift.amazonaws.com"
REDSHIFT_PORT = 5439
REDSHIFT_DB = "your-database-name"
REDSHIFT_SCHEMA = "your-schema-name"
# -------------------------------------------------------------

def get_okta_saml_assertion():
    # 初始化会话,访问Okta应用登录页
    session = requests.Session()
    login_url = f"https://{OKTA_DOMAIN}/app/{OKTA_APP_ID}/sso/saml"
    response = session.get(login_url)
    soup = BeautifulSoup(response.content, "html.parser")
    
    # 提取登录表单的提交地址和隐藏参数
    form = soup.find("form")
    form_action = form.get("action")
    payload = {input_tag.get("name"): input_tag.get("value") for input_tag in form.find_all("input")}
    
    # 提交账号密码
    payload["username"] = USERNAME
    payload["password"] = PASSWORD
    response = session.post(form_action, data=payload)
    soup = BeautifulSoup(response.content, "html.parser")
    
    # 处理TOTP类型的MFA验证
    mfa_form = soup.find("form", id="mfa-form")
    if mfa_form:
        totp = pyotp.TOTP(TOTP_SECRET)
        current_code = totp.now()
        mfa_payload = {
            input_tag.get("name"): input_tag.get("value") 
            for input_tag in mfa_form.find_all("input") 
            if input_tag.get("name") is not None
        }
        mfa_payload["answer"] = current_code
        mfa_action = mfa_form.get("action")
        response = session.post(mfa_action, data=mfa_payload)
        soup = BeautifulSoup(response.content, "html.parser")
    
    # 提取SAML断言
    saml_response = soup.find("input", {"name": "SAMLResponse"})
    if not saml_response:
        raise Exception("从Okta获取SAML响应失败")
    return saml_response.get("value")

# 获取SAML断言
saml_assertion = get_okta_saml_assertion()

# 建立Redshift连接
conn = redshift_connector.connect(
    host=REDSHIFT_HOST,
    port=REDSHIFT_PORT,
    database=REDSHIFT_DB,
    user=USERNAME,
    password=saml_assertion,
    auth="saml",
    ssl=True
)

# 适配SQLAlchemy引擎
engine = create_engine(
    f'redshift+redshift_connector://{USERNAME}:{saml_assertion}@{REDSHIFT_HOST}:{REDSHIFT_PORT}/{REDSHIFT_DB}?auth=saml'
)

# 加载数据到Pandas DataFrame
query = f"SELECT * FROM {REDSHIFT_SCHEMA}.your_table LIMIT 100"
df = pd.read_sql(query, engine)

# 验证结果
print(df.head())

# 清理连接资源
conn.close()
engine.dispose()

关键说明

  • Okta参数获取:OKTA_APP_ID可从Okta应用的URL中提取(例如URL为https://xxx.okta.com/app/redshift_xxxx/xxxx,中间的redshift_xxxx即为APP_ID)。
  • MFA适配:示例采用TOTP验证,若使用短信等其他MFA方式,需修改MFA部分的表单处理逻辑,对应适配Okta的验证页面结构。
  • 安全提示:禁止硬编码敏感信息,建议通过环境变量或密钥管理工具(如AWS Secrets Manager)存储账号、密码及TOTP密钥。

内容的提问来源于stack exchange,提问作者Gabe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:05:35