簡體   English   中英

如何從 firebase_auth 獲取令牌

[英]How to get the token from firebase_auth

我想從 firebase(電子郵件和密碼身份驗證)獲取身份驗證令牌以在我的 firebase 雲 function 中進行身份驗證。函數 getIdToken() 和 getToken() 似乎都不適用於 firebase_auth package。

還有其他 function 還是有更好的主意來確保只有經過身份驗證的用戶才能觸發雲功能?

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

我同意@Doug 對此的看法 - callable 為您包裝了它並且會更容易 - 但我的用例要求我進行 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 令牌,這在大多數情況下並不是那么大的開銷 - 但很重要。

使用可調用函數對您來說將是最簡單的,因為它可以讓您:

  1. 請求中自動發送當前用戶的uid。
  2. 如果在請求中提供了 UID,在功能方面很容易知道,如果沒有提供,則拒絕服務。

顫振插件在這里

不過,您應該能夠自己完成等效的工作,因為可調用函數只是普通 HTTP 連接的包裝器。 您可以獲取登錄用戶的 ID 令牌。

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);
  });
}

從 firebaseAuth 獲取您的令牌並放入一個字符串中。

Future<Details> getDetails() async {
  String bearer = await FirebaseAuth.instance.currentUser!.getIdToken();
  print("Bearer: " + bearer.toString());
  String token = "Bearer ${bearer}";
  var apiUrl = Uri.parse('Your url here');

  final response = await http.get(apiUrl, headers: {
    'Authorization' : '${token}'
  });

  final responseJson = jsonDecode(response.body);

  return Details.fromJson(responseJson);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM