node.js - Firebase Cloud Function Volley Post 请求返回意外的响应代码 500
问题描述
我尝试使用 Volley POST 请求调用 Clound 函数,但它返回错误 Unexpected response code 500。此代码的作用基本上是向用户请求一个令牌字符串,然后用新信息重新格式化它,然后将新令牌返回给用户。
这是Java代码
RequestQueue mRequestQueue = Volley.newRequestQueue(this);
StringRequest mCloudRequest = new StringRequest(Request.Method.POST,
"my_function_url_from_firebase", new Response.Listener<String>() {
@Override
public void onResponse(String response) {
signInToFirebaseWithCustomToken(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("id_token", huaweiAccount.getIdToken());
params.put("uid", uid);
params.put("name", huaweiAccount.displayName);
if (huaweiAccount.email != null) {
params.put("email", huaweiAccount.email);
} else {
params.put("email", "");
}
params.put("photoURL", "");
return params;
}
};
这是 index.js 文件。
const app = express();
const bodyParser = require('body-parser');
const PORT = process.env.PORT || 5000;
const functions = require('firebase-functions');
// Firebase Admin SDK
const admin = require('firebase-admin');
const serviceAccount = require('./serviceAccountKey.json');
// For make network calls
const request = require('request-promise');
// Initialize Firebase Admin
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: 'my_firebase_server_url',
});
// Initialize Express and create endpoint
app
.use(bodyParser.json()) // Parse json in request body
.use(bodyParser.urlencoded({
extended: true,
}))
.post('/createCustomToken', (req, res) => {
if (req.body.id_token === undefined) {
// idToken is not find
const ret = {
error_message: 'id_token not found',
};
return res.status(400).send(ret);
}
// Verify idToken
// Create new user on Firebase if user doesn't exist
// Generate custom auth token
// Return client
return verifyHuaweiToken(req.body)
.then((customAuthToken) => {
const ret = {
firebase_token: customAuthToken,
};
return res.status(200).send(ret);
}).catch((err) => {
return res.status(400).send(err);
});
})
.listen(PORT, () => console.log(`Listening on ${ PORT }`));
// Verify idToken on Huawei Server
function verifyHuaweiToken(body) {
return request({
method: 'GET',
uri: 'https://oauth-login.cloud.huawei.com/oauth2/v3/tokeninfo?id_token=' + body.id_token,
json: true,
}).then((response) => {
// Token invalid. Throw an error and stop process
if (response.error !== undefined) {
return Promise.reject(new Error('Something went wrong'));
}
// Get user
return getFirebaseUser(body);
}).then((userRecord) => {
// After user created on Firebase, create new custom token based on user uid
return admin.auth().createCustomToken(userRecord.uid);
}).then((token) => {
// Return token to client
return token;
});
}
function getFirebaseUser(body) {
const firebaseUid = 'huawei_' + body.uid;
// Find user by user uid
return admin.auth().getUser(firebaseUid).then(function(userRecord) {
return userRecord;
}).catch((error) => {
// If user is not exist on Firebase, create new one
if (error.code === 'auth/user-not-found') {
return admin.auth().createUser({
uid: firebaseUid,
displayName: body.name,
photoURL: body.picture,
email: body.email,
});
}
return Promise.reject(error);
});
}
exports.app = functions.https.onRequest(app);
有谁知道我的后端代码有什么问题?还是用户端代码导致问题?
请帮我。我不是后端专家。
解决方案
firebase 函数中创建自定义令牌的一个简单示例如下所示:
const functions = require('firebase-functions');
const firebaseAdmin = require('firebase-admin');
const express = require('express');
const app = express();
firebaseAdmin.initializeApp({
serviceAccountId: 'SERVICE-ACCOUNT_EMAIL',
databaseURL: 'https://PTOJECT-id.firebaseio.com'
});
app.post('/token', async (req, res) => {
try {
const token = await firebaseAdmin.auth().createCustomToken(req.body.userUID);
res.status(200).send(token)
} catch (error) {
res.status(500).send("something went wrong")
}
});
module.exports.app = functions.https.onRequest(app);
确保您的服务帐户至少具有iam.serviceAccounts.signBlob
角色中包含的权限roles/iam.serviceAccountTokenCreator
推荐阅读
- mysql - 如何更改我的 sql 数据库中的扩展名?
- python - Python:将未初始化的类放在变量中
- java - 删除字符串中的空格而不删除换行符
- python - asyncio.DatagramTransport.send 是否会因 CPU 计算而饿死?
- esbuild - esbuild 在没有安装包的情况下失败
- python - 使用 Python 将数字列插入现有文件
- vba - VBA 获取网站上 PDF 文件的名称和创建日期
- c# - Json 参数没有获取我给它的数据
- javascript - 如何在声明之前将组件的 id 发送到函数?
- emacs - 有人可以向我展示一个为 Erlang 工作的带有 lsp-mode 的 Emacs 的示例配置吗?