
Logto 小米社交连接器接入指南配置小米 OAuth 应用与实现账号登录【免费下载链接】logto Authentication and authorization infrastructure for SaaS and AI apps, built on OIDC and OAuth 2.1 with multi-tenancy, SSO, and RBAC.项目地址: https://gitcode.com/GitHub_Trending/lo/logto导读本文基于 Logto 开源仓库中的小米社交连接器logto/connector-xiaomi官方中文文档系统讲解如何借助小米开放平台的 OAuth 2.0 能力让终端用户使用小米账号登录你的应用。你将掌握从创建小米开发者应用、配置授权回调地址到在 Logto 管理控制台填写clientId/clientSecret、定制权限范围scope与skipConfirm行为的完整实战流程并结合 连接器源码 与 单元测试 理解其背后的授权码交换、用户信息拉取与数据映射原理。连接器概述为你的应用接入小米账号体系小米是一家全球知名的科技公司提供包括智能手机、智能家居等在内的多种产品和服务。Logto 官方提供的小米社交连接器源码位于 packages/connectors/connector-xiaomi可以帮助终端用户使用小米账号直接登录你的应用无需额外注册从而降低登录门槛、提升转化率。从包定义 package.json 可以看到该连接器名为logto/connector-xiaomi属于社交连接器Social Connector类型其实现依赖 Logto 的 connector-kit 提供的标准接口。连接器的元数据定义在 constant.ts 中连接器唯一标识factory idxiaomi-universal平台类型为Universal全平台通用Web 端即可接入展示名称Xiaomi/小米Logo 使用 logo.svg涉及三个小米开放平台端点授权端点https://account.xiaomi.com/oauth2/authorize、令牌端点https://account.xiaomi.com/oauth2/token、用户信息端点https://open.account.xiaomi.com/user/profile默认请求超时时间为 5000 毫秒。说明本文面向在 Logto 中配置并使用小米连接器的读者关于 Logto 本身的安装与部署请参考仓库根目录的 README.md。开始上手创建小米开发者账号与应用要在 Logto 中使用小米社交登录第一步是在小米开放平台完成开发者资质与应用创建在小米开放平台注册并创建开发者账号进入小米帐号服务小米 OAuth 应用管理页面;创建一个新应用如果还没有创建过。只有完成这一步你才能拿到后续配置所必需的AppID与AppSecret。创建应用时请留意小米开放平台关于应用类型、审核要求的说明确保应用用于合法的登录/授权场景。配置小米 OAuth 应用拿到开发者账号后需要对小米侧的应用进行 OAuth 配置核心是设置授权回调地址这是 OAuth 授权码流程中小米服务器把授权结果回传给 Logto 的必经之路。配置授权回调地址再次进入小米帐号服务应用列表打开要用于登录的应用点击「回调地址」入口如果尚未编辑过回调地址该入口会显示为「启用」添加如下格式的授权回调地址${your_logto_origin}/callback/${connector_id}其中${your_logto_origin}是你的 Logto 服务对外可访问的源地址origin例如https://auth.example.com${connector_id}是小米连接器在 Logto 中的唯一 ID你可以在 Logto 管理控制台的连接器详情页顶部找到。以本仓库源码为例官方连接器的 factory id 为xiaomi-universal见 constant.ts当你通过控制台创建该连接器实例后控制台展示的connector_id即为该实例的 ID请以实际展示值为准。回调地址必须与 Logto 侧实际发起授权跳转时携带的redirect_uri完全匹配否则授权会失败——这一点在 index.ts 中可以看到连接器会原样携带 Logto 传入的redirectUri拼入授权 URL 的redirect_uri参数。获取并填写密钥从应用详情页获取AppID和AppSecret然后将AppID填入 Logto 管理控制台中该连接器配置的clientId字段将AppSecret填入clientSecret字段。这两项为必填项。从源码 types.ts 中的xiaomiConfigGuard可以看出clientId与clientSecret为必填字符串scope、redirectUri、skipConfirm为可选项配置不合法时连接器会在运行期直接抛出校验错误。连接器配置项详解在 Logto 管理控制台的连接器详情页小米连接器暴露了以下配置项对应表单定义见 constant.ts配置项类型必填默认值说明clientId文本是无小米应用详情页的AppIDclientSecret文本是无小米应用详情页的AppSecretscope多行文本否1权限范围多个权限用空格分隔skipConfirm开关否false在用户已登录小米账号的情况下是否跳过小米授权确认页面scope请求的权限范围scope控制应用向小米用户请求的权限。连接器源码 constant.ts 中定义了默认值defaultScope 1即读取用户资料。当你在控制台不填写scope时连接器会使用该默认值在 index.ts 中getAuthorizationUri构建授权 URL 时采用scope ?? config.scope ?? defaultScope的优先级Logto 传入的 scope 优先于连接器配置连接器配置优先于默认值。skipConfirm跳过授权确认页小米授权流程中如果用户已在浏览器中登录小米账号通常仍会看到小米的授权确认页面。将skipConfirm设为true可以跳过该确认页缩短登录路径设为false默认则每次都展示确认页。源码中该值通过String(config.skipConfirm ?? false)序列化为skip_confirm参数拼入授权 URL见 index.ts。权限范围说明默认情况下连接器请求以下权限1读取用户资料小米开放平台支持的可配置权限范围如下表所示来源官方 README权限值描述API 接口1获取用户资料user/profile3获取用户 open_iduser/openIdV21000获取小米路由器信息路由器1001访问所有小米路由器信息路由器2001访问小米云日历小米云2002访问小米云闹钟小米云6000使用米家智能家居服务米家6002添加第三方设备到米家米家6003Alexa 控制小米设备米家6004第三方服务访问小米设备米家7000关注黄页服务号小米云11000获取小米云相册小米云12001保存应用数据到小米云小米云12005使用健康心电图服务健康16000获取小米卡包卡券app/get_pass20000启用小爱智能语音服务小爱40000启用云端 AI 服务内部使用多个权限范围通过空格分隔配置例如1 3 6000表示同时请求用户资料、open_id 与米家智能家居服务。需要注意对于登录场景1用户资料通常是必需的它是连接器从用户信息接口映射用户身份的基础表内大量权限如路由器、小米云、米家设备控制等与登录本身无关按需申请、最小化授权是更安全的实践也能减少用户在授权页的困惑连接器测试用例index.test.ts验证了自定义 scope 会被原样透传到授权 URL 的scope参数中。源码级原理解析一次完整的小米登录流程小米连接器实现了 Logto connector-kit 中定义的标准社交连接器接口SocialConnector见 packages/toolkit/connector-kit/src/types/social.ts核心由getAuthorizationUri与getUserInfo两个函数构成遵循标准的 OAuth 2.0 授权码Authorization Code流程。第一步构建授权 URL当用户在 Logto 登录体验页点击小米登录后Logto 会调用连接器的getAuthorizationUriindex.ts向小米授权端点发起跳转携带参数client_id你在控制台配置的clientIdredirect_uriLogto 侧的回调地址response_typecode授权码模式state防 CSRF 的状态参数由 Logto 生成并校验scope权限范围默认1skip_confirm是否跳过授权确认页。第二步用授权码交换访问令牌用户在小米侧完成授权后小米服务器携带code重定向回 Logto 的回调地址。随后连接器的getUserInfo会先调用内部函数getAccessTokenindex.ts以表单形式 POST 到小米令牌端点client_id、client_secret、code、grant_typeauthorization_code、redirect_uri这里有一个值得注意的实现细节小米令牌端点返回的响应体带有START前缀典型的 JSONP 风格包装连接器会先剥离该前缀再解析 JSON然后通过accessTokenResponseGuardtypes.ts校验响应结构校验失败例如code无效或redirect_uri不匹配会抛出SocialAuthCodeInvalid错误。测试用例 index.test.ts 分别覆盖了正常交换与错误响应的场景。第三步拉取用户信息并标准化拿到access_token后连接器请求用户信息端点https://open.account.xiaomi.com/user/profile携带clientId与token两个查询参数。响应经过userInfoResponseGuard校验后从data字段中提取三个关键字段并映射为 Logto 标准化的SocialUserInfoindex.ts小米返回字段Logto 标准化字段说明unionIdid用户唯一标识必填用作 Logto 侧用户身份关联的键miliaoNickname用户昵称可选miliaoIconavatar用户头像 URL可选同时小米返回的完整原始数据会原样保留在rawData字段中方便后续业务扩展。这种标准化字段 原始数据的设计与 connector-kit 中SocialUserInfo类型的定义完全一致见 packages/toolkit/connector-kit/src/types/social.ts。从源码可以推断小米返回的unionId是账号体系中的跨应用统一标识用它作为id可以保证同一小米账号在不同应用中映射到 Logto 侧的同一身份避免同一用户产生多个孤立账号。错误处理与边界情况连接器对异常情况做了分层处理测试用例也给出了明确的预期行为index.test.ts授权回调异常回调参数中若包含error/error_description如用户拒绝授权连接器会将其包装为通用错误抛出令牌交换失败响应中缺少access_token时抛出SocialAuthCodeInvalid用户信息接口返回 403视为token无效或已过期抛出SocialAccessTokenInvalid此时 Logto 会引导用户重新走授权流程用户信息接口返回其他错误码如 401抛出通用错误并附上小米侧返回的code与description便于排查响应结构不符合预期抛出InvalidResponse。测试小米连接器启用社交登录配置完成后别忘了在 Logto 管理控制台的**登录体验Sign-in Experience**中启用社交登录将小米连接器设置为可用的登录方式。启用后登录体验页会渲染出小米的登录按钮用户点击后即可走完上文所述的完整授权流程。你还可以通过连接器自带的单元测试快速验证配置与实现是否符合预期在 packages/connectors/connector-xiaomi 目录下执行pnpm test对应vitest run src测试套件会使用 nock 模拟小米的三个端点覆盖授权 URL 生成、令牌交换、用户信息拉取与各类错误分支。其中 mock.ts 提供了完整的模拟配置与响应样例如skipConfirm: true、包含union_id的令牌响应、包含miliaoNick/miliaoIcon的用户信息响应可作为理解字段结构的最佳参考。常见问题排查授权页面报 redirect_uri 不匹配检查小米应用详情页配置的回调地址是否与${your_logto_origin}/callback/${connector_id}完全一致注意不要遗漏路径中的/callback/段报 SocialAuthCodeInvalid多半是code已过期授权码有效期很短或回调地址不匹配确认小米应用回调配置后重试用户信息拉取失败403access_token无效或已过期通常需要用户重新授权获取新令牌拿不到用户昵称/头像miliaoNick、miliaoIcon在小米响应中本就是可选项见 types.ts 中z.string().optional()的定义用户未设置时返回的标准化字段会缺失属正常现象。参考小米 OAuth 2.0 官方文档与小米获取用户信息文档可在小米开放平台查阅文中涉及的授权、令牌、用户信息三个端点 URL 均以本仓库 constant.ts 中硬编码的值为准连接器实现细节index.ts、types.ts、index.test.tsLogto 社交连接器接入的整体机制标准接口与配置校验可参考 packages/toolkit/connector-kit/src/types/social.ts。【免费下载链接】logto Authentication and authorization infrastructure for SaaS and AI apps, built on OIDC and OAuth 2.1 with multi-tenancy, SSO, and RBAC.项目地址: https://gitcode.com/GitHub_Trending/lo/logto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考