Skip to content

Oauth跳转地址参数及默认跳转页面code解析问题 #1

@HansBug

Description

@HansBug

您好,这边经过简单的测试,发现在使用Oauth进行页面登陆后,跳转的地址使用#而非?分隔编码后的参数和URL路径(也就是说,参数会以fragment而非parameters的形式存在),例如:

https://oauth.cnblogs.com/auth/callback#code=210dd1ae7584ca228f3d2a84d6d557a83af96fe871e15aadf46180b3933c57a2&id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjlFMjcyMkFGM0IzRTFDNzU5RTI3NEFBRDI5NDFBNzg1MDlCMDc2RDAiLCJ0eXAiOiJKV1QiLCJ4NXQiOiJuaWNpcnpzLUhIV2VKMHF0S1VHbmhRbXdkdEEifQ.eyJuYmYiOjE1OTM1NjYzNjYsImV4cCI6MTU5MzU2NjY2NiwiaXNzIjoiaHR0cDovL29wZW5hcGlfb2F1dGgtc2VydmVyIiwiYXVkIjoiZjJhMWEwM2QtM2RiNy00MTU1LTg0M2ItYWNjYzlmY2FmY2RkIiwibm9uY2UiOiI2WUdWVDdZRzBNSzdCS1gyIiwiaWF0IjoxNTkzNTY2MzY2LCJjX2hhc2giOiJFcnZOYTM2Qng2UTk4RjRLbVNyMmdBIiwic2lkIjoiMTVjNjgyODYzMzVlOWFkZWM0NjRlNjAxMzhlNDYyMDUiLCJzdWIiOiIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAiLCJhdXRoX3RpbWUiOjE1OTM1MDgwOTgsImlkcCI6ImNuYmxvZ3Nfb2F1dGgiLCJhbXIiOlsiYXV0aG9yaXphdGlvbl9jb2RlIl19.QmE-ptQwpVhghUAmlgv3qFI4909RzqtOOSUZISebZ39v8wHpKNVWicowLdAVCt81B2EgS62A9O9vQxh8GrSL7I4aGc1gy6FP0XJ8Vx6DqVMx9Drg3R41wokJOanUUattLdAVKpQpgO3W80R-MC5_ZFN9XBS_YgCMSNMacgp4tddXlJxZULaixt7HDiieubAgHrwmrMF9nTfHnpddj1dnTOyNCjbukOBf9B7VzR1Qc31sKHjH03gAJeHhrXU58lW1h6oNRnZSHMGSvP3k8IybP9qI1Mvg-p1Qn-DaF81fr2n_ShKKZlLaTc4zYiulQKOlXZuQJbsLegT4FcUeit4F-A&scope=openid%20profile%20CnBlogsApi&state=LRNVJGMXIVZ0GCRA&session_state=vDJ3A55GTlsPdDP0P1jMsg5E025QQXTn27A8mQoi19U.ff01605d589d3938e962959c2403173a

在更换过redirect_uri后,也一样出现了类似的问题,分隔的符号为#而不是?这将导致在真正用于redirect到用户自己的地址时,由于code、state等数值性质为fragment,所以无法通过parameter进行后端数据解析(实际上可能根本都无法传到后端,毕竟锚点本身就是作用于前端,用于定位的),从而导致数据丢失

此外,在默认的跳转页面上,js对code的解析代码为

var url = window.location.href;
var codeElement = document.getElementById("code");
if (url.indexOf("code") > 0) {
    var strart_index = url.indexOf("=");
    var end_index = url.indexOf("&");
    var code_value = url.slice(strart_index + 1, end_index);
    codeElement.innerHTML = code_value;
} else {
    codeElement.innerHTML = "不好意思,授权码走丢了....."
}
$.post("/Users/SignOut");

该部分的解析思路完全基于对=&符号的定位,没有进行URL结构拆分,没有参考code字符串的位置,对于拆出来的内容也没有进行url解码。目前Oauth默认跳转页面上暂时显示正常是因为code参数常常处于第一个参数位置且字符串内容较为简单,这实际上有可能出现很多的状况,包括但不限于:

  • 有且仅有code一个参数(&将无法找到,code解析错误)
  • code参数并非位于第一个参数位(code解析结果将是第一个参数的值)
  • code参数包含复杂内容(没有进行URL解码)

希望以上问题可以尽快得到回应并修复,非常感谢

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions