-
Notifications
You must be signed in to change notification settings - Fork 16
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
FZU 登录流程 "应用没有权限" 错误 #18
Comments
// 登录前校验
function checkForm() {
var cllt = $("#cllt").val();
if(cllt=='userNameLogin'){
if(utils.requireInput($(LOGIN_USERNAME_ID),0,100,$("#showErrorTip"),inputUserNameTip,$(LOGIN_USERNAME_ID).parent())
|| utils.requireInput($(LOGIN_PASSWORD_ID),0,32,$("#showErrorTip"),inputPasswordTip,$(LOGIN_PASSWORD_ID).parent())){
return;
}
if (needCaptcha && captchaSwitch == "1" && utils.requireInput($(LOGIN_CAPTCHA_ID),0,10,$("#showErrorTip"),inputCodeTip,$(LOGIN_CAPTCHA_ID).parent())) {
return;
}
$("#saltPassword").val(encryptPassword($(LOGIN_PASSWORD_ID).val(),$("#pwdEncryptSalt").val()));
$(LOGIN_PASSWORD_ID).attr("disabled","disabled");
}else if(cllt=='dynamicLogin'){
if(utils.requireInput($(LOGIN_ACCOUNT_ID),0,100,$("#showErrorTip"),inputMobileTip,$(LOGIN_ACCOUNT_ID).parent())
|| utils.requireInput($(LOGIN_DYNAMIC_ID),0,100,$("#showErrorTip"),inputDynamicTip,$(LOGIN_DYNAMIC_ID).parent())){
return;
}
}
return true;
} 加密函数 function encryptAES(data, aesKey) {
if (!aesKey) {
return data;
}
var encrypted = getAesString(randomString(64) + data, aesKey, randomString(16));
return encrypted;
}
function encryptPassword(pwd0, key) {
try {
return encryptAES(pwd0, key);
} catch (e) {}
return pwd0;
} 密钥
|
cea 用的是 PC 网页端的 |
YES! 睡觉 |
刚好今天用golang写了下我们学校(NOTCLOUD)的模拟登录,看到你的这个错误(Status code 200, not 302)大概知道哪里漏了。我的登录流程如下:
以上。因为破学校前两天登录页又抽风,导致cea自动登录时返回Unauthorized 之前的登录地址是:http://id.fzu.edu.cn/authserver/login?service=https://fzu.campusphere.net/portal/login 也就是不需要从portal页面点登录携带sessionToken跳转到统一登录页,但现在直接登录返回: 不知道其他学校是否存在一样的情况 |
顺便提一下,看到edge-case.ts里面有福州大学,现在验证码的路径已经变了: http://id.fzu.edu.cn/authserver/**checkNeedCaptcha.htl**?username=xxx&_=1636638646618 这几天登不上很郁闷呐 |
cea/core/src/compatibility/edge-case.ts Lines 23 to 31 in 1c1b189
哈哈,看起来变回默认的情形了 |
为什么它们的更新感觉回滚到之前的老版本了 😂 |
后期考虑把这个边缘情形维护成一个 API (在加载学校配置时抓取),这样方便改动,Cea 也不用以发布新版本的方式来更新了,这样可以缩短更新周期 @Juaran |
现在遇到一个问题,在cea中发送POST请求到
不管账号密码是否正确,永远返回200,检查body为登录界面 |
检查了一下,是header里面的cookie 中的JSESSIONID与请求url对不上的原因,不管请求什么,都会返回200 |
上面提到的 我不觉得当前 Cea 在 https://github.com/ceajs/cea/blob/main/core/src/crawler/login.ts 文件内的 NOTCLOUD 学校登陆逻辑有问题。 十分感谢你们付出时间 DEBUG 并分享到这里 但是我还是没看出错误的地方,方便的话,能给个测试账号吗,邮箱 |
或者说一下完整的登录流程和 Cookie 的特点,也行 |
已实现,准备检查一下你们学校适配性后发布新版本,可以参考 #20 提交适配 |
刚刚看到,我等下回去发个账号 |
.....URLSearchParams 这个对象是不是限制了长度,发现execution被截断了. |
.....把截断的补全就正常302跳转了,应该是以前的exection 太短了,没有遇到url 字符限制. |
好,明天再研究研究 @luckycat0426 |
那个form index字段是为了定位general login 位置吧,为何不做成循环不同form表单,直到定位到general login为止,这样能少一个边缘情况,是因为出现了不兼容的情况吗? |
因为四种登录方式都有 general login,并且不同学校这个正确的表单中没有统一的可以区别其它几种登录方式的字段 |
这个限制应该只存在于把它真正用于 URL 请求时,Cea 是把字符放在 body 中请求的,没有限制 URLSearchParams 类并不会截断,node 源码中也没有相关证据,我写了一个小 demo, async function urlParamsLimit(len) {
const origalStr = 'a'.repeat(len)
const string = new URLSearchParams({ a: origalStr }).toString()
const urlStr = string.split('a=')?.[1]
if (urlStr) {
assertEq(origalStr, urlStr)
}
}
function assertEq(arg1, arg2) {
if (arg1 === arg2) {
console.log(`Test Passed!`)
} else {
throw new Error(`Failed with ${arg1} = ${arg2}`)
}
}
urlParamsLimit(1000000) |
截断问题没再复现了......可能是我哪里配置出错了. |
fzu 有个问题,我用浏览器登录想看下请求,你给的账号密码都是对的,登录后出现这个报错界面: |
txt乱码了,如果显示是
手机抓包也出现了该返回页面,但是能正常完成今日校园登陆. |
确实是这样提示的,能登录的话,行吧,现在就是要把 cea 的处理给适配好 |
现在还不能登上吗 @luckycat0426 |
我刚调试了下login.js,发现还是formIdx的问题 虽然文件vercel/data/school-edge-cases.json里的NOTCLOUD学校formIdx=2(这是正确的登录方式) 但调试运行时发现login.js引用的compatibility/edge-case.js内容依旧为2.2.1版本之前的那三个学校:
也就是说虽然版本更新后文件去除了福州大学的旧的登录方式,但是打包之后的node_modules里面的文件还是旧的 (缓存还是什么鬼原因不知道) 手动改了下idx=2就能登录了 |
因为我还在等你们确认再发布布新版本的😂 |
忘记提醒 @luckycat0426 了,因为新版是远程加载学校边缘信息的,所以要调试时需要先编译好,再手动运行 node internal/lib/src/cli.js load 再用 vscode 断点调试 |
没啥问题,赶快发布吧😄 |
const form = $('form[method=post]').get(schoolEdgeCases.formIdx);
console.log(schoolEdgeCases.formIdx); @Juaran @beetcb formindex我之前遇到截断的问题的时候就检查过,发现表单位置变换后,已经改成2测试过,之前询问能否自动匹配formindex也是于此相关,最后还是登陆不上去,所以推测是请求网址变动. |
嗯,我等下拿你的号试试 |
|
这种行为是符合预期的,因为 monorepo 的管理工具 lerna 会将那个文件夹软链接成 core/ |
还有是在 ts 文件里打断点,你这个界面我感觉不太对,似乎是 js 文件里打的 |
我在Linux系统下安装v2.2.1之后,直接修改: /usr/lib/node_modules/cea/node_modules/cea-core/lib/src/compatibility/edge-case.js 执行签到成功: 本地调试也是修改node_modules下cea-core内edge-case.js,签到成功 你试一下 @luckycat0426 |
我用你给的账号测试不能登录,Cea 的逻辑没错,跟用浏览器访问 问题是用最后 POST 账号密码阶段 fzu 返回的状态码是 200,并不会跳转到 campusphere 地址,所以也就拿不到今日校园 COOKIE,Cea 会根据返回码来确认登录结果的,所以会输出登陆失败 我感觉这无解啊,浏览器都登录不了,如果 @Juaran 同学能登陆,难道是你给的账号有问题? |
@Juaran 你应该是研究生吧,登陆验证和本科生可能不一样. |
返回了 |
我用我手机也试一下 |
我刚找小学弟shilexi试了下,他们学院登上去直接没有权限,肯定拿不到MOD_AUTH_CAS @luckycat0426 你的是这样吗 |
访问这个网址的时候headers 带着今日校园认证信息,之前的包没有看到set cookies,应该js生成的. |
@Juaran 也是这样 |
今早APP端登录抓包情况如下:
这里没有返回Set-Cookie,Location链接也没有跳转
到这里已经是今日校园的API了(登录成功),但是没有找到MOD_AUTH_CAS,猜测上一步的#mobile_token中应该隐藏了MOD信息 在后续API: http://ehall.fzu.edu.cn/newmobile/client/userStoreAppList 发现携带了MOD_AUTH_CAS信息 在进入主界面之后,又自动去请求了portal/login服务,然后被告知没有应用权限(手动滑稽): |
So can this problem be solved? |
fzu现在已经可以云端登录了好像 |
.....某些学校的边缘情况可能更加复杂,这几天我校好像更新了今日校园鉴权流程
不直接请求 今日校园的验证服务,
也可能是手机端流程原本就不一样,不知道cea是基于什么登陆流程实现的?
The text was updated successfully, but these errors were encountered: