Oauth2.0中redirect_uri的问题

发布于 2022-09-07 16:21:25 字数 2673 浏览 16 评论 0

看了Oauth2.0的相关知识后想自己开发一个认证服务器,现在有这样一个疑问。
客户端请求的redirect_uri是一个客户端的接口地址还是页面地址呢?
如果是一个页面地址,那是不是认证服务器在返回授权码的时候就要跳转到这个重定向地址了?跳转过去之后,这个重定向的页面将立即带着code去服务器请求access_token?我这样的理解正确吗?

补充代码:
3000端口表示第三方客户端,3001为认证服务器
第一步:浏览器点击登录后跳转到认证服务器的登录页面(3000跳转到3001)

$('#loginBtn').click(function(){
        window.location.href="http://127.0.0.1:3001/loginPage.html?response_type=code&client_id=test001&redirect_uri=http://127.0.0.1:3000/api/callback";
    })

第二步:输入用户名密码后点击登录去获取授权码
(3001上的登录页面请求/oauth2/authorize来获取授权码)

// 3001上登录页面请求授权码
function userLogin() {
            let userName = $('#username').val();
            let userPass = $('#userpass').val();
            $.ajax({
                url: '127.0.0.1:3001/oauth2/authorize',
                methods: 'GET',
                data: {
                    'signName': userName,
                    'signCode': userPass,
                    'response_type': getUrlParam('response_type'),
                    'client_id': getUrlParam('client_id'),
                    'redirect_uri': getUrlParam('redirect_uri')
                },
                success: function (res) {
                    console.log("success", res);
                },
                error: function (err) {
                    console.log("error:", err)
                }
            });
        }
        //获取url参数方法
        function getUrlParam(name) {
            var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
            var r = window.location.search.substr(1).match(reg);
            if (r != null) return unescape(r[2]); return null;
        }

认证服务器/oauth2/authorize接口

// 3001认证服务器上的接口(3001认证服务器返回授权码给3000客户端上的redirect_uri)
App.use('/oauth2/authorize', function(req,res){
    // 一系列的检验操作
    var code = '123';
    var redirect_uri = req.query.redirect_uri;
    res.redirect(redirect_uri+'&code='+code)  //重定向到3000客户端
});

第三步:redirect_uri接口拿到授权码后再向认证服务器请求access_token(3000请求3001获取token)

// 3000客户端上redirect_uri接口的实现
App.use('/api/callback', function(req,res){
    var code = req.query.code;
    var redirect_uri = '127.0.0.1:3000/api/callback';
    $.ajax({
        url: '127.0.0.1:3001/oauth2/get_token',
        methods: 'GET',
        data: {
            'code': code,
            'redirect_uri': redirect_uri,
            'grant_type':'authorization_code'
        },
        success: function (res) {
            console.log("success", res);
            // 返回给浏览器登录成功的页面
        },
        error: function (err) {
            console.log("error:", err)
        }
    })
});

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

难忘№最初的完美 2022-09-14 16:21:25

客户端请求的redirect_uri是一个客户端的接口地址还是页面地址呢?

一般是页面地址,并且是服务端的页面地址(或者说返回数据为html的接口),执行自己的逻辑(比如判断是由认证服务器回调的还是伪装的)。当你跳转到认证服务器,此时一切都不归你管,认证成功之后需要返回到你的网站让用户继续走下面的流程。

没看懂你的第三步是什么意思?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文