在javascript和axios中为来自前端的每个api调用发送firebase身份验证令牌

     2023-03-10     218

关键词:

【中文标题】在javascript和axios中为来自前端的每个api调用发送firebase身份验证令牌【英文标题】:send firebase authentication token for every api call from frontend in javascript and axios 【发布时间】:2021-06-02 17:48:19 【问题描述】:

我正在构建一个使用 firebase 身份验证的网络应用程序。我正在尝试将 firebase 令牌发送到每次调用的后端 API。 我可以检索令牌并将其打印在控制台中,但是每当我尝试将其发送到后端时,令牌似乎都是空的。 我使用的后端是 Python django,

这是我尝试过的,

token.js

function clienttoken()
    
        firebase.auth().onAuthStateChanged(function myuser(user) 
        if (user) 

    //window.location.href = 'index.html';
    firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) 
  // Send token to your backend via HTTPS
        var token = idToken;
        window.alert(token);
        //return token;
  )
        );
  

我能够在控制台中成功打印令牌。

当我尝试在 index.html 中使用它时

<script>
      (function () 
        var output = document.getElementById('output');
        document.getElementById('post').onclick = function mydata () 
          var data = document.getElementById('data').value;
          
          
          var token =  clienttoken();
          
          //window.alert(token);

            
            const config = 
                headers:  Authorization: 'Bearer' +token  
            ; 
            
          axios.post('http://127.0.0.1:7000/posts/', mydata.data,config)
            .then(function (res) 
              //output.className = 'container-fluid';
                resp = JSON.stringify(res.data.body);
                resp_new=resp.replace(/\\n/g,'\n')
              //output.innerHTML = JSON.stringify(res.data.body);
              $("#resp").text(resp_new);
              $("#resp").show()
            )
            .catch(function (err) 
              output.className = 'container text-danger';
              output.innerHTML = err.message;
            ); 
        ;
      )(); 
    </script>

Axios 甚至在获取令牌之前就开始执行,并且每次都会向后端发送一个空令牌。

我尝试使用异步功能 token.js

 async function retrievetoken()
            
            
        firebase.auth().onAuthStateChanged(async function mytoken(user) 
          if (user) 
            // User is signed in.
            
            
            const idtoken =  await firebase.auth().currentUser.getIdToken(/* forceRefresh */ true)
                        
                //window.alert(token);
                return idtoken;
          
            
           else 
            // No user is signed in.
            
            window.location.href = 'login.html';
          
        );

index.html

 <script>
          (function () 
            var output = document.getElementById('output');
            document.getElementById('post').onclick = function mydata () 
              var data = document.getElementById('data').value;
              
              async function retrievetoken()
              const token = await clienttoken();
              
              window.alert(token);
                ;
          )(); 
        </script>

我试图打印令牌,但我得到的只是[Object:Promise]。即使在异步调用之后,也会将空令牌发送到后端。

请帮助我了解如何为每个 API 调用发送 firebase 令牌。

还请找到我的后端编码,

class GetPostList(APIView):
    cred = credentials.Certificate(r'pathto/firebase-sdk.json')

    firebase_admin.initialize_app(cred)
    
    def post(self,request,format=None):
        
        
        jwt_token = request.META.get('Authorization')

        #jwt_token = request.headers['Authorization']

        decoded_token = auth.verify_id_token(jwt_token)
        uid = decoded_token['uid']


        endpoint = "https://jsonplaceholder.typicode.com/posts/"
        header = "Content-type": "application/json;charset=UTF-8"
        send_data = request.data

        if uid is not None:  
            response = requests.post(endpoint, json=send_data, headers=header)
            return Response(response.json())
        else:

            return Response('error': 'Token does not exist', status=401)

我认为我确信后端编码看起来不错。但是,我无法从前端为每个 API 调用发送令牌。

【问题讨论】:

为什么要把token 用大括号括起来? (这里: const config = headers: Authorization: 'Bearer' +token ; ) 【参考方案1】:

使用回调函数时,return 关键字返回的是回调函数,而不是原始函数。因此,您需要使用 await 关键字来等待 promise 解析,然后返回该值。

为避免这种情况,您应该使用firebase.auth().currentUser 来获取当前用户,而不是为用户登录或注销创建监听器。这还有一个好处,即您的函数不会在用户注销时重新运行等。

 async function retrieveToken() 
    const currentUser = firebase.auth().currentUser;
    if (user) 
            // User is signed in.
            const idToken = await firebase.auth().currentUser.getIdToken( /* forceRefresh */ true)
            // Because this return statement is no longer in a nested callback function, it now returns properly.
            return idtoken;
         else 
            // No user is signed in.
            window.location.href = 'login.html';
        
 

【讨论】:

如何在 axios 请求中为对象数组设置正确的类型?

】如何在axios请求中为对象数组设置正确的类型?【英文标题】:howtosetpropertypesinaxiosrequestforarrayofobjects?【发布时间】:2021-09-2112:56:17【问题描述】:我正在尝试为api请求编写axios服务,但我无法理解此错误:类型“AxiosResponse”... 查看详情

在 Pandas 中为 DataFrame 中的每一行返回多行

】在Pandas中为DataFrame中的每一行返回多行【英文标题】:ReturnmultiplerowsforeveryrowinaDataFrameinPandas【发布时间】:2020-04-3015:41:10【问题描述】:这是我想要执行的任务,我有大约7000个站点和50个类别的列表,每个类别每个月都有一... 查看详情

React Redux Axios:POST 请求未收到来自 redux 状态的凭据

】ReactReduxAxios:POST请求未收到来自redux状态的凭据【英文标题】:ReactReduxAxios:POSTRequestnotreceivingcredentialsfromreduxstate【发布时间】:2018-04-1904:39:52【问题描述】:我一直在对我的项目进行身份验证。我有一个提供JWT令牌的RESTapi后... 查看详情

如何在Javascript中为1到1000的奇数和偶数编写脚本?

】如何在Javascript中为1到1000的奇数和偶数编写脚本?【英文标题】:Howtodoascriptforoddandevennumbersfrom1to1000inJavascript?【发布时间】:2015-01-1001:53:36【问题描述】:我正在研究一本带有已解决示例的Javascript书籍,但有一个示例没有解... 查看详情

在 Django 中为来自客户端的请求和来自服务器的响应(REST API)压缩 JSON 有效负载。

】在Django中为来自客户端的请求和来自服务器的响应(RESTAPI)压缩JSON有效负载。【英文标题】:CompressJSONpayloadinDjangoforbothrequestfromclientandresponsefromserver(RESTAPI).【发布时间】:2015-07-1721:24:22【问题描述】:我想知道是否有一种方... 查看详情

在 Nuxt JS 中为 Axios 配置本地 php 端点

】在NuxtJS中为Axios配置本地php端点【英文标题】:ConfigurelocalphpendpointforAxiosinNuxtJS【发布时间】:2019-12-1312:23:05【问题描述】:我想使用Axios进行指向本地PHP文件的客户端AJAX调用。为什么选择PHP?我在一个简单的基于PHP的API中有... 查看详情

如何在 Javascript 中为 iOS 和 Android 创建可靠的指南针?

】如何在Javascript中为iOS和Android创建可靠的指南针?【英文标题】:HowdoIcreateareliablecompassforiOSandAndroidinJavascript?【发布时间】:2019-01-0615:37:35【问题描述】:我正在尝试在Javascript/JQuery中创建一个可靠的指南针(使用deviceorientation... 查看详情

如何使用 async/await 编写 .then 函数,以便捕获来自 axios 的响应(在单独的文件和方法中,在 vue 中)

】如何使用async/await编写.then函数,以便捕获来自axios的响应(在单独的文件和方法中,在vue中)【英文标题】:HowcanIwritea.thenfunctionwithasync/await,sothatIcancatchtheresponsefromaxios(inseperatefilesandmethods,invue)【发布时间】:2021-07-1922:27:05【... 查看详情

在 AXIOS 中为 GET 方法发送请求正文会引发错误

】在AXIOS中为GET方法发送请求正文会引发错误【英文标题】:SendingRequestbodyforGETmethodinAXIOSthrowserror【发布时间】:2019-05-2901:16:00【问题描述】:我有一个React应用程序,我正在将POST方法更改为GET请求正文。它适用于POST请求,但是... 查看详情

如何在primarySwatch小部件中为应用栏添加颜色,但颜色来自(fromARGB和fromRGBO)

】如何在primarySwatch小部件中为应用栏添加颜色,但颜色来自(fromARGB和fromRGBO)【英文标题】:howtoaddcolorsforappbarinprimarySwatchwidgetbutcolorisbefrom(fromARGBandfromRGBO)【发布时间】:2021-10-1716:40:54【问题描述】:我需要如何为primarySwatch调... 查看详情

在javascript中为datepicker设置maxDate和minDate,不起作用

】在javascript中为datepicker设置maxDate和minDate,不起作用【英文标题】:SetmaxDateandminDatefordatepickerinjavascript,notworking【发布时间】:2017-05-2412:18:23【问题描述】:我在Google中查看了很多教程和QA,并尝试了所有排列和组合技巧。我的... 查看详情

尝试使用 Axios 和 Vue Bootstrap 表显示来自 API 的数据

】尝试使用Axios和VueBootstrap表显示来自API的数据【英文标题】:TryingtouseAxiosandVueBootstraptabletodisplaydatafromAPI【发布时间】:2020-12-2607:28:19【问题描述】:大家好,所以我无法将此API中的数据显示到我的Vue引导表中。它给了我这个... 查看详情

反应应用程序中来自axios POST的空响应,rails服务器显示201状态

】反应应用程序中来自axiosPOST的空响应,rails服务器显示201状态【英文标题】:emptyresponsefromaxiosPOSTinreactapp,railsservershows201status【发布时间】:2019-01-1114:31:38【问题描述】:我有一个连接到RailsAPI的反应前端,使用Knock和JWT对用户... 查看详情

在 Safari 中为网站重新加载 javascript 和 css 文件

】在Safari中为网站重新加载javascript和css文件【英文标题】:ReloadjavascriptandcssfilesforawebsiteinSafari【发布时间】:2017-09-1317:12:50【问题描述】:这让我发疯。每个浏览器和设备都有自己的方式来清除缓存并重新加载.js和.css文件。例... 查看详情

使用 Ajax 时如何在 JavaScript 和 php 中为下拉菜单设置增量值

】使用Ajax时如何在JavaScript和php中为下拉菜单设置增量值【英文标题】:HowtoSetincrementalvaluefordropdownbothinJavaScriptandphpwhileusingAjax【发布时间】:2017-03-1900:21:53【问题描述】:我正在研究多动态下拉选项,并尝试在用户单击添加按... 查看详情

如何在 javascript 中为桌面和移动设备创建不同的点击行为?

】如何在javascript中为桌面和移动设备创建不同的点击行为?【英文标题】:Howtocreatedifferentonclickbehaviorfordesktopandmobileinjavascript?【发布时间】:2012-07-2108:57:10【问题描述】:我正在开发生成一段格式化文本的简单表单(你可以看... 查看详情

来自嵌套 Axios 请求的 VueJS 数据未在视图中呈现

】来自嵌套Axios请求的VueJS数据未在视图中呈现【英文标题】:VueJSdatafromnestedAxiosrequestsnotrenderinginview【发布时间】:2019-01-0606:55:41【问题描述】:我正在尝试使用VueJS和Axios在页面上列出来自API的一组帖子。我面临的问题是需要... 查看详情

如何在 axios 中为 POST - multipart/form-data 设置 MIME 类型?

】如何在axios中为POST-multipart/form-data设置MIME类型?【英文标题】:HowtosetMIMEtypeforPOST-multipart/form-datainaxios?【发布时间】:2019-08-2806:27:41【问题描述】:我需要使用MIME发送POST请求-multipart/form-data这是我对POST标头的默认配置:axios.d... 查看详情