访问Cloud Composer API遇401未授权,如何设置access_type='offline'?
解决Composer Airflow DAG状态修改的401授权问题
问题分析
你遇到的401 unauthorised错误,若确认与access_type='online'相关,本质是当前凭据无法支持离线访问(即无法自动刷新过期令牌)。需要注意:access_type参数主要针对面向用户账号的OAuth 2.0授权码流程,服务账号的离线访问是通过密钥文件实现的,无需直接设置该参数。
解决方案
方法1:显式加载服务账号密钥文件
直接使用服务账号密钥文件创建凭据,确保具备完整的离线访问和令牌刷新能力,替换原代码的凭据获取逻辑:
from google.oauth2.service_account import Credentials from google.auth.transport.requests import AuthorizedSession statusObject = {"state": "failed"} AUTH_SCOPE = "https://www.googleapis.com/auth/cloud-platform" # 替换为你的服务账号密钥文件实际路径 SERVICE_ACCOUNT_KEY_PATH = "/path/to/your/service-account-key.json" # 创建支持离线访问的服务账号凭据 credentials = Credentials.from_service_account_file( SERVICE_ACCOUNT_KEY_PATH, scopes=[AUTH_SCOPE], ) authed_session = AuthorizedSession(credentials) headers = {'content-type': 'application/json', 'accept': 'application/json'} # 用f-string优化URL拼接,提升可读性 url = f"https://{{composer-name}}.composer.googleusercontent.com/api/v1/dags/{dag_run.conf['dag_id']}/dagRuns/{dag_run.conf['cancel_dag_id']}" response = authed_session.request("PATCH", url, json=statusObject, headers=headers)
方法2:检查默认凭据的权限与运行环境
如果代码运行在GCP内部环境(如Composer Worker节点、GCE实例),默认凭据应自动具备令牌刷新能力,此时401错误大概率是权限不足导致:
- 确认运行代码的服务账号已绑定
roles/composer.admin角色,或包含airflow.dagRuns.update权限的自定义角色 - 确保环境可正常访问GCP元数据服务(GCP内部环境默认支持)
补充说明
服务账号的凭据模型本身支持离线访问,通过密钥文件可随时生成新的访问令牌,无需依赖临时在线令牌。之前使用google.auth.default()获取的默认凭据,若运行环境权限受限,可能无法自动刷新令牌,从而触发401错误。显式使用密钥文件是最直接的解决方式。
内容的提问来源于stack exchange,提问作者Abhishek Singh
相关产品推荐
相关产品推荐

