Python 使用默认GAE服务帐户对端点(Std env)进行身份验证时给出;401方法不允许没有已建立标识的调用方;

Python 使用默认GAE服务帐户对端点(Std env)进行身份验证时给出;401方法不允许没有已建立标识的调用方;,python,google-app-engine,google-cloud-endpoints,Python,Google App Engine,Google Cloud Endpoints,我正在尝试在AppEngine标准环境服务中创建一个Google云端点,它有两种身份验证方法:apiKey和默认GAE服务帐户 apiKey身份验证是为了让外部系统能够查询API 默认GAE身份验证用于同一AppEngine应用程序(XXXX)中的其他服务(以前称为“模块”)连接到端点(例如,service1-dot-XXXX.appspot.com向api dot XXXX.appspot.com中的端点发出请求) apiKey身份验证工作正常,但“”身份验证提供: 401 Method

我正在尝试在AppEngine标准环境服务中创建一个Google云端点,它有两种身份验证方法:apiKey和默认GAE服务帐户

  • apiKey身份验证是为了让外部系统能够查询API
  • 默认GAE身份验证用于同一AppEngine应用程序(XXXX)中的其他服务(以前称为“模块”)连接到端点(例如,service1-dot-XXXX.appspot.com向api dot XXXX.appspot.com中的端点发出请求)
apiKey身份验证工作正常,但“”身份验证提供:

401 Method does not allow callers without established identity. Please use an API key or other form of API consumer identity to call this API.
我正在用以下内容装饰端点:

@endpoints.api(
    name='widgets',
    version='v1',
    base_path='/api/',
    api_key_required=True,
    allowed_client_ids=['XXXX@appspot.gserviceaccount.com'])

class WidgetsApi(remote.Service):
... 
并根据

我是否忘记了端点装饰器或任何其他配置中的某些内容?或者端点装饰器只接受一种身份验证方法? 我认为在同一个GAE std实例中从一个服务调用另一个服务是很简单的。这有点让人困惑(至少对我来说),例如,请求('/auth/info/googlejwt')获取jwt令牌,但何时调用实际端点


提前感谢,新年快乐

api\u-key\u-required
为真时,除了任何jwt之外,您还必须在请求中提供一个api-key。

api\u-key\u-required
为真时,除了任何jwt之外,您还必须在请求中提供一个api-key。

谢谢-文档不是很清楚,我认为服务到服务身份验证不需要密钥…谢谢-文档不是很清楚,我认为服务到服务身份验证不需要密钥。。。
SERVICE_ACCOUNT_EMAIL = 'XXXX@appspot.gserviceaccount.com'
def generate_jwt():
  """Generates a signed JSON Web Token using the Google App Engine default
  service account."""
  now = int(time.time())

  header_json = json.dumps({
      "typ": "JWT",
      "alg": "RS256"})

  payload_json = json.dumps({
      "iat": now,
      # expires after one hour.
      "exp": now + 3600,
      # iss is the service account email.
      "iss": SERVICE_ACCOUNT_EMAIL,
      "sub": SERVICE_ACCOUNT_EMAIL,
      "email": SERVICE_ACCOUNT_EMAIL,
      "aud": 'https://api-dot-XXXX.appspot.com',
  })

  header_and_payload = '{}.{}'.format(
      base64.urlsafe_b64encode(header_json),
      base64.urlsafe_b64encode(payload_json))
  (key_name, signature) = app_identity.sign_blob(header_and_payload)
  signed_jwt = '{}.{}'.format(
      header_and_payload,
      base64.urlsafe_b64encode(signature))
  return signed_jwt

def make_request(signed_jwt):
  """Makes a request to the auth info endpoint for Google JWTs."""    
  headers = {'Authorization': 'Bearer {}'.format(signed_jwt)}
  conn = httplib.HTTPSConnection('api-dot-XXXX.appspot.com')
  url = '/api/widgets/v1/list'
  conn.request("POST", url, urllib.urlencode({'search': ''}), headers)
  res = conn.getresponse()
  conn.close()
  return res.read()