android - Firebase 动态链接(创建控制台)是否支持使用 ActionCodeSettings 和密码重置的自定义查询参数?
问题描述
有没有办法在使用控制台创建的 Firebase 动态链接中传递自定义查询参数?
我的工作流程如下:
接收电子邮件并执行的“重置密码”屏幕
sendPasswordResetEmail(email, settings)
应用程序启动,我们进入屏幕输入新密码。
称呼
FirebaseDynamicLinks.getInstance().getDynamicLink(getIntent())
用于
pendingDynamicLinkData.getLink().getQueryParameter("oobCode"));
从动态链接获取查询参数(在本例中获取我们用于重置密码的密码代码。在上一步中使用 oobCode 并调用
FirebaseAuth.getInstance().confirmPasswordReset(actionCode, password)
按钮单击(从使用输入的 editText 字段中获取密码)以重置密码。
理想情况下,我想在密码重置后登录我的用户。为此,我需要在密码重置中使用电子邮件地址(我需要从尝试登录的用户那里获取 firestore 文档信息)。
所以我需要能够将电子邮件地址传递到屏幕以重置密码。
这是我的相关代码片段:
初始“忘记密码屏幕”:用户在此处输入电子邮件。首先构建我的操作代码设置,然后执行 sendPasswordResetEmail() 方法。
String url = "https://example.com"; //my deep link set in Firebase console
ActionCodeSettings settings = ActionCodeSettings.newBuilder()
.setAndroidPackageName(
getPackageName(),
true, /* install if not available? */
null /* minimum app version */)
.setHandleCodeInApp(true)
.setUrl(url)
.build();
mAuth.sendPasswordResetEmail(email, settings)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Log.d(TAG, "Email sent.");
}
else {
Exception e = task.getException();
Log.w(TAG, "passwordResetRequest:failure " + e.getMessage(), task.getException());
if (e instanceof FirebaseAuthInvalidCredentialsException) {
}
}
}
});
然后在电子邮件中选择链接后,我们进入重置密码屏幕。在这里,我们调用以下方法从动态链接中获取参数:
FirebaseDynamicLinks.getInstance()
.getDynamicLink(getIntent())
.addOnSuccessListener(this, new OnSuccessListener<PendingDynamicLinkData>() {
@Override
public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
// Get deep link from result (may be null if no link is found)
Uri deepLink = null;
if (pendingDynamicLinkData != null && pendingDynamicLinkData.getLink() != null) {
deepLink = pendingDynamicLinkData.getLink();
actionCode = deepLink.getQueryParameter("oobCode");
actionMode = deepLink.getQueryParameter("mode");
}
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "getDynamicLink:onFailure", e);
}
});
最后,我们使用 oobCode(允许重置密码的操作代码),在按钮单击和用户输入新密码时,我们使用以下命令重置密码:
resetPass.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (actionCode != null && !actionCode.equals(""))
FirebaseAuth.getInstance().confirmPasswordReset(actionCode, newPassword.getText().toString()).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful() && task.getResult() != null)
Log.d(TAG, "Deep Link confirmPassReset: " + task.getResult().toString());
}
});
}
});
这就是我挣扎的地方。在构建ActionCodeSettings
. 例如:
String url = "https://example.com/?email=jsmith@gmail.com";
然后尝试使用以下方法在重置密码屏幕中获取它们:
deepLink.getQueryParameter("email");
但是每次我尝试这个时,我都会不断得到null
. 我错过了什么。甚至可以使用在 Firebase 控制台中创建的动态链接传递自定义查询参数吗?如果没有,实现这一目标的最佳方法是什么?
任何帮助将不胜感激。提前致谢!
解决方案
您需要先获取链接
val actionUrl = deepLink.getQueryParameter("continueUrl")
并使用 subString 获取电子邮件值
actionUrl.substring(actionURL.lastIndexOf("=") + 1, actionURL.length)
推荐阅读
- javascript - Vue 将子组件的方法暴露给父组件
- python - 如何通过遵循相邻标准快速收集点列表
- typescript - Angular not displaying data from component.ts to html
- java - Java Maven 库项目模板
- nginx - 使用 NGINX 重写 Cookie
- mysql - MariaDB/MySQL:“UTC”时区是否与“+00:00”相同?
- javascript - 如何禁用 AngularJS 控制器中的 $window.alert 功能进入页面?
- angular6 - 更改的请求在角度 6 中不起作用
- javascript - 忽略 IE11 中的“语法错误”
- java - 通过 LiveData 观察者将项目添加到特定索引时出现 IndexOutOfBoundsException