下面是我如何生成用于调用API的accessToken的代码。
import firebaseConfig from './../firebaseConfig';
import firebase from "firebase/app";
import "firebase/auth";
firebase.initializeApp(firebaseConfig);
var provider = new firebase.auth.GoogleAuthProvider();
firebase.auth().signInWithPopup(provider).then(function(result) {
var token = result.credential.accessToken;
sessionStorage.setItem("__token", token); // Token saved
}.bind(this)).catch(function(error) {
});
使用该代码,我将在sessionStorage中获取令牌。下面是我如何使用firebase Rest API的片段。
var URL = https://firestore.googleapis.com/v1/projects/qtbt-a8bf8/databases/(default)/documents/users/[USER_ID]?key=[YOUR_API_KEY]
var token = sessionStorage.getItem("__token");
const config = {
headers: { Authorization: `Bearer ${token}` , Accept: 'application/json'}
};
axios.get(URL, config)
.then(function (response) {
// handle success
console.log(response);
})
.catch(function (error) {
// handle error
console.log(error);
})
.finally(function () {
// always executed
});
在axios调用中,我得到错误403。响应:
code: 403
message: "Request had insufficient authentication scopes."
status: "PERMISSION_DENIED"
您在调用中缺少api键。apikey和token都应该在标头中。
var token = sessionStorage.getItem("__token");// verify your token is correct.
var headers = {'x-api-key' : 'key valu goes here', 'authorization': ${token} }
使用IdToken而不是OAuth令牌时,安全规则略有不同。
代替使用:
如果request.auth.uid==resource.id;
我使用:
如果request.auth.token.email==resource.id;
我正在将令牌的所有者电子邮件与文档id进行匹配,文档id恰好也是所有者的电子邮件。
您还可以使用以下内容访问用户的子文档:
request.auth.token.email==resource.data.ownerEa;
在这种情况下,要匹配的文档必须具有值为==用户电子邮件的属性ownerEa。
非常烦人的文档,不是吗?
希望能有所帮助。。。