【发布时间】:2021-06-25 13:10:42
【问题描述】:
我正在开发一个项目,该项目使用自定义声明使用户成为管理员。 我的客户希望能够删除用户的管理员权限,但我很难删除它们。目前我的函数有这个代码:
// Remove token
exports.removeToken = functions.https.onCall((data, context) => {
return admin.auth().getUserByEmail(data.email).then(user => {
return admin.auth().setCustomUserClaims(user.uid,{
claim: null
})
}).then(()=> {
return {
message: `Success! ${data.email} has been removed as an admin.`
}
}).catch (err => {
return err;
});
});
对于组件本身,代码是这样的
import React, { Component } from 'react'
const firebase = require("firebase");
export default class RemoveAdmin extends Component {
state = {
removeAdminEmail: '',
results: ''
}
updateEmail = (e) => {
this.setState({
removeAdminEmail: e.target.value
})
}
updateUserStatus = (Email) => {
firebase.firestore().collection('users').doc(Email).update({
accountStatus: "User"
})
}
removeAdmin = (e) => {
e.preventDefault();
const removeAdminRole = firebase.functions().httpsCallable('removeToken');
removeAdminRole({email: this.state.removeAdminEmail}).then(this.setState({ results: "This user is no longer an admin"}))
this.updateUserStatus(this.state.removeAdminEmail)
}
render() {
const result = this.state.results ? <div className = "ResultsBox">{this.state.results}</div> : ''
return (
<div className = "AddAdminForm">
<form className = "admin-actions" onSubmit={this.removeAdmin}>
<p> Remove Admin </p>
<input type = "email" placeholder = "Enter users email address" id = "admin-email" onChange={this.updateEmail} required/>
<button type="submit"> Make Admin </button>
{result}
</form>
</div>
)
}
}
基本上,管理员输入他们想要删除权限的用户的电子邮件地址,然后给他们一个自定义声明并将数据库中的“accountStatus”字段更改回用户。
我收到以下错误消息
Unhandled Rejection (Error): internal
这并没有给我太多信息!
【问题讨论】:
-
如果记录错误会得到什么:
.catch (err => { console.log(err);return err;});? -
实际上,如果
userID是正确的用户ID,则执行setCustomUserClaims(userID, {claim: null})不会产生任何错误。您的电子邮件可能有问题。除了按照上述建议记录错误之外,您能否检查它的值。 -
@RenaudTarnec 感谢您的帮助!我目前在我的控制台中收到此错误```从源'localhost:3000'获取'LINK TO FUNCTION'的访问已被CORS策略阻止:对预检请求的响应未通过访问控制检查:预检请求不允许重定向。 ```
-
您应该尝试同时部署 Cloud Function 和应用程序,或者使用模拟器并将您的应用程序连接到模拟器。见firebase.google.com/docs/emulator-suite/connect_functions
-
@RenaudTarnec 这行得通!我不确定这是否是问题所在,或者是否是因为我不小心部署到项目的不同版本>。
标签: javascript firebase-authentication google-cloud-functions firebase-admin