【发布时间】:2021-10-25 21:40:29
【问题描述】:
我正在注册一位客户,将他们的 stripeID、uid 和电子邮件上传到我的 Firebase 实时数据库,然后将他们的个人资料图片上传到 Firebase 存储。但是,我想知道是否需要更新 Cloud Function 来将全名、用户名和个人资料图片添加到客户参考中?还是我需要重构我的 AuthService 函数?如果我确实需要更新功能,如何访问我的云功能的三个信息详细信息的常量?谢谢。
云函数
exports.createStripeCustomer = functions.https.onCall( async (data, context) => {
const email = data.email
const uid = context.auth.uid
if (uid === null) {
console.log('Illegal access attempt due to unauthenticated attempt.')
throw new functions.https.HttpsError('internal', 'Illegal access attempt')
}
return stripe.customers.create({
email : email
}).then( customer => {
return customer["id"]
}).then( customerId => {
admin.database().ref("customers").child(uid).set(
{
stripeId: customerId,
email: email,
id: uid
}
)
}).catch( err => {
throw new functions.https.HttpsError('internal', 'Unable to create Stripe customer.')
})
})
exports.updateCustomer = functions.database.ref("customers/{id}").onUpdate( (change, context) => {
})
AuthService
struct CustomerCredentials {
let email: String
let password: String
let fullname: String
let username: String
let profileImage: UIImage
}
static func createCustomer(credentials: CustomerCredentials, completion: @escaping(DatabaseCompletion)) {
guard let imageData = credentials.profileImage.jpegData(compressionQuality: 0.3) else { return }
let filename = NSUUID().uuidString
let storageRef = CUSTOMER_PROFILE_IMAGES.child(filename)
storageRef.putData(imageData, metadata: nil) { meta, error in
storageRef.downloadURL { url, error in
guard let profileImageUrl = url?.absoluteString else { return }
Auth.auth().createUser(withEmail: credentials.email, password: credentials.password) { result, error in
if let error = error {
debugPrint(error.localizedDescription)
return
}
guard let uid = result?.user.uid else { return }
let values = ["email" : credentials.email,
"uid" : uid,
"fullname" : credentials.fullname,
"username" : credentials.username,
"profileImageUrl" : profileImageUrl]
REF_CUSTOMERS.child(uid).setValue(values, withCompletionBlock: completion)
}
}
}
}
注册函数
@objc func handleCreateAccount() {
guard let profileImage = profileImage else {
self.simpleAlert(title: "Error", msg: "Please select a profile image.")
return
}
guard let fullname = fullnameTextField.text , fullname.isNotEmpty ,
let username = usernameTextField.text?.lowercased() , username.isNotEmpty ,
let email = emailTextField.text?.lowercased() , email.isNotEmpty ,
let password = passwordTextField.text , password.isNotEmpty ,
let confirmPassword = confirmPasswordTextField.text , confirmPassword.isNotEmpty else {
self.simpleAlert(title: "Error", msg: "Please fill out all fields.")
return
}
if password != confirmPassword {
simpleAlert(title: "Error", msg: "Passwords do not match, please try again.")
}
showLoader(true, withText: "Registering Account")
let credentials = CustomerCredentials(email: email, password: password, fullname: fullname,
username: username, profileImage: profileImage)
AuthService.createCustomer(credentials: credentials) { error, ref in
if let error = error {
Auth.auth().handleFireAuthError(error: error, vc: self)
self.showLoader(false)
return
}
Functions.functions().httpsCallable("createStripeCustomer").call(["email" : email]) { result, error in
if let error = error {
Auth.auth().handleFireAuthError(error: error, vc: self)
self.showLoader(false)
return
}
}
self.showLoader(false)
guard let window = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) else { return }
guard let tab = window.rootViewController as? MainTabController else { return }
tab.setupNavigationControllers()
self.dismiss(animated: true, completion: nil)
}
}
数据库参考
【问题讨论】:
-
如果您使用
Auth.auth()创建帐户,他们在哪里登录? -
他们使用
Auth.auth().signIn在登录控制器上登录 -
我很难理解这里有什么问题,您是否收到任何错误?
-
@Barraguesh,我无法将全名、用户名和个人资料图片保存到我的参考资料中。就像我的云功能正在取消我的 AuthService 功能中的所有内容。
-
已检查日志以了解可能拒绝它的原因?我建议检查受影响函数的回复是什么,看看服务器在说什么,如果事情不正常,一定是某个地方存在错误。
标签: swift firebase-realtime-database google-cloud-functions