使用OAuth隐式登录的Thinktecture Identity Server

时间:2014-04-25 07:05:14

标签: oauth thinktecture-ident-server

我正在尝试使用javascript登录OAuths客户端中的身份服务器。我可以登录并返回返回网页成功。 我遇到了一个问题,为什么Thinktecture身份服务器总是返回'#'而不是'?'在查询字符串中的参数之前,这是一个错误吗?

另一个问题是,当我有access_token时,如何才能获得使用声明?

2 个答案:

答案 0 :(得分:0)

隐式流使用散列片段而不是查询字符串 - 这不是错误(请查看OAuth2规范)。

客户端不使用OAuth2中的访问令牌 - 它对客户端是不透明的 - 访问令牌应由后端使用。

答案 1 :(得分:0)

我用正则表达式编写一个javascript函数来提取“access_token”参数,如下所示:

    var _access_token = getParameterByName('access_token');        
    function getParameterByName(name) {
        var str = location.hash.substring(1);
        var patt1 = new RegExp(name + "\\s*=\\s*([^&]+)", "g");
        var result = patt1.exec(str);;
        if (result == null)
            return "";
        else
            return result[1];
    }

然后我尝试使用base64解码access_token以获取声明:

    var Claims = base64decode(access_token) 
    function base64decode(input) {
    var output = "";
    var chr1, chr2, chr3;
    var enc1, enc2, enc3, enc4;
    var i = 0;

    input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

    while (i < input.length) {

        enc1 = this._keyStr.indexOf(input.charAt(i++));
        enc2 = this._keyStr.indexOf(input.charAt(i++));
        enc3 = this._keyStr.indexOf(input.charAt(i++));
        enc4 = this._keyStr.indexOf(input.charAt(i++));

        chr1 = (enc1 << 2) | (enc2 >> 4);
        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
        chr3 = ((enc3 & 3) << 6) | enc4;

        output = output + String.fromCharCode(chr1);

        if (enc3 != 64) {
            output = output + String.fromCharCode(chr2);
        }
        if (enc4 != 64) {
            output = output + String.fromCharCode(chr3);
        }

    }

    output = Base64._utf8_decode(output);

    return output;

}