如何使用Python后端通过HTTPS POST接收id令牌?

时间:2018-01-18 17:13:47

标签: google-app-engine https xmlhttprequest urllib2 google-signin

我开始使用后端和API处理,并希望了解如何使用Python通过HTTPS POST接收令牌的一些指针,资源或技巧。

我正在关注Google的开发者页面(Google sign-in Tutorial)上的登录教程。

使用JavaScript我能够getBasicProfile()信息,但教程建议不要通过此配置文件对象与我的后端通信。相反,他们通过发送带有HTTPS POST请求的ID令牌来指示进行身份验证。

在用户点击登录按钮时,使用JavaScript进行API的第一次连接(我相信):

function onSignIn(googleUser) {
  var id_token = googleUser.getAuthResponse().id_token;
  ...
}

然后,他们发送令牌,如:

var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://localhost:8080/tokensignin');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = function() {
  console.log('Signed in as: ' + xhr.responseText);
};
xhr.send('idtoken=' + id_token);

我的疑问是,我的Python后端如何处理这个id_token(而不是通过Cookie集)?

教程指示:

from google.oauth2 import id_token
from google.auth.transport import requests

# (Receive token by HTTPS POST)
# ...                        <== this is where I am at a loss!! Beginner tutorial??

try:
    idinfo = id_token.verify_oauth2_token(token, requests.Request(), CLIENT_ID)

    if idinfo['iss'] not in ['accounts.google.com', 'https://accounts.google.com']:
        raise ValueError('Wrong issuer.')

    # Valid ID token. Get user's Google Account ID from the decoded token.
    userid = idinfo['sub']
except ValueError:
    # Invalid token
    pass

(编辑):

我所尝试的内容

我的理解是,通过使用xhr.send('idtoken=' + id_token);我将使用id_token将新标头发布到xhr.open('POST', 'http://localhost:8080/tokensignin');

中声明的网址

但是,到目前为止,我的尝试是尝试使用python中的urllib2库来读取发布到此URL的标头。

因此,在我的main.py文件中,我尝试查看新标头是否已发布如下:

import urllib2

class Glogin(webapp2.RequestHandler): # url will be '/glogin'
  def get(self):
    url = 'http://localhost:8080/tokensignin'
    try:
        # Write the headers out (I expect to see '(idtoken, id_token)' now included) 
        result = urllib2.urlopen(url)
        self.response.out.write(result.headers.items())

    except urllib2.URLError:
        logging.exception('Caught exception fetching url')

然而,我发现只有那些之前存在的标题(即idtoken从未通过JS send()方法发布?):

[('cache-control', 'no-cache'), ('content-length', '6870'), ('server', 'Development/2.0'), ('date', 'Fri, 19 Jan 2018 06:17:45 GMT'), ('content-type', 'text/html; charset=utf-8'), ('connection', 'close')]

1 个答案:

答案 0 :(得分:0)

您必须先创建一个<i class="fa {{ $user->SUPERUSER == 'Y' ? 'fa-check-square' : 'fa-square' }}"></i> 变量,然后才能进入 token语句。 您可以使用Flask的try并按以下方式捕获令牌:

request

所以您的最终代码如下所示:

token = request.form["idtoken"]

最近的答复,但我刚刚敲了敲这个头,我认为其他人将来可能会觉得有用。