{"record":{"id":"db48be7c188c00da","repo":"mem0ai/mem0","slug":"refresh-token-is-no-longer-valid","errorCode":null,"errorMessage":"Refresh token is no longer valid.","messagePattern":"Refresh token is no longer valid\\.","errorType":"http","errorClass":"HTTPException","httpStatus":401,"severity":"error","filePath":"server/auth.py","lineNumber":81,"sourceCode":"def create_refresh_token(user_id: str, db: Session) -> str:\n    expire = datetime.now(timezone.utc) + timedelta(days=REFRESH_TOKEN_EXPIRE_DAYS)\n    jti = uuid.uuid4()\n    db.add(RefreshTokenJti(jti=jti, user_id=uuid.UUID(user_id), expires_at=expire))\n    db.commit()\n    payload = {\"sub\": user_id, \"exp\": expire, \"jti\": str(jti), \"type\": \"refresh\"}\n    return jwt.encode(payload, _get_secret(), algorithm=JWT_ALGORITHM)\n\n\ndef consume_refresh_jti(jti: str, db: Session) -> None:\n    \"\"\"Atomically mark a refresh token's jti as used. Raises 401 if missing, already used, or expired.\n\n    The conditional UPDATE closes the read-check-write race: concurrent replays of the same\n    token race on a single row, so at most one update affects a row and the rest see rowcount 0.\n    \"\"\"\n    try:\n        jti_uuid = uuid.UUID(jti)\n    except (TypeError, ValueError):\n        raise HTTPException(status_code=401, detail=\"Refresh token is no longer valid.\")\n    now = datetime.now(timezone.utc)\n    result = db.execute(\n        update(RefreshTokenJti)\n        .where(\n            RefreshTokenJti.jti == jti_uuid,\n            RefreshTokenJti.used_at.is_(None),\n            RefreshTokenJti.expires_at > now,\n        )\n        .values(used_at=now)\n    )\n    if result.rowcount == 0:\n        raise HTTPException(status_code=401, detail=\"Refresh token is no longer valid.\")\n    db.commit()\n\n\ndef decode_token(token: str) -> dict:\n    try:\n        return jwt.decode(token, _get_secret(), algorithms=[JWT_ALGORITHM])","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/mem0ai/mem0/blob/001c235229be8795e3834520467bd0d661ed8f34/server/auth.py#L63-L99","documentation":"Error \"Refresh token is no longer valid.\" thrown in mem0ai/mem0.","triggerScenarios":"Thrown at server/auth.py:81 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Log in again to obtain a new refresh token; the old one was revoked or expired."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"001c235229be8795e3834520467bd0d661ed8f34","analyzedAt":"2026-08-15T01:55:42.685Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}