【问题标题】:google app engine standard firebase authentication problem谷歌应用引擎标准firebase身份验证问题
【发布时间】:2020-04-13 05:22:17
【问题描述】:

我正在尝试使用 Endpoints Framework 在 Google App Engine Standard 中编写 API。 我按照https://cloud.google.com/endpoints/docs/frameworks/python/get-started-frameworks-python 的教程进行操作。 “打开”方法工作正常,但是当我想使用 Firebase 身份验证保护 API 时遇到问题。按照https://cloud.google.com/endpoints/docs/frameworks/python/authenticating-users的教程,我编写了以下代码:

import endpoints
from endpoints import message_types
from endpoints import messages
from endpoints import remote


class EchoRequest(messages.Message):
    message = messages.StringField(1)

class EchoResponse(messages.Message):
    """A proto Message that contains a simple string field."""
    message = messages.StringField(1)


ECHO_RESOURCE = endpoints.ResourceContainer(
    EchoRequest,
    n=messages.IntegerField(2, default=1))

@endpoints.api(
    name='echo',
    version='v1',
    issuers={'firebase': endpoints.Issuer(
   'https://securetoken.google.com/project_name',
    'https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com')})
class EchoApi(remote.Service):
    @endpoints.method(
        # This method takes a ResourceContainer defined above.                                                                               
        ECHO_RESOURCE,
        # This method returns an Echo message.                                                                                               
        EchoResponse,
        path='test_firebase',
        http_method='POST',
        name='test_firebase')
    def test_firebase(self, request):
        user = endpoints.get_current_user()
        # If there's no user defined, the request was unauthenticated, so we                                                                 
        # raise 401 Unauthorized.                                                                                                            
        if not user:
            raise endpoints.UnauthorizedException
        output_message = ' '.join([request.message] * 3)
        return EchoResponse(message=output_message)

当我使用以下 curl 尝试此方法时:

TOKEN="token_string"
curl -i \
     -H "Authorization: Bearer ${TOKEN}" \
     -H "Content-Type: application/json" \
     -X POST -d '{"message":"hello world"}'  https://project_name.appspot.com/_ah/api/echo/v1/test_firebase

我有以下错误:

HTTP/2 401 
content-type: application/json
x-cloud-trace-context: ffd02c47eb5885d6a93c31ac8aae26cc;o=1
date: Fri, 20 Dec 2019 17:55:57 GMT
server: Google Frontend
content-length: 150
alt-svc: quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000

{
 "error": {
  "code": 401, 
  "errors": [
   {
    "domain": "global", 
    "message": "", 
    "reason": "required"
   }
  ], 
  "message": ""
 }
}

哪里出错了?

【问题讨论】:

  • 问题在于user = endpoints.get_current_user(),它可能没有返回任何内容,因为您的 curl 命令没有成功运行(可能是由于访问令牌),而后者又运行if not user:raise endpoints.UnauthorizedException 行(401 错误) .确保您传递了正确的令牌并使用 $TOKEN 而不是 ${TOKEN}
  • 是的,问题出在以下行:user = endpoints.get_current_user(),但令牌没有任何问题,因为相同的 curl 命令用于 API 的 App Engine Flexible 实例版本,并且工作正常。我找到了这个链接:groups.google.com/forum/#!topic/google-cloud-endpoints/…,问题似乎是 endpoints.get_current_user () 不适用于 firebase 身份验证
  • 我发现了问题。在方法的签名中,必须传递关键字audiences@endpoints.method( ECHO_RESOURCE, EchoResponse, path='test_firebase', audiences={ "firebase": [project_id]}, http_method='POST', name='test_firebase') def test_firebase(self, request): user = endpoints.get_current_user() if not user: raise endpoints.UnauthorizedException
  • @alessandromercadante 你介意发布一个答案,这样问题就不会显得没有答案吗?谢谢。

标签: google-app-engine google-oauth google-app-engine-python


【解决方案1】:

(来自 alessandromercadante@ 的评论,这对我不起作用。由于它适用于某些人并且还没有答案,我将其复制到这里以保持线程继续)

在方法的签名中,必须传递关键字audiences

@endpoints.method(
  ECHO_RESOURCE,
  EchoResponse,
  path='test_firebase',
  audiences={ "firebase": [project_id]},
  http_method='POST',
  name='test_firebase') 
def test_firebase(self, request):
  user = endpoints.get_current_user()
  if not user:
    raise endpoints.UnauthorizedException


【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多