如何从firebase_auth获取令牌

时间:2019-05-18 17:38:52

标签: flutter firebase-authentication google-cloud-functions

我想从firebase中获取身份验证令牌(电子邮件和密码身份验证)以在我的firebase云功能中进行身份验证。似乎函数getIdToken()和getToken()都不适用于firebase_auth软件包。

还有其他功能或者有更好的主意来确保只有经过身份验证的用户才能触发云功能?

var token = await FirebaseAuth.instance.currentUser.getIdToken();
var response = await httpClient.get(url,headers: {'Authorization':"Bearer $token"});

3 个答案:

答案 0 :(得分:0)

使用callable function对您来说将是最简单的,因为这样可以使您:

  1. 自动在请求中发送当前用户的uid。
  2. 在功能端非常容易知道是否在请求中提供了UID,如果没有提供,则拒绝服务。

flutter插件为here

但是,由于可调用函数只是普通HTTP连接的包装,因此您应该能够自己完成等效的工作。您有可能获取已登录用户的ID令牌。

答案 1 :(得分:0)

在这一点上,我同意@Doug的观点-可调用为您包装了它,并且会更容易-但是我的用例要求我进行HTTPS调用(函数中的onRequest)。另外,我认为您只是走在正确的道路上-但您可能未在自己的Cloud Functions中对其进行检查。

在您的应用中,您将致电:

_httpsCall() async {
  // Fetch the currentUser, and then get its id token 
  final user = await FirebaseAuth.instance.currentUser();
  final idToken = await user.getIdToken();
  final token = idToken.token;

  // Create authorization header
  final header = { "authorization": 'Bearer $token' };

  get("http://YOUR_PROJECT_BASE_URL/httpsFunction", headers: header)
  .then((response) {
    final status = response.statusCode;
    print('STATUS CODE: $status');
  })
  .catchError((e) {
    print(e);
  });
}

在您的函数中,您将检查令牌:

export const httpsFunction = functions.https.onRequest((request, response) => {
  const authorization = request.header("authorization")

  if (authorization) {
    const idToken = authorization.split('Bearer ')[1]
    if (!idToken) {
      response.status(400).send({ response: "Unauthenticated request!" })
      return
    }

    return admin.auth().verifyIdToken(idToken)
    .then(decodedToken => {
      // You can check for your custom claims here as well
      response.status(200).send({ response: "Authenticated request!" })
    })
    .catch(err => {
      response.status(400).send({ response: "Unauthenticated request!" })
    })
  }

  response.status(400).send({ response: "Unauthenticated request!" })
})

请记住:

如果我没记错的话,这些令牌有效期为1个小时,如果您要将它们存储在某个地方,请注意这一点。我已经在本地进行了测试,每次仅花费200〜500毫秒-仅获得id令牌,在大多数情况下开销并不那么大-但这很重要。

答案 2 :(得分:0)

import 'package:firebase_messaging/firebase_messaging.dart';
.
.
.

final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();

@override
Future<void> initState() {
  super.initState();

  _firebaseMessaging.getToken().then((token) {
    assert(token != null);
    print("teken is: " + token);
  });
}