首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >访问受保护路由

访问受保护路由
EN

Stack Overflow用户
提问于 2018-05-17 05:57:18
回答 1查看 272关注 0票数 0

我刚刚开始使用JWT。我执行登录,并将令牌作为JSON响应发送到客户端。在成功登录sessionStorage后,我将其存储到,然后使用该令牌通过另一个ajax调用(GET)的头部访问保护路由,成功后将重定向到该页面。

我从保护/verify-user直接开始保护路由I am 重定向,并且没有路由E 229,但是自从E 130重定向<>E 231<>E 132头<代码>E 233都是E 134没有发送E 235我发现这个E 136解决方案E 237仅用于验证令牌。不过,我不知道这是不是好办法。

你认为如何?

我的登录在客户端

代码语言:javascript
运行
复制
   // Login POST 
    $('#frm-login').submit(function (e) {
        event.preventDefault()
        $('button').text('Please wait ...').prop('disabled')
        $.ajax({
            url: "/login-user",
            type: "POST",
            data: $('#frm-login').serialize(),
            dataType: "json"
        }).always(function (response) {
            $('button').text('Logging in').prop('disabled')
            console.log("Login", response)
            if (response.status == "error") {
                $('button').removeClass('lime').addClass('red').text('Log in failed. Try again.');
                return
            }
            localStorage.setItem('token', response.token);
            console.log(localStorage.token)
            $.ajax({
                type: "GET",
                url: "/verify-user",
                headers: {
                    'Authorization': 'Bearer ' + localStorage.token
                }
            }).always(function (response) {
                console.log("Access", response)
                if (response.status == "error") {
                    $('button').removeClass('lime').addClass('red').text('Log in failed. Try again.');
                    return
                }
                if (response.status == 301) {
                    $(location).attr('pathname', '/LIMELine/chatroom/');
                    //$('img#profile-img').attr('src', response.responseText.authData.user.avatar)
                    console.log(response)
                }
            });
        })
    })

我的登录在服务器

代码语言:javascript
运行
复制
/********************* LOGIN *********************/

app.post('/login-user', (req, res) => {
    user.loginUser(req.body, (err, jResult) => {
        if (err) {
            return res.send(jResult)
        }
        let token = jwt.sign({
            user: jResult,
        }, "supersecret")
        console.log(token);
        return res.json({
            token: token
        })
        //add other headers here...
    })
})

/********************* VERIFY USER *********************/

app.get('/verify-user', verifyToken, (req, res) => {

    jwt.verify(req.token, "supersecret", (err, authData) => {
        if (err) {
            return res.status(403).json({
                message: "No token found"
            });
        }
        return res.status(301).json({
            authData
        });
    })
})

保护路由,用户在登录时应该看到它。

代码语言:javascript
运行
复制
// *********************   MAIN PAGE *********************************************

app.get('/LimeLINE/chatroom' (req, res) => {
            try {
            // CODE FOR CONTENT OF THE PAGE
            return res.json({
                authData
            });
        }
    })
})
EN

回答 1

Stack Overflow用户

发布于 2018-05-17 07:41:29

如果您正在进行完整的页面重定向(不是通过ajax,而是通过浏览器自动进行重定向,就像单击未调好的锚标记时一样),浏览器将不会自动发送Authorization HTTP头。

您可以使用cookie开始发送JWT令牌(这不太标准,并将客户机绑定为浏览器,但将自动发生在所有完整页面和AJAX调用上),也可以通过ajax调用处理重定向。另一个“混合”解决方案是同时启用Authorization头和cookie作为有效的授权方法。

这一切都取决于您的服务器是否应该接受非浏览器客户端当前或在不久的将来。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50384251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档