- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Over on GitHub一位乐于助人的 Google 开发人员告诉我
to create a user session, your python backend server only needs a JWT library to verify the Firebase Auth token (signature and audience) in the request and extract the user info from the token payload.
我在验证 token 时遇到问题。
这就是我所在的地方;为了开始迁移,我进行了如下操作:
我将 Firebase-Auth 添加到 Android 应用程序,同时在应用程序中仍然有 Gitkit,直到 Firebase-Auth 工作。现在我有两个登录按钮,一个用于登录 Firebase,另一个用于“几乎已弃用”的 Gitkit。
在 firebase.com 上,我将 Google 项目导入到一个新的 Firebase 项目中,因此用户数据库是相同的。我已经设法在 Android 应用程序中使用 Firebase-Auth,能够以已知用户身份登录,并且我可以通过调用 mFirebaseAuth.getCurrentUser() 成功检索后端服务器所需的 token .getToken(false).getResult().getToken()
.它包含与 GitKit token 相同的 user_id
。
现在我正在尝试替换 identity-toolkit-python-client
图书馆 python-jose
.因为我目前没有将 Firebase token 发送到后端,而只发送了 Gitkit token ,所以我想在 Gitkit token 上测试这个 python-jose
库。
在后端,在调用 GitKit.VerifyGitkitToken()
之前,我现在打印出 jose.jwt.get_unverified_header()
和 jose 的结果。 jwt.get_unverified_claims()
以检查我是否能看到我所期望的。结果很好,我能够按照预期查看 Gitkit token 的内容。
我的问题来自验证。我无法使用 jose.jwt.decode()
进行验证,因为我不知道我需要使用哪个 key 。
jose.jwt.decode(token, key, algorithms=None, options=None, audience=None, issuer=None, subject=None, access_token=None)
我从标题中知道算法,如果有任何帮助,“aud”字段也存储在声明中。
回到工程师的评论
verify the Firebase Auth token (signature and audience)
我如何使用可用的信息来做到这一点?我猜 audience 是声明中的“aud”字段,但如何检查签名?
删除服务器上的 Gitkit 依赖项后,我将继续迁移。
据我所知,GitKit 库显然对 Google 服务器进行了“RPC”调用以进行验证,但我可能错了。
那么,Gitkit token 验证的 key 和 Firebase token 验证的 key 是哪个?
最佳答案
可获取 key
Firebase 在https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
Gitkit 位于https://www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeys
使用 Google 的 oauth2client
库使验证变得非常容易。
但是,如果您想使用 python-jose
而不是 oauth2client
,则可以使用 you first need to convert the PEM certificate into an RSA public key(更新:此问题已得到修复,对于 Firebase,此问题现在由库处理,向下滚动到末尾这条评论前面的 GitHub 链接。不确定 Gitkit)。这个公钥就是需要使用的 key 。并且受众应该不从 JWT header 中提取,而是硬编码到源代码中,在 Firebase 中,受众是项目 ID,在 Gitkit 中,它是其中之一OAuth 2.0 客户端 ID,可以在 Google Developer Console Credentials 部分找到。
JWT header 中的 kid
用于选择适当的证书,该证书将用于获取用于执行验证的 key 。
# firebase
# target_audience = "firebase-project-id"
# certificate_url = 'https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com'
# gitkit
target_audience = "123456789-abcdef.apps.googleusercontent.com" # (from developer console, OAuth 2.0 client IDs)
certificate_url = 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeys'
response = urllib.urlopen(certificate_url)
certs = response.read()
certs = json.loads(certs)
print "CERTS", certs
print ''
print ''
# -------------- verify via oauth2client
from oauth2client import crypt
crypt.MAX_TOKEN_LIFETIME_SECS = 30 * 86400 # according to https://github.com/google/identity-toolkit-python-client/blob/master/identitytoolkit/gitkitclient.py
print "VALID TOKEN", crypt.verify_signed_jwt_with_certs(idtoken, certs, target_audience)
print ''
print ''
# -------------- verify via python-jose
from jose import jwt
unverified_header = jwt.get_unverified_header(idtoken)
print "UNVERIFIED HEADER", unverified_header
print ''
print ''
unverified_claims = jwt.get_unverified_claims(idtoken)
print "UNVERIFIED CLAIMS", unverified_claims
print ''
print ''
from ssl import PEM_cert_to_DER_cert
from Crypto.Util.asn1 import DerSequence
pem = certs[unverified_header['kid']]
der = PEM_cert_to_DER_cert(pem)
cert = DerSequence()
cert.decode(der)
tbsCertificate = DerSequence()
tbsCertificate.decode(cert[0])
rsa_public_key = tbsCertificate[6]
print "VALID TOKEN", jwt.decode(idtoken, rsa_public_key, algorithms=unverified_header['alg'], audience=target_audience)
关于python - 使用 python-jose 将 Python 后端从 Gitkit 迁移到 Firebase-Auth 以进行 token 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39123568/
我最近开始从事一个 Sails 项目。它目前在迁移表下具有以下格式的迁移。 20160826122004-create_users_table.js 'use strict'; module.expo
当我尝试迁移时 doctrine:migrations:migrate ,我收到此异常:“元数据存储不是最新的,请运行 sync-metadata-storage 命令来解决此问题。”。这仅在尝试在生
我在 ec2 linux 7 上有一个 MarkLogic 服务器。我想将它迁移到 linux 6。我将 ebs 移动到新的 linux 6 并将其安装在 /var/opt/MarkLogic . 我
我对 OpenID 很好奇。虽然我同意统一凭证的想法很棒,但我有一些保留意见。什么是防止 OpenID 提供商发疯并持有他们拥有的 OpenID 帐户直到您支付 n 美元?如果我决定不喜欢这个提供商,
使用 SQL 很容易做到这一点,但我需要编写一个我不熟悉的 Knex 迁移脚本。以下代码在 order 表中行的末尾添加了 order_id 列。我想在 id 之后添加 order_id。我该怎么做?
使用 SQL 很容易做到这一点,但我需要编写一个我不熟悉的 Knex 迁移脚本。以下代码在 order 表中行的末尾添加了 order_id 列。我想在 id 之后添加 order_id。我该怎么做?
我想通过在 Yii2 中的迁移添加一个新列,使用以下代码: public function up() { $this->addColumn('news', 'priority', $this-
我正在尝试在 SQLDelight 的表中添加更多列。我做了一个迁移文件 1.sqm .在迁移文件中,它给出了找不到表的错误。 我的 build.gradle.kts: sqldelight {
我有一个与 Flyway DB 迁移相关的问题。通常如何管理处理相同 DB 模式的多个项目(微服务)。每个项目中的 Flyway 迁移脚本如果被其他项目修改,则不允许启动。他们是否有任何文档或最佳实践
我是 Laravel 的新手。我做了一份待办事项申请作为一项学校作业。我们必须使用迁移来创建我们的数据库。 我使用迁移创建了 2 个表。我的问题是:如果你第一次在你的电脑上运行这个项目,有没有办法自动
我正在尝试在 Laravel 中创建外键,但是当我使用 artisan 迁移表时,出现以下错误: [Illuminate\Database\QueryException] SQLSTATE[HY000
我从 Django 1.7 升级到 Django 1.9。我有多次迁移。升级后我无法再创建新的数据库。 问题是“django manage.py migrate”运行检查。检查导入应用程序 URL。这
我在创建数据迁移方面遇到了困难。我的应用程序使用两个数据库。我在 settings.py 中配置了数据库,并创建了一个像 Django docs 中一样的路由器. # settings.py DB_H
我有一个像这样的sql结构: CREATE TABLE resources ( id SERIAL PRIMARY KEY, title TEXT NOT NULL, created_at
我正在尝试使用模式构建器向表添加枚举选项(不丢失当前数据集)。 我真正能够找到的关于列更改的唯一信息是 http://www.flipflops.org/2013/05/25/modify-an-ex
我尝试转移到一些 CMake 程序中,并且有一个从 xml 生成头文件的函数。 生成文件.am adaptor_glue.hpp: dbus_introspect.xml $(DBUSXX_X
我想将文件移至我的 iOS 应用程序的 CoreData 存储 ../Library/Application Support/MyApp/ 至 ../Documents/Stores/ 我可以使用 N
有没有人对数据迁移进出 NetSuite 有丰富的经验?我必须将 DB2 表导出到 MySQL,处理数据,然后导出到一个 CSV 文件中。然后获取帐户的 CSV 文件并再次操作数据以使帐户从我们的旧系
我正在尝试在 Django 上建立一个博客。我已经走到了创建模型的地步。他们在这里: from django.db import models import uuid class Users(mode
我最近使用 bluehost 上的 AutoSSL 工具将网站迁移到 HTTPS。我在内容中看到一些失真,例如缺少背景颜色、表格位移、缺少_logos 等。 有谁知道 HTTPS 迁移效果如何影响样式
我是一名优秀的程序员,十分优秀!