wip: 디버그 코드 추가

This commit is contained in:
2026-02-17 19:12:28 +09:00
parent f2547fe207
commit 1b08aa0c58
4 changed files with 112 additions and 59 deletions
+3 -3
View File
@@ -1,6 +1,6 @@
import type { AutoLoginFailed, AutoLoginNonceResponse, AutoLoginResponse, LoginFailed, LoginResponse } from "./defs/API/Login";
import { APIPathGen } from "./util/APIPathGen";
import { callSammoAPI, extractHttpMethod, GET, POST, type APICallT, type APITail, type InvalidResponse, type RawArgType, type ValidResponse } from "./util/callSammoAPI";
import { callSammoAPI, extractHttpMethod, POST, type APICallT, type APITail, type InvalidResponse, type RawArgType, type ValidResponse } from "./util/callSammoAPI";
export type { ValidResponse, InvalidResponse };
const apiRealPath = {
@@ -18,7 +18,7 @@ const apiRealPath = {
hashedToken: string,
token_id: number,
}, AutoLoginResponse, AutoLoginFailed>,
ReqNonce: GET as APICallT<undefined, AutoLoginNonceResponse, AutoLoginFailed>
ReqNonce: POST as APICallT<undefined, AutoLoginNonceResponse, AutoLoginFailed>
},
} as const;
@@ -30,4 +30,4 @@ export const SammoRootAPI = APIPathGen(apiRealPath, (path: string[], tail: APITa
}
return callSammoAPI(method, path.join('/'), args, pathParam);
};
});
});
+68 -56
View File
@@ -40,7 +40,7 @@ function getToken(): [number, string] | undefined {
console.log('no token');
return;
}
const tokenItems = JSON.parse(trialToken) as [number, [number, string], string];
const tokenItems = JSON.parse(trialToken) as [number, [number, string], number];
if (tokenItems[0] != TOKEN_VERSION) {
console.log(tokenItems);
resetToken();
@@ -55,61 +55,73 @@ function resetToken() {
localStorage.removeItem(LOGIN_TOKEN_KEY);
}
async function tryAutoLogin() {
try {
const tokenInfo = getToken();
if (!tokenInfo) {
return;
}
const [tokenID, token] = tokenInfo;
const result = await SammoRootAPI.Login.ReqNonce(undefined, true);
if (!result) {
//api 에러.
return;
}
if (!result.result) {
resetToken();
return;
}
const nonce = result.loginNonce;
console.debug('try auto login with token', tokenID, token, nonce);
const hashedToken = sha512(token + nonce);
const loginResult = await SammoRootAPI.Login.LoginByToken({
'hashedToken': hashedToken,
'token_id': tokenID,
}, true);
if (!loginResult.result) {
if (!loginResult.silent) {
alert(loginResult.reason);
}
console.error(loginResult.reason);
return;
}
if (loginResult.nextToken) {
regNextToken(loginResult.nextToken);
}
window.location.href = "./";
}
catch (e) {
if (isString(e)) {
alert(e);
}
console.error(e);
return;
}
}
async function tryAutoLogin() {
try {
const tokenInfo = getToken();
if (!tokenInfo) {
return;
}
const [tokenID, token] = tokenInfo;
for (let attempt = 0; attempt < 2; attempt++) {
const reqNonceStartAt = Date.now();
const nonceResult = await SammoRootAPI.Login.ReqNonce(undefined, true);
if (!nonceResult) {
//api 에러.
return;
}
if (!nonceResult.result) {
resetToken();
return;
}
const nonce = nonceResult.loginNonce;
console.debug(
'try auto login with token',
tokenID,
`attempt:${attempt + 1}`,
`reqNonceElapsed:${Date.now() - reqNonceStartAt}ms`
);
const hashedToken = sha512(token + nonce);
const loginResult = await SammoRootAPI.Login.LoginByToken({
'hashedToken': hashedToken,
'token_id': tokenID,
}, true);
if (!loginResult.result) {
if (loginResult.reason === '자동 로그인: 절차 오류' && attempt === 0) {
console.warn('auto login failed by procedure error. retrying once.');
await delay(150);
continue;
}
if (!loginResult.silent) {
alert(loginResult.reason);
}
console.error(loginResult.reason);
return;
}
if (loginResult.nextToken) {
regNextToken(loginResult.nextToken);
}
window.location.href = "./";
return;
}
}
catch (e) {
if (isString(e)) {
alert(e);
}
console.error(e);
return;
}
}
function getOAuthToken(mode: string, scope_list?: string[] | string) {
if (mode === undefined) {
mode = 'login';
+28
View File
@@ -13,6 +13,8 @@ use sammo\TimeUtil;
use sammo\Util;
use sammo\Validator;
use function sammo\logError;
class LoginByToken extends LoginByID
{
static array $sensitiveArgs = ['hashedToken'];
@@ -42,6 +44,32 @@ class LoginByToken extends LoginByID
$loginNonce = $session->loginNonce ?? null;
$loginNonceExpired = $session->loginNonceExpired ?? null;
if (!is_string($loginNonce) || !is_string($loginNonceExpired)) {
logError(
'AutoLoginProcedureError',
Json::encode([
'phase' => 'missing_nonce',
'sid' => session_id(),
'cookie_sid' => $_COOKIE[session_name()] ?? null,
'checked_at' => TimeUtil::now(true),
'host' => gethostname() ?: php_uname('n'),
'php' => PHP_VERSION,
'session_status' => session_status(),
'session_save_handler' => ini_get('session.save_handler') ?: null,
'session_save_path' => ini_get('session.save_path') ?: null,
'session_use_strict_mode' => ini_get('session.use_strict_mode') ?: null,
'session_cookie_samesite' => ini_get('session.cookie_samesite') ?: null,
'session_cookie_secure' => ini_get('session.cookie_secure') ?: null,
'request_method' => $_SERVER['REQUEST_METHOD'] ?? null,
'request_uri' => $_SERVER['REQUEST_URI'] ?? null,
'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? null,
'token_id' => $this->args['token_id'] ?? null,
'nonce_type' => gettype($loginNonce),
'nonce_expired_type' => gettype($loginNonceExpired),
'reqnonce_context' => $session->loginNonceDebug ?? null,
]),
__FILE__,
[]
);
return '자동 로그인: 절차 오류';
}
+13
View File
@@ -32,6 +32,19 @@ class ReqNonce extends BaseAPI
$loginNonceExpired = TimeUtil::nowAddSeconds(2);
$session->loginNonce = $loginNonce;
$session->loginNonceExpired = $loginNonceExpired;
$session->loginNonceDebug = Json::encode([
'phase' => 'issue_nonce',
'sid' => session_id(),
'cookie_sid' => $_COOKIE[session_name()] ?? null,
'issued_at' => TimeUtil::now(true),
'host' => gethostname() ?: php_uname('n'),
'php' => PHP_VERSION,
'session_save_handler' => ini_get('session.save_handler') ?: null,
'session_save_path' => ini_get('session.save_path') ?: null,
'session_use_strict_mode' => ini_get('session.use_strict_mode') ?: null,
'session_cookie_samesite' => ini_get('session.cookie_samesite') ?: null,
'session_cookie_secure' => ini_get('session.cookie_secure') ?: null,
]);
return [
'result' => true,
'loginNonce' => $loginNonce,