Email Parse.com重新发送验证电子邮件

Email Parse.com重新发送验证电子邮件,email,parse-platform,verification,Email,Parse Platform,Verification,我正在使用Parse提供的电子邮件验证功能,希望我的用户能够在电子邮件验证无法发送或无法看到时重新发送。上一次我看到,Parse并没有提供一种内在的方法来实现这一点(愚蠢),人们一直在半朦胧地编写代码来更改电子邮件,然后将其更改回以触发重新发送。是否对此有任何更新,或者将电子邮件从原始邮件更改回原始邮件仍然是唯一的方法?谢谢您只需将电子邮件更新为其现有值即可。这将触发另一个要发送的电子邮件验证。我还无法测试代码,但这应该是您在各种平台上进行测试的方式 // Swift PFUser.curren

我正在使用Parse提供的电子邮件验证功能,希望我的用户能够在电子邮件验证无法发送或无法看到时重新发送。上一次我看到,Parse并没有提供一种内在的方法来实现这一点(愚蠢),人们一直在半朦胧地编写代码来更改电子邮件,然后将其更改回以触发重新发送。是否对此有任何更新,或者将电子邮件从原始邮件更改回原始邮件仍然是唯一的方法?谢谢

您只需将电子邮件更新为其现有值即可。这将触发另一个要发送的电子邮件验证。我还无法测试代码,但这应该是您在各种平台上进行测试的方式

// 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();

您必须将电子邮件地址设置为假保存,然后将其设置回原始地址,然后解析将触发验证过程。仅将其设置为原来的状态不会触发该过程

iOS


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

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");
}
}))

之后,您只需要从客户端代码调用cloudcode函数。从Android客户端,您可以使用以下代码(Kotlin):

fun resendVerificationEmail(电子邮件:String){
val progress=ProgressDialog(此)
progress.setMessage(“正在加载…”)
progress.show()
val参数:HashMap=HashMap()
参数put(“电子邮件”,电子邮件)
ParseCloud.callFunctionInBackground(“resendVerificationEmail”,参数,
函数回调{响应,exc->
进度.解雇()
如果(exc==null){
//函数已执行,但仍必须检查响应
Toast.makeText(baseContext,“验证电子邮件发送良好”,Toast.LENGTH\u SHORT)
.show()
}否则{
//出了点问题
Log.d(标记“$TAG:----exeception:”+exc.message)
Toast.makeText(
baseContext,
“重新发送验证电子邮件时遇到错误:”+exc.message,
吐司,长度
).show()
}
})
}

浏览Parse server的源代码,似乎没有任何用于手动重新发送验证电子邮件的公共api。然而,我能够找到2种未记录的方式来访问该功能

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

从'parse server/lib/cache'导入{AppCache}
define('resendVerificationEmail',异步请求=>{
const userController=AppCache.get(process.env.APP\u ID).userController
等待userController.resendVerificationEmail(
request.user.get('username')
)
返回真值
})
另一个是利用用于验证网页的端点:

curl-X“POST”http://localhost:5000/api/apps/press-播放开发/重新发送\u验证\u电子邮件”\
-H'内容类型:应用程序/json;字符集=utf-8'\
-d$'{“用户名”:“7757429624”}
如果您更新解析并更改内部结构,两者都很容易中断,但应该比更改用户电子邮件然后再更改回来更可靠


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

据我所知,您过去可以做到这一点,但这不再有效。您必须将其设置为与原始值不同的值,保存,然后将其设置回原始值并保存。好的,我明天将检查我的代码,并让您知道我找到了什么。如果这不再有效,我将删除我的答案。德里,你发现了什么?
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");
}
 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()

            }
        })
}