如何在 Realm 数据库中更改用户密码。 iOS 应用程序

How to change a user's password in Realm data base. iOS App

大家好!

我正在开发一个 iOS 应用程序,它具有基于 MongoDB 领域的注册功能。不幸的是,他们没有提供任何示例如何处理注册用户或更改密码的电子邮件确认。目前,我正在尝试想出一种方法来提供 'forgot password?' 功能。

app.emailPasswordAuth.sendResetPasswordEmail(email: email)

调用上述代码后,用户将在提供的电子邮件中收到一条消息。消息包含一个 link,它将由我添加到我的 RealmUI 环境中的 MongoDB Realm 应用程序的脚本处理。我把这个脚本放在那里(其中的一部分是在 MongoDB 论坛上找到的,谢谢大家)。

<head>
<script src="https://unpkg.com/realm-web/dist/bundle.iife.js"></script>
<script>
const APP_ID = "app_id";
const app = new Realm.App({ id: APP_ID});
//Grab Tokens
const params = new URLSearchParams(window.location.search);
const token = params.get('token');
const tokenId = params.get('tokenId');

//Confirm client
app.emailPasswordAuth
.callResetPasswordFunction('email@email.com', 'SomethingButNotPassword123', [])
        .then(
    (value) => {
        console.log('SUCCESS');
        displayResult('SUCCESS');
    },
    (error) => {
        console.log(error);
        displayResult('error', err);
    }
);

 app.emailPasswordAuth
 .resetPassword(token, tokenId, 'newPassWord321')
 .then(() => displayResult('success'))
 .catch(err => displayResult('error', err))

//Display Message depending on result
function displayResult(result, err) {
    const message = document.getElementById("message");
    if (result === "success") {
        message.innerText = "Now you can reset your password";
    }
   else if (result === "error") {
       message.innerText = "Unable to change the password for this user. Please try again or contact our support team." + err;
   }
}
</script>

<title>E-mail Confirmation</title>
<style>
    h1 {text-align: center;}
    h3 {text-align: center;}
    h5 {text-align: center; background-color: whitesmoke;}
    p {text-align: center;}
    div {text-align: center;}
</style>
</head>
<body>
    <h1>App name</h1>
    <h3>Thanks for choosing our app!</h1>
    <h5 id = "message"></h5>
</body>
</html>

这段代码确实有效,它确实更改了给定电子邮件的密码,但是它不符合我的需要,因为它更改了预定义电子邮件的密码(代码中也定义了新密码)。我想要一个用户,在确认他们拥有从 iOS 客户端发送的电子邮件后。转到带有两个用于填充新版本密码的文本字段的 Web 页面,或者直接转到应用程序并在那里键入。我想通用 links 可以帮助我实现这种行为(我的意思是打开带有文本字段的网站或打开我的应用程序,取决于应用程序是否安装在 iPhone 上)。我假设我可以以某种方式将此脚本的第二部分放到网络上,并将我上面提到的那些文本字段放在那里。用户填写并按下按钮后,脚本执行 .resetPasword 方法。但是!

我如何了解 iOS 客户端从该脚本发送了哪封电子邮件? 我的意思是我需要知道 link(.sendResetPasswordEmail(email: email)方法已发送)被打开

这是真的可以执行吗,或者您知道另一种方法来处理 iOS 上基于领域的应用程序的密码重置功能?任何回应将不胜感激。谢谢。

实际上 callResetPasswordFunction() 是多余的,所以我(在我朋友的帮助下)稍微重构了我的代码,我打算 post 重置密码的工作解决方案。

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://unpkg.com/realm-web/dist/bundle.iife.js"></script>


    <title>Password resetting</title>
    <style>
        
        h5 { background-color: whitesmoke;}
        {
            text-align: center;
        }
       
    </style>
</head>
<body>
<h1>App name</h1>
<h3>Thanks for choosing our app!</h3>
<h5 id = "message"></h5>

<script>
    const APP_ID = "your app id";
    const app = new Realm.App({ id: APP_ID});
    //Grab Tokens
    const params = new URLSearchParams(window.location.search);
    const token = params.get("token");
    const tokenId = params.get("tokenId");

    if (!token || !tokenId) {
        alert('Token error')
    } else {
        saveNewPassword('desiredPassword', token, tokenId)
    }


    async function saveNewPassword(newPassword, token, tokenId) {
        console.log('token: ', token)
        console.log('tokenId: ', tokenId)
        console.log('new password: ', newPassword)

        try {
            await app.emailPasswordAuth.resetPassword({
                password: newPassword,
                token,
                tokenId,
            });
            console.log('Password has been changed')
            displayResult('success')
        } catch(err) {
            console.log('Save password error', err);
            displayResult('error')
        }
    }

    //Display Message depending on result
    function displayResult(result, err) {
        const message = document.getElementById("message");
        if (result === "success") {
            message.innerText = "The password has been changed";
        }
        else if (result === "error") {
            message.innerText = "error change password";
        }
    }

</script>
</body>
</html>