我开始使用后端和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')]
答案 0 :(得分:0)
您必须先创建一个<i class="fa {{ $user->SUPERUSER == 'Y' ? 'fa-check-square' : 'fa-square' }}"></i>
变量,然后才能进入
token
语句。
您可以使用Flask的try
并按以下方式捕获令牌:
request
所以您的最终代码如下所示:
token = request.form["idtoken"]
最近的答复,但我刚刚敲了敲这个头,我认为其他人将来可能会觉得有用。