在我的网络应用程序中,我正在使用Firebase Google登录来验证用户身份,流程如下
在前端,使用户使用firebase sdk登录,获取用户的idtoken并将其发送到服务器
服务器使用idtoken验证用户并从idtoken获取电子邮件
我正在使用python后端,并且使用google.oauth2.id_token模块来验证令牌并解码令牌
问题是,对于少数用户而言,解码后的令牌剂量不包含电子邮件字段
在前端,我尝试添加userinfo.email范围,但仍然无法正常工作
我添加了这样的范围
googleProvider = new firebase.auth.GoogleAuthProvider(); googleProvider.addScope('https://www.googleapis.com/auth/userinfo.email')
在后端,我正在像这样解码令牌
decoded_token = google.oauth2.id_token.verify_firebase_token(auth_token, google.auth.transport.requests.Request())
这是解码的令牌所包含的少量用户内容(我将实际值更改为“ sometext”)
{
"picture": "somtext",
"sub": "somtext",
"user_id": "somtext",
"name": "somtext",
"iss": "https://securetoken.google.com/somtext",
"firebase": {
"sign_in_provider": "google.com",
"identities": {
"google.com": [
"somtext"
]
}
},
"exp": 1557566434,
"auth_time": 1557562833,
"iat": 1557562834,
"aud": "somtext"
}
解码令牌中缺少电子邮件字段
对于少数用户,电子邮件字段存在;对于少数用户,则不存在
我不知道自己缺少什么,我想在解码令牌中为所有用户提供电子邮件字段
javascript大神给出的解决方案
我没有找到我所要求的确切解决方案,但我改变了流程,我发布此消息是因为我觉得这可能对某些人有所帮助
无法收到电子邮件的原因是Firebase登录流程中的“允许使用相同的电子邮件地址创建多个帐户”设置。
此选项的作用是创建一个没有电子邮件地址的帐户,并且UID与具有相同电子邮件地址的其他帐户不同
我需要做的是允许用户使用多个登录提供者(在我的情况下为facebook,google)登录
如果某位用户使用具有2个不同登录提供者的同一电子邮件,并且在不同时间使用不同提供商(具有相同电子邮件)的登录,则该用户应链接到一个帐户
下面说明了我如何实现该要求
在Firebase登录流程中,我将设置更改为“每个电子邮件地址一个帐户”,
为了实现此要求,我不得不处理以下情况
情况1:
User sign-in for the 1st time(no user account is there for the user) using a sign-in-provider
情况2:
User sign-in (not 1st time user account is created already) using the same sign-in-provider
情况3:
User sign-in (not 1st time user account is created already) using a different sign-in-provider (with same email)
处理案例1和案例2
在前端,当用户登录时,前端会将id令牌和电子邮件(使用email.scope获取电子邮件)发送到后端
后端验证idtoken并获取该令牌的firebase user_id,然后检查数据库中与firebase user_id关联的帐户
如果找不到与firebase user_id关联的帐户,则会创建一个以该firebase user_id作为键的新帐户,并将电子邮件存储在该帐户中,并将所需的详细信息发送到前端。如果找到一个帐户,它将发送与该帐户关联的详细信息
处理案例3
由于用户尝试使用新登录提供程序Firebase使用现有电子邮件登录时,设置了“每个电子邮件地址一个帐户”设置,将引发“ auth / account-exists-with-different-credential”异常
通过按照此处https://firebase.google.com/docs/auth/web/google-signin#handling-account-exists-with-different-credential-errors的说明处理此异常,具有此新登录提供者的电子邮件将链接到现有的Firebase user_id
那么流程就像案例2
我如何使用flask从javascript获取变量 - javascript因此,我按照flask的建议在相应的文件夹中设置了app.py,index.js,index.html。 Index.html在app.py运行时呈现,然后index.html运行index.js,后者从用户那里获取输入数据。我试图发送此输入并将其发送到python,在这里我可以调用API,获取数据并使用它,但是我想不出一种方法来做到这一点。我的app.py…
Ajax功能后没有数据传递到URL - javascript这是我使用Ajax将参数传递到另一个PHP页面的脚本。 $(document).on( "click",".btndriver", function() { var id = $(this).attr("id"); var nombre = $(this).attr("nombre…
ajax正在加载页面以返回POST请求 - javascript当我通过ajax发出“ POST”请求时,返回请求时页面正在加载。我们不使用ajax阻止整个页面重新加载吗?这是我的html代码:<form method="post"> <div align="center" class="col-md-10"> <input typ…
Flask | Jinjia2 | Javascript:将Flask模板变量传递给Javascript - javascript将变量从Flask模板传递到Javascript文件的最佳方法是什么?这是我的代码我的webapp中有一个简单的视图:@webapp.route('/bars') def plot_d3_bars(): return render_template("bars.html", calendarMap = calendar…
读取客户端上的提要时出现NotAllowedException - javascript嗨,我是GetStream的新手,仍然在学习。这是我正在使用的压缩版本。我有一个python后端,可在其中创建用户令牌:client = stream.connect(...) token = client.create_user_token(id) return token 然后,我将令牌传递给js前端,在该前端中该令牌用于检索该用户的feed活动。我正在…