Node.js 如何使用axios登录OAuth

Node.js 如何使用axios登录OAuth,node.js,reactjs,mongodb,express,oauth-2.0,Node.js,Reactjs,Mongodb,Express,Oauth 2.0,上周,我刚开始通过Brad Traversy的MERN课程学习MERN stack: 在本课程中,他将前端和后端分离,并将后端用作RESTAPI。在后端,他有一个POST路由(/api/auth),返回一个JWT令牌,该api用于react应用程序axios。然后,响应用于头x-auth-token的值,以便身份验证中间件可以帮助进行身份验证。作为一名正在实习的计算机科学新手,我需要为我的公司制作一个内部使用的web应用程序,该应用程序使用slack OAuth进行身份验证。现在问题来了:当我使

上周,我刚开始通过Brad Traversy的MERN课程学习MERN stack: 在本课程中,他将前端和后端分离,并将后端用作RESTAPI。在后端,他有一个POST路由(/api/auth),返回一个JWT令牌,该api用于react应用程序axios。然后,响应用于头x-auth-token的值,以便身份验证中间件可以帮助进行身份验证。作为一名正在实习的计算机科学新手,我需要为我的公司制作一个内部使用的web应用程序,该应用程序使用slack OAuth进行身份验证。现在问题来了:当我使用axios时,响应是一些HTML代码,如下所示:

GET https://slack.com/oauth/authorize? 
scope=identity.basic,identity.email,identity.avatar&client_id=48321353297.675712837139 in postman, result:

<!DOCTYPE html>
<html lang="en-US" class="">
    <head>
        <script type="text/javascript">
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
    'gtm.start': Date.now(),
    'event' : 'gtm.js',
    'secure_page' : false,
});
var firstScript = document.getElementsByTagName('script')[0];
var thisScript = document.createElement('script');
thisScript.async = true;
thisScript.src = '//www.googletagmanager.com/gtm.js?id=GTM-KH2LPK';
firstScript.parentNode.insertBefore(thisScript, firstScript);
</script>
        <script type="text/javascript">
document.addEventListener("DOMContentLoaded", function(e) {
    var gtmDataLayer = window.dataLayer || [];
    var gtmTags = document.querySelectorAll('*[data-gtm-click]');
    var gtmClickHandler = function(c) {
        var gtm_events = this.getAttribute('data-gtm-click');
        if (!gtm_events) return;
        var gtm_events_arr = gtm_events.split(",");
        for(var e=0; e < gtm_events_arr.length; e++) {
            var ev = gtm_events_arr[e].trim();
            gtmDataLayer.push({ 'event': ev });
        }
    };
    for(var g=0; g < gtmTags.length; g++){
        var elem = gtmTags[g];
        elem.addEventListener('click', gtmClickHandler);
    }
});

        </script>
        <script type="text/javascript">
(function(e,c,b,f,d,g,a){e.SlackBeaconObject=d;
e[d]=e[d]||function(){(e[d].q=e[d].q||[]).push([1*new Date(),arguments])};
e[d].l=1*new Date();g=c.createElement(b);a=c.getElementsByTagName(b)[0];
g.async=1;g.src=f;a.parentNode.insertBefore(g,a)
})(window,document,"script","https://a.slack-edge.com/bv1-6-8cacda2/slack_beacon.bc058f2eca7b7d633d5a.min.js","sb");
window.sb('set', 'token', '3307f436963e02d4f9eb85ce5159744c');
sb('set', 'user_' + "batch", "signup_api");sb('set', 'user_' + "created", "2019-06-03");sb('set', 'user_id', "UK781P40Y");
sb('set', 'name_tag', "wemine" + '/' + "klaus.chau");
window.sb('track', 'pageview');
</script>
        <meta charset="utf-8">
        <script type="text/javascript">window.location.href = "https:\/\/slack.com\/oauth\/authorize?scope=identity.basic,identity.email,identity.avatar&client_id=48321353297.675712837139&tracked=1";</script>
    </head>
    <body></body>
</html>
GEThttps://slack.com/oauth/authorize? 
范围=identity.basic,identity.email,identity.avatar&client_id=48321353297.675712837139在邮递员中,结果:
window.dataLayer=window.dataLayer | |[];
window.dataLayer.push({
“gtm.start”:Date.now(),
“事件”:“gtm.js”,
“安全页面”:false,
});
var firstScript=document.getElementsByTagName('script')[0];
var thisScript=document.createElement('script');
thisScript.async=true;
thisScript.src='//www.googletagmanager.com/gtm.js?id=gtm-KH2LPK';
firstScript.parentNode.insertBefore(thisScript,firstScript);
document.addEventListener(“DOMContentLoaded”,函数(e){
var gtmDataLayer=window.dataLayer | |[];
var gtmTags=document.querySelectorAll('*[data gtm click]');
var gtmClickHandler=函数(c){
var gtm_events=this.getAttribute('data-gtm-click');
如果(!gtm_事件)返回;
var gtm_events_arr=gtm_events.split(“,”);
对于(var e=0;e
我认为问题在于它发送给我的是“确认登录页面”,而不是我需要的重定向URI中的jwt令牌。 即使我没有使用密码和电子邮件登录,我是否可以像Brad在课程中所做的那样实现? 谢谢 可供参考的资源:
您无法
Ajax
axios
request
XMLHttprequest
)获取OAuth或任何外部身份验证令牌。因为这里是流程

  • 单击
    登录
    按钮
  • 转到passport(或任何身份验证)路径
  • 身份验证提供程序重定向到原始OAuth提供程序(如fb、google、slack等)
  • 你可以登录他们的网站
  • 它重定向回passport应用程序的另一个路由,该路由解密请求正文并获取令牌
  • 它返回令牌 因此,基本上要使重定向(步骤3)起作用,您需要重定向或a href到passport路由(这将是一个GET路由),它将插入重定向到google/fb/slack


    希望您理解为什么不能使用Ajax从外部身份验证提供商获取数据。

    lookup
    passportjs
    和相关策略(例如slack策略)Hi Arita,我曾尝试在代码中实现它,但我仍然想知道如何使用axios从与原始链接不同的链接获取数据(例如,我想调用GET api/auth并从api/auth/redirect获取返回数据)。非常感谢。如果有帮助,请单击灰色勾号接受答案