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