Parse.com重新发送验证邮件

时间:2015-07-14 17:46:46

标签: email parse-platform verification

我正在使用Parse提供的电子邮件验证功能,并希望我的用户能够重新发送电子邮件验证,如果它无法发送或无法看到它。最后我看到,Parse没有提供一种内在的方法来做到这一点(愚蠢),人们已经半熟地编写代码来更改电子邮件,然后将其更改为触发重新发送。是否有任何更新或正在更改原始和后面的电子邮件仍然是唯一的方式?感谢

4 个答案:

答案 0 :(得分:3)

您只需将电子邮件更新为其现有值即可。这应该会触发另一封电子邮件验证。我无法测试代码,但这应该是你为各种平台做的。

// Swift
PFUser.currentUser().email = PFUser.currentUser().email
PFUser.currentUser().saveInBackground()

// Java
ParseUser.getCurrentUser().setEmail(ParseUser.getCurrentUser().getEmail());
ParseUser.getCurrentUser().saveInBackground();

// JavaScript
Parse.User.current().set("email", Parse.User.current().get("email"));
Parse.User.current().save();

答案 1 :(得分:1)

您必须将电子邮件地址设置为假邮件,然后将其设置回原始邮件地址,然后解析将触发验证过程。只是将其设置为它不会触发该过程。

iOS

           if let email = PFUser.currentUser()?.email {
                PFUser.currentUser()?.email = email+".verify"
                PFUser.currentUser()?.saveInBackgroundWithBlock({ (success, error) -> Void in
                    if success {
                        PFUser.currentUser()?.email = email
                        PFUser.currentUser()?.saveEventually()
                    }
                })
            }

答案 2 :(得分:0)

仔细分析Parse服务器的源代码,似乎没有任何公共API可以手动重新发送验证电子邮件。但是我能够找到2种未公开的方法来访问该功能。

第一种方法是使用服务器上的内部UserController(例如通过Cloud函数),如下所示:

import { AppCache } from 'parse-server/lib/cache'

Cloud.define('resendVerificationEmail', async request => {
    const userController = AppCache.get(process.env.APP_ID).userController
    await userController.resendVerificationEmail(
        request.user.get('username')
    )

    return true
})

另一种方法是利用用于验证网页的端点:

curl -X "POST" "http://localhost:5000/api/apps/press-play-development/resend_verification_email" \
     -H 'Content-Type: application/json; charset=utf-8' \
     -d $'{ "username": "7757429624" }'

如果您更新Parse并更改内部结构,两者都容易中断,但比更改用户电子邮件然后再将其更改回来更可靠。

我们将电子邮件设置为一个空字符串,但是发现存在一种竞争条件,其中2个用户会同时点击它,而1个失败则是因为Parse认为它是其他空白电子邮件的副本。在其他情况下,用户的网络连接将在这两个请求之间失败,并且将被阻塞而没有电子邮件。

答案 3 :(得分:-1)

要重新发送验证电子邮件,如上所述,您必须进行修改然后重新设置用户电子邮件地址。要以安全有效的方式执行此操作,可以使用以下云代码功能:

Parse.Cloud.define("resendVerificationEmail", async function(request, response) {
var originalEmail = request.params.email;
const User = Parse.Object.extend("User");

const query = new Parse.Query(User);
query.equalTo("email", originalEmail);
var userObject = await query.first({useMasterKey: true});

if(userObject !=null)
{
    userObject.set("email", "tmp_email_prefix_"+originalEmail);
    await userObject.save(null, {useMasterKey: true}).catch(error => {response.error(error);});

    userObject.set("email", originalEmail);
    await userObject.save(null, {useMasterKey: true}).catch(error => {response.error(error);});

    response.success("Verification email is well resent to the user email");
}

});

之后,您只需要从客户端代码中调用云代码功能即可。在Android客户端中,您可以使用以下代码(Kotlin):

 fun resendVerificationEmail(email:String){
    val progress = ProgressDialog(this)
    progress.setMessage("Loading ...")
    progress.show()

    val params: HashMap<String, String> = HashMap<String,String>()

    params.put("email",  email)

    ParseCloud.callFunctionInBackground("resendVerificationEmail", params,
        FunctionCallback<Any> { response, exc ->
            progress.dismiss()
            if (exc == null) {
                // The function executed, but still has to check the response
                Toast.makeText(baseContext, "Verification email is well sent", Toast.LENGTH_SHORT)
                    .show()
            } else {
                // Something went wrong
                Log.d(TAG, "$TAG: ---- exeception: "+exc.message)
                Toast.makeText(
                    baseContext,
                    "Error encountered when resending verification email:"+exc.message,
                    Toast.LENGTH_LONG
                ).show()

            }
        })
}