Firebase动态链接(已创建控制台)使用ActionCodeSettings和“密码重置”支持自定义查询参数吗?

时间:2019-08-11 22:41:49

标签: android firebase firebase-authentication firebase-dynamic-links

是否可以在使用控制台创建的Firebase动态链接中传递自定义查询参数?

我的工作流程如下:

  1. 重置密码屏幕,该屏幕接收电子邮件并执行sendPasswordResetEmail(email, settings)

  2. 转到电子邮件并选择链接,该链接会打开应用程序以显示屏幕以重置密码: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

  3. 应用已启动,我们进入屏幕以输入新密码。

  4. 致电FirebaseDynamicLinks.getInstance().getDynamicLink(getIntent())

  5. 使用pendingDynamicLinkData.getLink().getQueryParameter("oobCode"));从动态链接获取查询参数(在这种情况下,获取我们用于重置密码的密码代码。

  6. 在上一步中使用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控制台中创建的动态链接传递自定义查询参数?如果没有,什么是最好的方法?

任何帮助将不胜感激。预先感谢!

1 个答案:

答案 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)