Firebase Callable Function上下文未定义

时间:2019-09-13 03:39:13

标签: javascript firebase google-cloud-functions

我已根据以下教程编写了一个Firebase Http可调用云函数,该教程来自Firebase团队:https://www.youtube.com/watch?v=3hj_r_N0qMs。但是,由于未定义“ context.auth”,我的功能无法验证对用户(我)的自定义声明

我已经将firebase,firebase工具,firebase功能和admin SDK更新到最新版本。

我的函数/Index.ts文件

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp()

export const addAdmin = functions.https.onCall((data, context) => {
    if (context.auth.token.admin !== true) {
        return {
            error: 'Request not authorized'
        };
    }
    const uid = data.uid
    return grantAdminRole(uid).then(() => {
        return {
            result: `Request fulfilled!`
        }
    })
})

async function grantAdminRole(uid: string): Promise<void> {
    const user = await admin.auth().getUser(uid);
    if (user.customClaims && (user.customClaims as any).admin === true) {
        console.log('already admin')
        return;
    }
    return admin.auth().setCustomUserClaims(user.uid, {
        admin: true,
    }).then(() => {
        console.log('made admin');
    })
}

我的app.component.ts代码

makeAdmin() {
    var addAdmin = firebase.functions().httpsCallable('addAdmin');
    addAdmin({ uid: '[MY-USER-ID]' }).then(res => {
      console.log(res);
    })
    .catch(error => {
      console.log(error)
    })
  }

如果我不尝试访问“上下文”,则该函数执行良好,并且可以向该用户添加自定义声明。但是,如果尝试访问context.auth,则会发现错误:

Unhandled error TypeError: Cannot read property 'token' of undefined"

2 个答案:

答案 0 :(得分:0)

错误消息告诉您context.auth没有值。从API documentation可以看出,如果没有经过身份验证的用户发出请求,则auth将为null。这对我来说意味着您的客户端应用在请求可调用函数时没有登录用户,因此请确保在调用该函数之前是这种情况。如果允许在没有登录用户的情况下调用可调用函数的情况,则需要在代表该用户执行工作之前通过选中context.auth在函数代码中检查该情况。

答案 1 :(得分:0)

结果是我没有正确集成AngularFire函数。我在这里找到了解决问题的方法:https://github.com/angular/angularfire2/blob/master/docs/functions/functions.md

我将客户端组件代码更改为以下内容:

import { AngularFireFunctions } from '@angular/fire/functions';

//other component code

makeAdmin() {
    const callable = this.fns.httpsCallable('addAdmin');
    this.data$ = callable({ uid: '[USERID]' })
      .subscribe(resp => {
        console.log({ resp });
      }, err => {
        console.error({ err });
      });
  }