我正在开发一个使用Google登录的应用。我也有一个链接到应用程序的Django后端,我想验证Django后端中的用户。我在互联网上发现了许多解决方案,但都没有用。可能我在某个地方搞砸了。
我尝试使用python-jose进行验证,这是代码:
from jose import jwt
import urllib.request, json
token = '<token recieved using await user.getIdToken in flutter>'
target_audience = "<tried projectid/appid>"
certificate_url = 'https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com'
response = urllib.request.urlopen(certificate_url)
certs = response.read()
certs = json.loads(certs)
print(certs)
user = jwt.decode(token, certs, algorithms='RS256',
audience=target_audience)
我也尝试了oauth2client,代码在这里:
from oauth2client import crypt
import urllib.request, json
certificate_url = 'https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com'
target_audience = 'tried projectid/appid'
response = urllib.request.urlopen(certificate_url)
certs = response.read()
certs = json.loads(certs)
print(certs)
crypt.MAX_TOKEN_LIFETIME_SECS = 30 * 86400
idtoken = 'token received from await user.getIdToken()'
crypt.verify_signed_jwt_with_certs(idtoken, certs, target_audience)
我还尝试了python的firebase_admin:
import firebase_admin
from firebase_admin import credentials
from firebase_admin import auth
cred = credentials.Certificate('<firebase service accounts private key>')
default_app = firebase_admin.initialize_app(cred)
token = 'token from flutter'
verifyied =auth.verify_id_token(id_token=token)
只是为了检查firebase_admin库本身是否正常工作,我将用户ID从应用程序传递到服务器,并尝试使用firebase_admin删除用户,我可以这样做。但是由于某种原因,我无法验证令牌。
感谢您的帮助。
答案 0 :(得分:1)
我也面临同样的问题。
案例:
最初:我正在vscode控制台中打印身份验证令牌,并正在终端中进行验证。
这给了我一个错误:令牌长度不能比%4多1。
我尝试验证来自jwt.io
的令牌,该令牌看似是正确的。
问题的实际原因:
vscode的控制台输出(在我的情况下是Windows 7和64位)。一行最多只能包含 1064 个字符。
尽管令牌的实际长度应该为 1170 个字符。
解决方法:
在vscode控制台中打印子字符串,然后在python shell中将其加入以进行验证。
答案 1 :(得分:0)
回答我自己的问题。问题是我的服务器没有实际部署,因此,我在用户登录时复制了在vscode控制台中打印的令牌,并将其粘贴到python代码中并尝试验证令牌。事实证明,这种方式行不通。
我托管了Django应用,并在发布请求中传递了令牌,然后尝试验证令牌是否有效。
如果遇到问题,可以在这里参考解决方案: https://coders-blogs.blogspot.com/2018/11/authenticating-user-on-backend-of-your.html