Oauth2.0中redirect_uri的问题

看了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)
        }
    })
});
阅读 16.1k
1 个回答
客户端请求的redirect_uri是一个客户端的接口地址还是页面地址呢?

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题