Accounts 服务
注册与登录
@downcity/services 下最常见的 register、login 和 user_token 返回链路。
@downcity/services 最直接解决的问题,就是让产品在没有自建账号系统的情况下先跑通注册登录。
渲染邮箱表单前,先读取服务端真实开放的登录方式:
const providers = await guest.service("accounts").get("providers");只有返回里包含启用的 email provider,并且它的 type 是 input 时,才展示邮箱输入表单。表单字段可以直接来自 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,
});