首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Google云端点和JWT

Google云端点和JWT
EN

Stack Overflow用户
提问于 2015-08-04 18:18:15
回答 1查看 2.4K关注 0票数 4

我有一个基于Google的API,我想使用JWT (Json令牌)进行授权。我可以为每个包含令牌的请求设置授权头,并且它工作正常。我知道端点对Oauth2使用这个头,下面是我的问题。对自定义令牌使用授权头正确吗?GAE日志:

代码语言:javascript
复制
D 12:38:44.375 Checking for id_token.
D 12:38:44.376 id_token verification failed: Unexpected encryption algorithm: u'HS256'
D 12:38:44.376 Checking for oauth token.
D 12:38:44.384 Oauth framework user didn't match oauth token user.

看起来GAE试图将这个令牌解读为oauth令牌,但它不是很好,对吗?也许我应该用URL发送我的令牌?有点像app-id.appspot.com/_ah/api/my_app/v1/users/get?jwt=TOKEN.也许我不应该在中使用JWT?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-06 20:02:44

这些消息是由于端点库试图从Authorization头自动确定用户,以便它能够提供endpoints.get_current_user (source)。当Authorization标头包含一个有效的OAuth2访问令牌或Android令牌时,它可以自动完成这一操作。

简单地说,这不是一个错误,它只是不能自动处理您的授权头。没有什么大不了的,因为您将通过JWT使用您自己的。

对于JWT,您仍然可以使用Authorization头并使用PyJWT亲自验证JWT(要安装第三方包,请参阅here)。

以下是一个完整的示例:

代码语言:javascript
复制
import logging

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

import jwt


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


@endpoints.api(name='example', version='v1')
class ExampleApi(remote.Service):
    @endpoints.method(message_types.VoidMessage, TestMessage, http_method='GET')
    def auth(self, unused_request):

        # Get the HTTP Authorization header.
        auth_header = self.request_state.headers.get('authorization')
        if not auth_header:
            raise endpoints.UnauthorizedException("No authorization header.")

        # Get the encoded jwt token.
        auth_token = auth_header.split(' ').pop()

        # Decode and verify the token
        try:
            payload = jwt.decode(auth_token, 'secret')
            # Do your own check here.
            logging.info(payload)
        except jwt.InvalidTokenError:
            raise endpoints.UnauthorizedException("Token validation failed.")

        return TestMessage(message='OK')


app = endpoints.api_server([ExampleApi])

您可以使用自生成的jwt令牌来测试这一点:

代码语言:javascript
复制
$ python -c "import jwt; print jwt.encode({'some': 'data'}, 'secret')"
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoiZGF0YSJ9.g1aG08iQyPPwCTJHCxRrkKoYmLiHbBNdarcBQkCPMG4

然后使用httpie发出请求:

代码语言:javascript
复制
$ http GET :8080/_ah/api/example/v1/auth Authorization:'Token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoiZGF0YSJ9.g1aG08iQyPPwCTJHCxRrkKoYmLiHbBNdarcBQkCPMG4'

如果您不喜欢每次都看到关于无法验证令牌的端点日志,您可以使用自己的头,比如X-Auth

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31816453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档