Accounts 服务

注册与登录

@downcity/services 下最常见的 register、login 和 user_token 返回链路。

@downcity/services 最直接解决的问题,就是让产品在没有自建账号系统的情况下先跑通注册登录。

渲染邮箱表单前,先读取服务端真实开放的登录方式:

const providers = await guest.service("accounts").get("providers");

只有返回里包含启用的 email provider,并且它的 typeinput 时,才展示邮箱输入表单。表单字段可以直接来自 provider 的 inputs

register

const session = await guest.service("accounts").action("register").invoke({
  email: "[email protected]",
  password: "password123",
  city_id: "city_demo",
});

login

const start = await guest.service("accounts").action("login/start").invoke({
  provider: "email",
  city_id: "city_demo",
});

await guest.service("accounts").action("login/continue").invoke({
  login_id: start.login_id,
  input: {
    email: "[email protected]",
    password: "password123",
  },
});

const session = await guest.service("accounts").get("login/result", {
  login_id: start.login_id,
});

为什么这里要带 city_id

因为 service 在登录或注册成功后,通常会顺手向 City 申请该 downcity 下的 user_token

所以它需要知道:

  • 当前是哪个产品
  • 当前要给哪个产品上下文签 token

登录成功后要做什么

不是继续一直用 guest client,而是切到正常用户态:

const user = new City({
  role: "user",
  city_url,
  city_id: "city_demo",
  user_token: session.user_token,
});