![](/img/trans.png)
[英]invalid-app-credential/Token mismatch in Flutter 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 令牌,這在大多數情況下並不是那么大的開銷 - 但很重要。
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.