{"record":{"id":"f127c2cfcba3e1b5","repo":"jackwener/OpenCLI","slug":"taobao-my-itaobao-redirected-to-login-finalurl","errorCode":null,"errorMessage":"Taobao my_itaobao redirected to login: ${finalUrl}","messagePattern":"Taobao my_itaobao redirected to login: (.+?)","errorType":"exception","errorClass":"AuthRequiredError","httpStatus":null,"severity":"error","filePath":"clis/taobao/auth.js","lineNumber":17,"sourceCode":"import { AuthRequiredError, CommandExecutionError } from '@jackwener/opencli/errors';\nimport { registerSiteAuthCommands } from '../_shared/site-auth.js';\n\nasync function hasTaobaoSessionCookie(page) {\n  const cookies = await page.getCookies({ url: 'https://www.taobao.com' });\n  return cookies.some(c => c.name === 'tracknick' && c.value);\n}\n\nasync function verifyTaobaoIdentity(page) {\n  if (!await hasTaobaoSessionCookie(page)) {\n    throw new AuthRequiredError('taobao.com', 'Taobao tracknick cookie missing — anonymous');\n  }\n  await page.goto('https://i.taobao.com/my_itaobao');\n  await page.wait(2);\n  const finalUrl = await page.evaluate(`location.href`);\n  if (/login\\.taobao\\.com\\/member\\/login/.test(String(finalUrl || ''))) {\n    throw new AuthRequiredError('taobao.com', `Taobao my_itaobao redirected to login: ${finalUrl}`);\n  }\n  const cookies = await page.getCookies({ url: 'https://www.taobao.com' });\n  const tracknick = cookies.find(c => c.name === 'tracknick')?.value || '';\n  if (!tracknick) {\n    throw new AuthRequiredError('taobao.com', 'Taobao tracknick cookie absent after navigation');\n  }\n  const domInfo = await page.evaluate(`\n    (() => {\n      const nick = (document.querySelector('.user-nick, .site-nav-user, .user-name')?.innerText || '').trim();\n      const html = document.body?.innerHTML || '';\n      const userIdMatch = html.match(/userId[\\\"'\\\\s:=]+(\\\\d+)/i);\n      return { nickname: nick, user_id: userIdMatch?.[1] || '' };\n    })()\n  `);\n  let decodedTracknick = '';\n  try {\n    decodedTracknick = JSON.parse('\"' + tracknick.replace(/\\\\/g, '\\\\\\\\') + '\"');\n  } catch {","sourceCodeStart":1,"sourceCodeEnd":35,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/taobao/auth.js#L1-L35","documentation":"After the tracknick cookie check, verifyTaobaoIdentity navigates to https://i.taobao.com/my_itaobao and reads the final URL. If it matches login.taobao.com/member/login, Taobao redirected the account page to login, proving the session is invalid despite the cookie — AuthRequiredError is thrown with the redirect URL.","triggerScenarios":"Navigating to i.taobao.com/my_itaobao lands on login.taobao.com/member/login — a stale/half-valid tracknick cookie that Taobao server-side rejects, an expired session not yet cookie-cleared, or a security re-verification requirement.","commonSituations":"Expired-but-present session cookie (cookie survives logout server-side); Taobao risk control forcing re-auth; logged in on another device invalidating this session; nick/account changes requiring re-verification.","solutions":["Run `taobao auth login` again to establish a fresh, server-validated session.","Clear taobao.com cookies first, then log in, to remove the stale tracknick.","Retry; if the redirect persists immediately after login, complete any security verification Taobao presents in the browser.","Avoid sharing one account across many automation sessions, which triggers risk-control logouts."],"exampleFix":"// before: trusting cookie presence only\nif (cookies.some(c => c.name === 'tracknick')) return identity;\n// after: treat login redirect as auth failure and re-authenticate\ntry {\n  return await verifyTaobaoIdentity(page);\n} catch (e) {\n  if (e instanceof AuthRequiredError && /redirected to login/.test(e.message)) {\n    await clearTaobaoCookies(page);\n    await taobaoLogin(page);\n    return verifyTaobaoIdentity(page);\n  }\n  throw e;\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  const identity = await verifyTaobaoIdentity(page);\n} catch (e) {\n  if (e instanceof AuthRequiredError && /redirected to login/.test(e.message)) {\n    // stale cookie accepted locally but rejected server-side: clear and re-login\n    await clearTaobaoCookies(page);\n    await taobaoLogin(page);\n    return verifyTaobaoIdentity(page);\n  }\n  throw e;\n}","preventionTips":["Treat cookie presence as necessary but not sufficient — always verify via navigation","Clear stale taobao.com cookies before re-login","Avoid concurrent logins of the same account across machines"],"tags":["auth","taobao","redirect","session-expired"],"backgroundTag":"login-redirect","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}