7

我正在使用使用自定义身份验证(GAE 会话)而不是 Google 帐户的 Python 应用程序来实现 Cloud Endpoints。我需要对来自 Javascript 客户端的请求进行身份验证,因此我想访问 cookie 信息。

阅读this other question让我相信这是可能的,但可能没有记录。我不熟悉 App Engine 的 Java 端,所以我不太确定如何将该代码段翻译成 Python。这是我的一种方法的示例:

class EndpointsAPI(remote.Service):
  @endpoints.method(Query_In, Donations_Out, path='get/donations',
                    http_method='GET', name='get.donations')
  def get_donations(self, req):
    #Authenticate request via cookie

其中Query_InDonations_Out都是 ProtoRPC 消息 ( messages.Message)。函数中的参数req只是一个实例,Query_In我没有找到任何与 HTTP 数据相关的属性,但我可能是错的。

4

2 回答 2

14

首先,我鼓励您尝试从您的客户端使用 OAuth 2.0,就像在井字游戏示例中所做的那样。

Cookies 在 Cookie Header 中发送到服务器,这些值通常在 WSGI 环境中设置,其中的键'HTTP_...'对应...于 header 名称:

http = {key: value for key, value in os.environ.iteritems() 
        if key.lower().startswith('http')}

对于 cookie,os.getenv('HTTP_COOKIE')将为您提供您寻求的标头值。不幸的是,默认情况下,这不会通过 Google 的 API 基础设施传递。

更新:从版本 1.8.0开始,这已为 Python 应用程序启用。要通过发送 cookie,请指定以下内容:

from google.appengine.ext.endpoints import api_config

AUTH_CONFIG = api_config.ApiAuth(allow_cookie_auth=True)

@endpoints.api(name='myapi', version='v1', auth=AUTH_CONFIG, ...)
class MyApi(remote.service):
    ...

这是通过的标头(不一定是完整列表):

  • HTTP_AUTHORIZATION
  • HTTP_REFERER
  • HTTP_X_APPENGINE_COUNTRY
  • HTTP_X_APPENGINE_CITYLATLONG
  • HTTP_ORIGIN
  • HTTP_ACCEPT_CHARSET
  • HTTP_ORIGINALMETHOD
  • HTTP_X_APPENGINE_REGION
  • HTTP_X_ORIGIN
  • HTTP_X_REFERER
  • HTTP_X_JAVASCRIPT_USER_AGENT
  • HTTP_METHOD
  • HTTP_HOST
  • HTTP_CONTENT_TYPE
  • HTTP_CONTENT_LENGTH
  • HTTP_X_APPENGINE_PEER
  • HTTP_ACCEPT
  • HTTP_USER_AGENT
  • HTTP_X_APPENGINE_CITY
  • HTTP_X_CLIENTDETAILS
  • HTTP_ACCEPT_LANGUAGE
于 2013-03-28T22:57:47.280 回答
10

对于登陆这里的 Java 人。您需要添加以下注释才能在端点中使用 cookie:

@Api(auth = @ApiAuth(allowCookieAuth = AnnotationBoolean.TRUE))

来源

(没有它,它将在本地开发服务器上工作,但不能在真正的 GAE 实例上工作。)

于 2015-02-26T14:47:35.573 回答