云端点身份验证
Cloud Endpoints Authentication
我将 App Engine Standard 与 Python 2 运行时和端点框架一起使用。
发出请求时,如果请求已完成,应用程序将 returns "Successful"。我正在尝试实施身份验证,以便未经身份验证的用户无法完成请求。我已完成以下操作:
- 修改了我的 main.py 装饰器以包括发行者和观众:
issuers={'serviceAccount': endpoints.Issuer('[MYSERVICEACCOUNT]', 'https://www.googleapis.com/robot/v1/metadata/x509/[MYSERVICEACCOUNT]')},
audiences={'serviceAccount': ['[MYSERVICENAME]-dot-[MYPROJECT].appspot.com']}
- 修改了我的 main.py 方法来检查有效用户:
user = endpoints.get_current_user()
if user is None:
raise endpoints.UnauthorizedException('You must authenticate first.')
重新生成并重新部署了我的 openAPI 文档。它现在有安全和安全定义部分。
更新了我的 app.yaml 以引用该 Endpoints 版本。
重新部署我的应用程序
为了向我的应用程序发出授权请求,我执行了以下操作:
我在我的 Endpoints 服务上为服务帐户授予了服务消费者角色。
使用 Google 的 documentation 中的 generate_jwt 函数生成一个签名的 jwt。我正在使用服务帐户的 json 密钥文件传递凭据。
payload = json.dumps({
"iat": now,
"exp": now + 3600,
"iss": [MYSERVICEACCOUNT],
"sub": [MYSERVICEACCOUNT],
"aud": [MYSERVICENAME]-dot-[MYPROJECT].appspot.com
})
- 使用 Google 文档中的 make_jwt_request 函数发出请求。
headers = {
'Authorization': 'Bearer {}'.format(signed_jwt),
'content-type': 'application/json'}
我收到 401 客户端错误:未授权 url 错误。我错过了什么吗?
您的受众群体不匹配;在您的代码中,您需要 [MYSERVICEACCOUNT]
的受众,但在生成 JWT 时,您的受众是 [MYSERVICENAME]-dot-[MYPROJECT].appspot.com
。这些需要匹配。
细节很少,可能值得检查:
- 允许的受众列表应包含
aud
客户端生成的 JWT 令牌声明的值。这是罗斯指出的。
- 示例客户端 documentation 中提供的所有 JWT 声明都存在。您的代码缺少 JWT
payload
字典中的 email
声明。
- 您访问的方法不需要特定的 OAuth 范围。范围设置为
@endpoints.method
装饰器的 scopes
字段。
使用 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
进行更改后,我在尝试发出经过身份验证的请求时遇到以下错误:
Encountered unexpected error from ProtoRPC method implementation: AttributeError ('unicode' object has no attribute 'get')
这是由于我使用 json.dumps() 生成负载的方式造成的。我在没有 json.dumps() 的情况下生成如下所示:
payload = {
"iat": now,
"exp": now + 3600,
"iss": [MYSERVICEACCOUNT],
"sub": [MYSERVICEACCOUNT],
"aud": [MYSERVICENAME]-dot-[MYPROJECT].appspot.com
}
这两项更改解决了我的问题。
我将 App Engine Standard 与 Python 2 运行时和端点框架一起使用。 发出请求时,如果请求已完成,应用程序将 returns "Successful"。我正在尝试实施身份验证,以便未经身份验证的用户无法完成请求。我已完成以下操作:
- 修改了我的 main.py 装饰器以包括发行者和观众:
issuers={'serviceAccount': endpoints.Issuer('[MYSERVICEACCOUNT]', 'https://www.googleapis.com/robot/v1/metadata/x509/[MYSERVICEACCOUNT]')},
audiences={'serviceAccount': ['[MYSERVICENAME]-dot-[MYPROJECT].appspot.com']}
- 修改了我的 main.py 方法来检查有效用户:
user = endpoints.get_current_user()
if user is None:
raise endpoints.UnauthorizedException('You must authenticate first.')
重新生成并重新部署了我的 openAPI 文档。它现在有安全和安全定义部分。
更新了我的 app.yaml 以引用该 Endpoints 版本。
重新部署我的应用程序
为了向我的应用程序发出授权请求,我执行了以下操作:
我在我的 Endpoints 服务上为服务帐户授予了服务消费者角色。
使用 Google 的 documentation 中的 generate_jwt 函数生成一个签名的 jwt。我正在使用服务帐户的 json 密钥文件传递凭据。
payload = json.dumps({
"iat": now,
"exp": now + 3600,
"iss": [MYSERVICEACCOUNT],
"sub": [MYSERVICEACCOUNT],
"aud": [MYSERVICENAME]-dot-[MYPROJECT].appspot.com
})
- 使用 Google 文档中的 make_jwt_request 函数发出请求。
headers = {
'Authorization': 'Bearer {}'.format(signed_jwt),
'content-type': 'application/json'}
我收到 401 客户端错误:未授权 url 错误。我错过了什么吗?
您的受众群体不匹配;在您的代码中,您需要 [MYSERVICEACCOUNT]
的受众,但在生成 JWT 时,您的受众是 [MYSERVICENAME]-dot-[MYPROJECT].appspot.com
。这些需要匹配。
细节很少,可能值得检查:
- 允许的受众列表应包含
aud
客户端生成的 JWT 令牌声明的值。这是罗斯指出的。 - 示例客户端 documentation 中提供的所有 JWT 声明都存在。您的代码缺少 JWT
payload
字典中的email
声明。 - 您访问的方法不需要特定的 OAuth 范围。范围设置为
@endpoints.method
装饰器的scopes
字段。
使用 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
进行更改后,我在尝试发出经过身份验证的请求时遇到以下错误:
Encountered unexpected error from ProtoRPC method implementation: AttributeError ('unicode' object has no attribute 'get')
这是由于我使用 json.dumps() 生成负载的方式造成的。我在没有 json.dumps() 的情况下生成如下所示:
payload = {
"iat": now,
"exp": now + 3600,
"iss": [MYSERVICEACCOUNT],
"sub": [MYSERVICEACCOUNT],
"aud": [MYSERVICENAME]-dot-[MYPROJECT].appspot.com
}
这两项更改解决了我的问题。