是否可以在使用控制台创建的Firebase动态链接中传递自定义查询参数?
我的工作流程如下:
重置密码屏幕,该屏幕接收电子邮件并执行sendPasswordResetEmail(email, settings)
转到电子邮件并选择链接,该链接会打开应用程序以显示屏幕以重置密码:https://xxxxx.page.link?link=https://xxxx-00000.firebaseapp.com/__/auth/action?apiKey%3DAIzaSyDxTJUhYNwbMpoRhRWde74tAqV0CMKHh_o%26mode%3DresetPassword%26oobCode%3DccgIWg7D-FPtRTp2OXon8UaIB1AL0_qpktnAL--P-eMAAAFsgjDmkw%26continueUrl%3Dhttps://example.com/%26lang%3Den&apn=com.example&amv
应用已启动,我们进入屏幕以输入新密码。
致电FirebaseDynamicLinks.getInstance().getDynamicLink(getIntent())
使用pendingDynamicLinkData.getLink().getQueryParameter("oobCode"));
从动态链接获取查询参数(在这种情况下,获取我们用于重置密码的密码代码。
在上一步中使用oobCode并在按钮单击(从使用输入的editText字段中获取密码)中调用FirebaseAuth.getInstance().confirmPasswordReset(actionCode, password)
来重置密码。
理想情况下,密码重置后,我想登录我的用户。为此,我需要重置密码时使用的电子邮件地址(我需要从尝试登录的用户那里获取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控制台中创建的动态链接传递自定义查询参数?如果没有,什么是最好的方法?
任何帮助将不胜感激。预先感谢!
答案 0 :(得分:1)
您需要先获取链接
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class ProjectService {
private project = {
title: '',
image: '',
};
getProject() {
return this.project;
}
setProject(option: any, value: any) {
this.project[option] = value;
}
}
并使用subString获取电子邮件值
pygame.init()
done = False
display_width = 800
display_height = 600
BASE_PATH = abspath(dirname(__file__))
FONT_PATH = BASE_PATH + '/fonts/'
IMAGE_PATH = BASE_PATH + '/sprites/'
SOUND_PATH = BASE_PATH + '/sounds/'
SCORE_PATH = BASE_PATH + '/scores/'
#-----------------------------------------------------------------------------#
#Classes and Functions
#objects
all_sprites = pygame.sprite.Group()
################################################################################
#Enemy class
#Creates class image and positons and size, true or false statments for movement and updating positions
##############################################################################################
class Enemy(pygame.sprite.Sprite):
def __init__(self,x,y,direction,enemy_type):
pygame.sprite.Sprite.__init__(self)
self.EnemyType = enemy_type
self.Direction = direction
if enemy_type == 1:
enemy_image = pygame.image.load("sprites\\enemy1_1.png")
self.Speed = 1
self.Score = 5
if enemy_type == 2:
enemy_image = pygame.image.load("sprites\\enemy1_1.png")
self.Score = 15
self.Speed = 1
if enemy_type == 3:
enemy_image = pygame.image.load("sprites\\enemy1_1.png")
self.Score = 10
self.Speed = 1
if enemy_type == 4:
enemy_image = pygame.image.load("sprites\\enemy1_1.png")
self.Score = 20
self.Speed = 1
if enemy_type == 5:
enemy_image = pygame.image.load("sprites\\enemy1_1.png")
self.Score = 25
self.Speed = 1
self.image = pygame.Surface([26, 50])
self.image.set_colorkey(BLACK)
self.image.blit(enemy_image,(0,0))
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
def move_enemy(self):
if self.Direction == "right":
self.rect.x += self.Speed
if self.Direction == "left":
self.rect.x -= self.Speed
#draw image
def draw(self, screen):
screen.blit(self.image, self.rect)
allEnemies = pygame.sprite.Group()
a_enemies = Enemy(200,200,"right",1)
allEnemies.add(a_enemies)'''
#############################################################################################
#function: in game screen
#draws and calls classes and any functions that will be needed when playing the game
###########################################################################################
'''def screen_game():
global lives
global score
global gameDisplay
game_screen = True
#For X coords
spawnPositions = [90,180,270,360,450,540,630]
yCoord = 10
#creating enemies
for n in range(5):
for i in range(len(spawnPositions)):
xCoord = spawnPositions[i]
enemy_type = random.randint(1,5)
enemy = Enemy(xCoord, yCoord,"right", enemy_type)
allEnemies.add(enemy)
yCoord = yCoord + 50
#creating one player
player = Player(500,500, 'sprites\\ship.png')
#game loop
while game_screen:
#handling events
eventlist = pygame.event.get()
for event in eventlist:
#print(event)
if event.type == pygame.QUIT:
pygame.quit()
quit()
#handle arrow keys
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
player.handle_event(event)
if event.key == pygame.K_RIGHT:
player.handle_event(event)
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
player.handle_event(event)
if event.key == pygame.K_RIGHT:
player.handle_event(event)
#draw game display
gameDisplay.fill(BLACK)
#draw player class
player.update()
player.draw(gameDisplay)
#update enemy positions
loop = 0
for enemy in (allEnemies.sprites()):
if enemy.rect.x < 0:
enemy.rect.y = enemy.rect.y + 10
enemy.Direction = "right"
if enemy.rect.x > 625:
enemy.rect.y = enemy.rect.y + 10
enemy.Direction = "left"
loop =+1
for enemy in (allEnemies.sprites()):
enemy.move_enemy()
#draw enemies
allEnemies.draw(gameDisplay)
#update display
pygame.display.update()
clock.tick(60)