首页 > 解决方案 > 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);

有谁知道我的后端代码有什么问题?还是用户端代码导致问题?

请帮我。我不是后端专家。

标签: node.jsgoogle-cloud-functions

解决方案


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


推荐阅读