鍍金池/ 問(wèn)答/網(wǎng)絡(luò)安全  HTML/ Oauth2.0中redirect_uri的問(wèn)題

Oauth2.0中redirect_uri的問(wèn)題

看了Oauth2.0的相關(guān)知識(shí)后想自己開(kāi)發(fā)一個(gè)認(rèn)證服務(wù)器,現(xiàn)在有這樣一個(gè)疑問(wèn)。
客戶端請(qǐng)求的redirect_uri是一個(gè)客戶端的接口地址還是頁(yè)面地址呢?
如果是一個(gè)頁(yè)面地址,那是不是認(rèn)證服務(wù)器在返回授權(quán)碼的時(shí)候就要跳轉(zhuǎn)到這個(gè)重定向地址了?跳轉(zhuǎn)過(guò)去之后,這個(gè)重定向的頁(yè)面將立即帶著code去服務(wù)器請(qǐng)求access_token?我這樣的理解正確嗎?

補(bǔ)充代碼:
3000端口表示第三方客戶端,3001為認(rèn)證服務(wù)器
第一步:瀏覽器點(diǎn)擊登錄后跳轉(zhuǎn)到認(rèn)證服務(wù)器的登錄頁(yè)面(3000跳轉(zhuǎn)到3001)

$('#loginBtn').click(function(){
        window.location.;
    })

第二步:輸入用戶名密碼后點(diǎn)擊登錄去獲取授權(quán)碼
(3001上的登錄頁(yè)面請(qǐng)求/oauth2/authorize來(lái)獲取授權(quán)碼)

// 3001上登錄頁(yè)面請(qǐng)求授權(quán)碼
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參數(shù)方法
        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;
        }

認(rèn)證服務(wù)器/oauth2/authorize接口

// 3001認(rèn)證服務(wù)器上的接口(3001認(rèn)證服務(wù)器返回授權(quán)碼給3000客戶端上的redirect_uri)
App.use('/oauth2/authorize', function(req,res){
    // 一系列的檢驗(yàn)操作
    var code = '123';
    var redirect_uri = req.query.redirect_uri;
    res.redirect(redirect_uri+'&code='+code)  //重定向到3000客戶端
});

第三步:redirect_uri接口拿到授權(quán)碼后再向認(rèn)證服務(wù)器請(qǐng)求access_token(3000請(qǐng)求3001獲取token)

// 3000客戶端上redirect_uri接口的實(shí)現(xiàn)
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);
            // 返回給瀏覽器登錄成功的頁(yè)面
        },
        error: function (err) {
            console.log("error:", err)
        }
    })
});
回答
編輯回答
不舍棄
客戶端請(qǐng)求的redirect_uri是一個(gè)客戶端的接口地址還是頁(yè)面地址呢?

一般是頁(yè)面地址,并且是服務(wù)端的頁(yè)面地址(或者說(shuō)返回?cái)?shù)據(jù)為html的接口),執(zhí)行自己的邏輯(比如判斷是由認(rèn)證服務(wù)器回調(diào)的還是偽裝的)。當(dāng)你跳轉(zhuǎn)到認(rèn)證服務(wù)器,此時(shí)一切都不歸你管,認(rèn)證成功之后需要返回到你的網(wǎng)站讓用戶繼續(xù)走下面的流程。

沒(méi)看懂你的第三步是什么意思?

2018年4月15日 01:46