使用 Cloud Code 和 PFFacebookUtils 覆盖电子邮件/用户名
Posted
技术标签:
【中文标题】使用 Cloud Code 和 PFFacebookUtils 覆盖电子邮件/用户名【英文标题】:Overriding Email/Username with Cloud Code and PFFacebookUtils 【发布时间】:2014-12-25 00:25:07 【问题描述】:在使用 Parse 服务时,我试图让用户跳过登录字段,方法是通过 Facebook 登录应用程序并使用 Facebook 信息填写字段。我正在使用 Parse 的 Cloud Code 来使 swift 客户端代码尽可能简单。但是,当我尝试使用云代码设置Parse.User
的用户名和电子邮件地址字段时,我收到了来自Parse.Cloud
的一点回话。在应用内运行时出现以下错误。
[Error]: Can't modify username in the before save trigger (Code: 141, Version: 1.6.1)
当删除用户名功能时,我收到:
[Error]: Can't modify email in the before save trigger (Code: 141, Version: 1.6.1)
通过相同的代码,我还使用相同的方法设置firstName
和lastName
,没有任何错误。下面是使用的代码。
[云代码]
function pad(num, size) return ('000000000' + num).substr(-size);
Parse.Cloud.beforeSave(Parse.User, function (request, response)
var token = request.object.get("authData").facebook.access_token
Parse.Cloud.httpRequest(
url: 'https://graph.facebook.com/v2.1/me?fields=first_name,last_name,email&access_token=' + token,
success: function(httpResponse)
var responseData = httpResponse.data;
request.object.set("email", responseData.email) // <- Error Occurs Here
request.object.set("username", responseData.email.split("@")[0].concat(".", pad(Math.floor(Math.random()*10000),4))) // <- Error Occurs Here
request.object.set("firstName", responseData.first_name)
request.object.set("lastName", responseData.last_name)
response.success()
,
error: function()
response.error("Something went wrong.")
)
)
[SWIFT 代码]
@IBAction func loginWithFacebookButtonAction(sender: AnyObject)
loginWithFacebookButtonOutlet.setTitle("Logging In...", forState: UIControlState.Normal)
let permissions = ["public_profile", "user_friends", "email"]
PFFacebookUtils.logInWithPermissions(permissions,
(user: PFUser!, error: NSError!) -> Void in
if user == nil
println("Uh oh. The user cancelled the Facebook login.")
else if user.isNew
println("User signed up and logged in through Facebook!")
self.performSegueWithIdentifier("facebookToApp", sender: self)
else
println("User logged in through Facebook!")
self.performSegueWithIdentifier("facebookToApp", sender: self)
)
我在这里遇到的其他问题是当用户尝试使用.save()
而不是response.success()
时引起的,这在这种情况下似乎不是问题。
非常感谢。
【问题讨论】:
我也有同样的问题,你解决了吗? 我已经放弃了这个问题,并假设这是 Parse 用来确保输入完整性的硬编码预防措施。 @ChrisMartin 放弃这个问题,你的意思是你没有设法解决它吗?如果你解决了它,你是怎么做到的? 正如@MahmoudAdam 回答的那样,用户名和电子邮件字段必须是唯一的,因为这似乎是数据库上用户表的键控方式。授予用户对这些字段的访问权限可能会抵消表的完整性。我最终以 api 请求为代价节省了两次。 【参考方案1】:似乎username
& email
不能在beforeSave
触发器中更改,因为它们应该是唯一的
目前,无法在 beforeSave 上修改电子邮件字段,因为该字段应该是唯一的。如果您要使用另一个用户已经在使用的值,这将导致您的 beforeSave 方法无法处理的错误。
参考:https://www.parse.com/questions/why-cant-i-modify-the-email-field-in-a-before-save-trigger
【讨论】:
那么在注册/登录时检索 Facebook 电子邮件和用户姓名的最佳方法是什么?目前我能看到的唯一方法是在用户登录时从客户端执行此操作。即在云代码功能/作业与beforeSave
/afterSave
挂钩中执行此操作以规避错误。
我发现email
字段甚至不能以编程方式修改(即使用 Parse JS SDK 从 Node 环境运行脚本。真的很令人沮丧,实际上!以上是关于使用 Cloud Code 和 PFFacebookUtils 覆盖电子邮件/用户名的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Parse Cloud Code 和 Mandrill 发送电子邮件