云端点身份验证

问题描述 投票:0回答:3

我正在使用App Engine Standard和Python 2运行时和端点框架。在发出请求时,如果请求完成,应用程序只返回“成功”。我正在尝试实现身份验证,因此未经身份验证的用户无法完成请求。我做了以下事情:

  1. 修改了我的main.py装饰器,包括发行人和受众:
issuers={'serviceAccount': endpoints.Issuer('[MYSERVICEACCOUNT]', 'https://www.googleapis.com/robot/v1/metadata/x509/[MYSERVICEACCOUNT]')}, 
audiences={'serviceAccount': ['[MYSERVICENAME]-dot-[MYPROJECT].appspot.com']}
  1. 修改了我检查有效用户的main.py方法:
user = endpoints.get_current_user()
if user is None:
   raise endpoints.UnauthorizedException('You must authenticate first.')
  1. 重新生成并重新部署我的openAPI文档。它现在有安全和安全定义部分。
  2. 更新了我的app.yaml以引用该Endpoints版本。
  3. 重新部署了我的应用程序

要向我的应用程序发出授权请求,我已完成以下操作:

  1. 我在服务帐户上为我的终端服务提供了服务使用者角色。
  2. 使用Google的documentation中的generate_jwt函数生成签名的jwt。我使用服务帐户的json密钥文件传递凭据。
    payload = json.dumps({
        "iat": now,
        "exp": now + 3600,
        "iss": [MYSERVICEACCOUNT],
        "sub": [MYSERVICEACCOUNT],
        "aud": [MYSERVICENAME]-dot-[MYPROJECT].appspot.com
    })
  1. 使用Google文档中的make_jwt_request函数发出请求。
   headers = {
        'Authorization': 'Bearer {}'.format(signed_jwt),
        'content-type': 'application/json'}

我收到401客户端错误:未经授权的网址错误。我错过了什么吗?

python-2.7 google-app-engine authentication google-cloud-endpoints
3个回答
1
投票

您的受众群体不匹配;在您的代码中,您需要[MYSERVICEACCOUNT]的观众,但在生成JWT时,您的观众是[MYSERVICENAME]-dot-[MYPROJECT].appspot.com。这些需要匹配。


1
投票

有一些细节,可能值得检查:

  • 允许的受众列表应包含客户端生成的JWT令牌的aud声明的值。这就是罗斯所指出的。
  • 在样本客户documentation中提出的所有JWT声明都存在。您的代码缺少JWT email字典中的payload声明。
  • 您正在访问的方法不需要特定的OAuth范围。范围被设置为scopes装饰的@endpoints.method字段。

0
投票

在与Google打开支持票后,结果显示Google的文档不正确。 main.py函数需要以下面的方式检查经过身份验证的用户:

providers=[{ 
'issuer': '[YOUR-SERVICE-ACCOUNT]', 
'cert_uri': 'https://www.googleapis.com/service_accounts/v1/metadata/raw/[YOUR-SERVICE-ACCOUNT]', 
}] 

audiences = ['[YOUR-SERVICE-NAME]-dot-[YOUR-PROJECT-NAME].appspot.com'] 

user = endpoints.get_verified_jwt(providers, audiences, request=request) 
if not user: 
  raise endpoints.UnauthorizedException 

进行此更改后,尝试进行身份验证请求时出现以下错误:

从ProtoRPC方法实现遇到意外错误:AttributeError('unicode'对象没有属性'get')

这是由于我如何使用json.dumps()生成有效负载。我生成没有json.dumps()如下所示:

payload = {
  "iat": now,
  "exp": now + 3600,
  "iss": [MYSERVICEACCOUNT],
  "sub": [MYSERVICEACCOUNT],
  "aud": [MYSERVICENAME]-dot-[MYPROJECT].appspot.com
}

这两个变化解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.