Skip to content

认证接口

提供用户身份认证相关的 API 接口,支持账号密码登录和二维码登录流程。

注意

此模块适用于 Passport 登录流程,前往 身份认证 了解更多。

接口概览

方法API 路径描述
login()/newlogin/login.do账号密码登录
generate()/newlogin/qrcode/generate.do生成二维码数据(URL)
query()/newlogin/qrcode/query.do查询二维码状态

login()

使用账号密码进行用户登录认证。

注意

  • 密码会自动进行加密处理,无需手动加密
  • 需要提供有效的 Cookie 用于通过滑块验证
  • 登录成功后可通过 getCookiePassport() 获取新的 Cookie

API 路径: /newlogin/login.do

接口定义

参数

typescript
interface LoginParams {
  /** 登录ID(手机号/用户名/邮箱) */
  loginId: string;
  /** 密码(原始密码,会自动加密) */
  password2: string;
  /** 是否保持登录,默认: true */
  keepLogin?: boolean;
  /** 是否在iframe中,默认: false */
  isIframe?: boolean;
  /** 文档引用页 */
  documentReferer?: string;
  /** 默认视图,默认: 'password' */
  defaultView?: string;
  /** 应用名称,默认: 'xianyu' */
  appName?: string;
  /** 应用入口,默认: 'web' */
  appEntrance?: string;
  /** 是否为主页面,默认: false */
  mainPage?: boolean;
  /** 是否为移动端,默认: false */
  isMobile?: boolean;
  /** 语言,默认: 'zh_CN' */
  lang?: string;
  /** 来源站点,默认: '77' */
  fromSite?: string;
  /** 用户标识标签,默认: 'SERVER' */
  umidTag?: string;
  // ... 其他可选参数
}

完整的参数类型定义请参考:LoginParams

📋 点击查看参数详细说明
参数名类型必需默认值描述
loginIdstring-登录 ID(手机号/用户名)
password2string-密码(会自动加密)
keepLoginbooleantrue是否保持登录
isIframebooleanfalse是否在 iframe 中
documentRefererstring''文档引用页
defaultViewstring'password'默认视图
appNamestring'xianyu'应用名称
appEntrancestring'web'应用入口
mainPagebooleanfalse是否为主页面
isMobilebooleanfalse是否为移动端
langstring'zh_CN'语言
fromSitestring'77'来源站点
umidTagstring'SERVER'用户标识标签

响应

实际响应被 GoofishPassportResponse 统一包裹:

typescript
GoofishPassportResponse<LoginResponse>;

其中 LoginResponse 的结构为:

typescript
interface LoginResponse {
  /** 标题消息(错误时显示) */
  titleMsg?: string;
  // ... 其他响应字段
}

完整的响应类型定义请参考:LoginResponse | GoofishPassportResponse

使用示例

基础使用

typescript
import { Goofish } from "goofish-client";

const client = new Goofish({
  // 需要通过滑块验证的Cookie
  cookie: "x5sec=your_cookie_here",
});

// 账号密码登录
const result = await client.api.passport.login.login({
  loginId: "13800138000",
  password2: "your_password",
  keepLogin: true,
});

if (result.content.success) {
  console.log("✅ 登录成功");

  // 获取登录后的Cookie
  const newCookie = client.getCookiePassport();

  // 更新Client的Cookie以供后续使用
  client.updateCookieMtop(newCookie);
} else {
  console.error("❌ 登录失败:", result.content.data?.titleMsg);
}

错误处理

typescript
async function handleLogin(loginId: string, password: string) {
  const client = new Goofish({
    cookie: "x5sec=your_cookie_here",
  });

  try {
    const result = await client.api.passport.login.login({
      loginId,
      password2: password,
      keepLogin: true,
    });

    if (result.content.success) {
      // 登录成功,更新Cookie
      const newCookie = client.getCookiePassport();
      client.updateCookieMtop(newCookie);

      // 验证登录状态
      const userNav = await client.api.mtop.user.getUserNav();

      return {
        success: true,
        client,
        user: userNav.data,
      };
    } else {
      return {
        success: false,
        error: result.content.data?.titleMsg || "登录失败",
      };
    }
  } catch (error) {
    return {
      success: false,
      error: error.message || "网络错误",
    };
  }
}

generate()

生成用于登录的二维码数据,返回二维码 URL 和相关参数。

注意

此方法只返回二维码的 URL 数据,不是直接可显示的二维码。返回的 codeContent 是一个 URL,需要使用二维码生成库将其转换为二维码图片。

API 路径: /newlogin/qrcode/generate.do

接口定义

参数

typescript
interface QRCodeGenerateParams {
  /** 应用名称 */
  appName?: string;
  /** 来源站点 */
  fromSite?: string;
  /** 应用入口,默认: 'web' */
  appEntrance?: string;
  /** 跨站请求伪造令牌 */
  _csrf_token?: string;
  /** 用户标识令牌 */
  umidToken?: string;
  /** 用户代理 */
  hsiz?: string;
  /** 业务参数 */
  bizParams?: string;
  /** 是否为主页,默认: false */
  mainPage?: boolean;
  /** 是否为移动设备,默认: false */
  isMobile?: boolean;
  /** 语言,默认: 'zh_CN' */
  lang?: string;
  /** 返回URL */
  returnUrl?: string;
  /** 用户代理 */
  "bx-ua"?: string;
  /** 用户标识令牌 */
  "bx-umidtoken"?: string;
  /** 是否加载,默认: 'not_loaded' */
  bx_et?: string;
  /** 用户标识标签,默认: 'SERVER' */
  umidTag?: string;
}

完整的参数类型定义请参考:QRCodeGenerateParams

📋 点击查看参数详细说明
参数名类型必需默认值描述
appNamestring-应用名称
fromSitestring-来源站点
appEntrancestring'web'应用入口
_csrf_tokenstring-跨站请求伪造令牌
umidTokenstring-用户标识令牌
hsizstring-用户代理
bizParamsstring-业务参数
mainPagebooleanfalse是否为主页
isMobilebooleanfalse是否为移动设备
langstring'zh_CN'语言
returnUrlstring-返回 URL
bx-uastring-用户代理
bx-umidtokenstring-用户标识令牌
bx_etstring'not_loaded'是否加载
umidTagstring'SERVER'用户标识标签

响应

实际响应被 GoofishPassportResponse 统一包裹:

typescript
GoofishPassportResponse<QrGenerateResponse>;

其中 QrGenerateResponse 的结构为:

typescript
interface QrGenerateResponse {
  /** 时间戳 */
  t: number | string;
  /** 二维码内容URL */
  codeContent: string;
  /** cookie值 */
  ck: string;
  /** 结果码 */
  resultCode: number;
  /** 是否处理完成 */
  processFinished: boolean;
  /** 登录令牌(从codeContent中提取) */
  lgToken?: string;
}

完整的响应类型定义请参考:QrGenerateResponse | GoofishPassportResponse

使用示例

基础使用

typescript
import { Goofish } from "goofish-client";

const client = new Goofish({});

// 生成二维码数据(使用默认参数)
const result = await client.api.passport.qr.generate();

if (result.content.success) {
  const { t, ck, codeContent } = result.content.data;

  console.log("二维码内容:", codeContent);
  console.log("查询参数:", { t, ck });
} else {
  console.error("二维码生成失败");
}

自定义参数

typescript
// 自定义生成参数
const result = await client.api.passport.qr.generate({
  appEntrance: "mobile",
  lang: "en_US",
  isMobile: true,
  returnUrl: "https://example.com/callback",
});

query()

查询二维码的扫描和确认状态,用于轮询检查登录进度。

API 路径: /newlogin/qrcode/query.do

接口定义

参数

必填参数:

typescript
interface QRCodeQueryParams {
  /** 时间戳(从generate获取,必需) */
  t: number | string;
  /** 校验密钥(从generate获取,必需) */
  ck: string;
  // ... 其他可选参数
}

完整的参数类型定义请参考:QRCodeQueryParams

📋 点击查看参数详细说明
参数名类型必需默认值描述
tnumber|string-时间戳(从 generate 获取)
ckstring-校验密钥(从 generate 获取)
uastring-用户代理
appNamestring-应用名称
appEntrancestring'web'应用入口
_csrf_tokenstring-跨站请求伪造令牌
umidTokenstring-用户标识令牌
hsizstring-用户代理 hash
bizParamsstring-业务参数
mainPagebooleanfalse是否为主页面
isMobilebooleanfalse是否为移动端
langstring'zh_CN'语言
returnUrlstring-返回 URL
fromSitestring-来源站点
umidTagstring'SERVER'用户标识标签
navlanguagestring-导航语言
navUserAgentstring-导航用户代理
navPlatformstring-导航平台
isIframebooleantrue是否为 iframe
documentRefererstring-文档引用页
defaultViewstring'password'默认视图
deviceIdstring-设备 ID
pageTraceIdstring-页面跟踪 ID
bx-uastring-bx 用户代理
bx-umidtokenstring-bx 用户标识令牌
bx_etstring'not_loaded'bx 加载状态

响应

实际响应被 GoofishPassportResponse 统一包裹:

typescript
GoofishPassportResponse<QrQueryResponse>;

其中 QrQueryResponse 的结构为:

typescript
interface QrQueryResponse {
  /** 二维码状态 */
  qrCodeStatus: QRCodeStatus;
  /** 结果码 */
  resultCode: number;
  /** 标题消息(错误时显示) */
  titleMsg?: string;
}

完整的响应类型定义请参考:QrQueryResponse | QRCodeStatus | GoofishPassportResponse

使用示例

基础查询

typescript
import { Goofish, QRCodeStatus } from "goofish-client";

// 查询二维码状态(基础用法)
async function checkQRStatus(t: string, ck: string) {
  const queryResult = await client.api.passport.qr.query({ t, ck });
  const status = queryResult.content.data.qrCodeStatus;

  switch (status) {
    case QRCodeStatus.NEW:
      console.log("等待扫描");
      return "waiting";

    case QRCodeStatus.SCANED:
      console.log("已扫描,等待确认");
      return "scanned";

    case QRCodeStatus.CONFIRMED:
      console.log("登录成功");
      return "success";

    case QRCodeStatus.CANCELED:
      console.log("用户取消登录");
      return "canceled";

    case QRCodeStatus.EXPIRED:
      console.log("二维码已过期");
      return "expired";

    default:
      console.log("二维码状态异常");
      return "error";
  }
}

登录成功后,可以通过以下方法管理 Cookie:

typescript
// 获取Passport Cookie
const passportCookie = client.getCookiePassport();

// 更新Mtop客户端的Cookie
client.updateCookieMtop(passportCookie);

// 验证Cookie有效性
const userNav = await client.api.mtop.user.getUserNav();

console.log(userNav);

TypeScript 支持

typescript
import type {
  QRCodeGenerateParams,
  QrGenerateResponse,
  QRCodeQueryParams,
  QrQueryResponse,
  QRCodeStatus,
} from "goofish-client";

// 类型安全的二维码操作
const generateParams: QRCodeGenerateParams = {
  appEntrance: "web",
  lang: "zh_CN",
};

const queryParams: QRCodeQueryParams = {
  t: "xxx",
  ck: "xxx",
};

基于 GPL-3.0 许可证发布