我正在尝试用Python向GCP进行身份验证,以便调用云函数。
我已经设置了一个具有以下角色的服务帐户![在此处输入图像描述](https://i.sstatic.net/vvyDmTo7.png)
并为其创建了一个JSON键。从“云函数”窗格中双击,我可以看到它的权限是正确的(也尝试给Admin)![在此处输入图像描述](https://i.sstatic.net/nSb5LqPN.png)
然而,身份验证似乎总是成功的
从google.oauth2导入service_account导入google.auth.transport.requestskey_path=“路径/to/key.json”scopes=['https://www.googleapis.com/auth/cloud-platform网站']credentials=服务帐户。凭证.from_service_account_file(key_path,scopes=范围)auth_request=谷歌.auth.transport.requests。请求()凭据刷新(auth_request)打印(凭证令牌)#Bearer xxxxx
但后来,无记名令牌似乎没有授予我访问API的权限,因为我得到了错误401
承载错误=“invalid_token”error_description=“无法验证访问令牌”
我多次尝试重新生成JSON密钥。这个函数本身工作得很好,因为我测试了它的公共版本,它工作得很顺利。
编辑
我还尝试使用以下代码按照文档创建JWT。仍然未能授权,从未失败过身份验证
导入json导入日期时间进口jwt导入请求#加载服务帐户密钥文件key_file_path=“路径/to/key.json”open(key_file_path)为f:service_account_info=json.load(f)#从服务帐户信息中提取必要的信息private_key=service_account_info['专用密钥']client_email=service_account_info['客户端电子邮件']#定义JWT标头和有效负载标题={“alg”:“RS256”,“典型”:“JWT”,“kid”:service_account_info['private_key_id']}now=datetime.datetime.utcnow()expiry=now+datetime.timedelta(小时=1)有效载荷={“iss”:客户端电子邮件,“sub”:客户端电子邮件,“aud”:“https://www.googleapis.com/oauth2/v4/token",“iat”:现在,“exp”:到期,“范围”:“https://www.googleapis.com/auth/cloud-platform网站"}#生成JWTjwt_token=jwt.encode(有效载荷,私有密钥,算法=“RS256”,头=头)#定义获取Google-signed ID令牌的请求token_url=“https://www.googleapis.com/oauth2/v4/token"标题={“内容类型”:“应用程序/x-www-form-urlencoded”}主体={“grant_type”:“urn:ietf:params:oauth:grant-type:jwt-bearer”,“断言”:jwt_token}#请求获取ID令牌response=requests.post(token_url,headers=headers,data=body)#打印响应(包含ID标记)如果response.status_code==200:id_token=“bearer”+response.json().get('access_token')print(“ID令牌:”,ID_Token)其他:print(“错误:”,response.json())