白标核对清单:上传完 logo 之后该问厂商什么
白标不只是上传一个 logo。关于域名、发信域名、重置链接、继承,以及页面源码会泄露什么,该问哪些问题。
白标失败的地方,都是没人演示的地方。上传 logo 从来都没问题。真正决定客户的员工能否用上一年而始终不撞见你厂商名字的,是密码重置链接里的那个主机名、给通知邮件签名的那个域名、浏览器标签页里的文字,以及早上八点、在任何会话存在之前有人冷启动打开的那个登录页。先问这四样,再问颜色。
问“你们支持白标吗”,每个厂商都说支持。这个词从一个色值一直覆盖到一个真正属于你的租户,而两种答案都是用同样自信的语气送到的。下面是一份用于通话的核对清单,写成问题而不是功能:功能清单只会招来一个“是”,问题会招来一次演示。
越过 logo 之后,白标到底指什么
白标
以你自己的名字、域名和设计来提供一个平台,使得使用它的人没有什么特别的理由去知道它是谁做的。主题化只是其中一个子集:已登录用户看到的页面上的颜色、字体和 logo。白标是整个可见表面——地址栏、邮件头、登录页、浏览器标签页、页面源码。主题化是配置;白标的大部分是架构。
有用的判断标准不是客户的 logo 有没有出现,而是平常一周里的任何一个时刻——登录、重置密码、打开一封邮件、把一个链接贴进工单——会不会冒出厂商的名字。在通话里把这一周口头走一遍。
客户的员工在自己雇主的域名上登录,收到由雇主域名签名的邮件,贴出去的支持链接带的也是雇主的名字。
一个 logo 和一个色值,贴在一个仍然住在 yourcompany.vendor.com、并且从 no-reply@vendor.com 发信的产品上。
域名,以及一次会话里离开它的那些部分
自定义域名是承重的那一块;其余一切都是搭在它上面的装饰。五个问题就能问出大半。
- 自定义域名包含在报给我们的这一档里,还是要另外加购?要一条明细。域名是常见的加价项,而在一些老平台上,它是一项专业服务任务,而不是一个设置项。
- TLS 证书由谁签发,续期时会发生什么?是自动签发、自动续期,还是每隔几个月开一张工单。问一问:续期失败的那个早上,学员看到的是什么。
- 是整个账户一个域名,还是每个组织一个?如果你运营好几个客户学院或校区,就问:到哪一层深度之后,就不能再有独立主机名了。
- 我们能自己配置吗?好的答案是有一个界面,把要在你的注册商那里填的 DNS 记录原样列出来,并在证书签发过程中显示实时状态。破绽是一串和客服的邮件往来。
- 一次会话里有哪些部分会离开我们的域名?下载、视频、测评播放器、证书验证、嵌入的帮助小组件、登录跳转的交接。请他们在一个真实租户上打开网络面板,把主机名一个个念出来。
如果我们有自定义域名,学员还会看到厂商的域名吗?
通常总有某处会看到,问题在于是哪一处。常见的泄露点是:登录过程中的跳转、从共享 CDN 提供的媒体文件、证书验证链接指向的那个页面,以及任何嵌入的聊天小组件。每一处都源自平台是怎么建的,每一处学员都看得到,所以要逐一点名去问。
邮件,以及面具滑落的那个链接
邮件是白标里悄悄留在厂商那边的那一半。From 地址是一个展示字符串,谁都能设。邮件客户端在底下读的,是真正给这封信签名的那个域名。
From: Northbridge Academy <no-reply@learn.northbridge.edu> <- the display line
Return-Path: bounces@mail.vendor-lms.com <- the envelope sender
DKIM-Signature: ... d=vendor-lms.com ... <- the signing domain当签名域名和 From 域名不一致时,Gmail 会在发件人旁边加一行小小的“via vendor-lms.com”。客户的 IT 部门知道那是什么意思。所以要问:
- 哪些邮件从我们的域名发出,哪些从你们的域名发出?要一份完整清单——邀请、欢迎、密码重置、报名、提醒、成绩发布、证书签发、摘要、管理员告警——然后问其中哪些可以带上我们的发件人。
- 只是 From 那一行,还是签名域名也算?追问的是:你们要我们发布哪些 DNS 记录。如果一条都不用加在你自己的注册商那里,那这封信并不是真的从你的域名发出的。
- 是我们自己的发信账户和密钥,还是你们的共享池?在共享池里,另一个租户的退信率会变成你的送达率问题,而且是看不见的。
- 是每个组织一套,还是在顶层设一次?整个账户一个发件人,第一封邮件就把那份独立性拆穿了。
- 邮件用的是哪个 logo,它托管在哪里?只要邮件网关拦截了远程图片,一张托管在厂商那边的图,就会在替代文字里露出它的 URL。
接下来是邮件里的那个链接,多数评估就是在这里发现真相的。正文可以带上你的 logo、你的颜色和你的发件人,而正中间那个按钮仍然指向厂商的主机——因为邀请链接和重置链接通常由认证层生成,全局配置一次,只有一个站点 URL。
密码重置邮件和邀请邮件用的是我自己的域名吗?
常常不是,即使在其余部分品牌做得不错的平台上也一样,而这是面具滑落最常见的地方。那些链接通常是从一个全局配置的站点 URL 生成的,所以一封邮件可以看上去完全是你的,而里面的链接却解析到厂商的主机。这一条不要问——去测,自己读一遍链接的目标地址和邮件头。
登录页、标签页,和两个 logo
登录页是最难做品牌的一页,也是每个学员看到的第一页。在任何人完成认证之前,平台对访客一无所知,只知道他是从哪个主机名进来的。如果品牌是从已登录用户所属的组织加载的,那么冷启动的访客拿到的就是厂商的默认样式。请照着这句话原样去问:品牌能不能只凭主机名解析出来,在任何会话存在之前?
- 在我们的域名上,一个没有会话的访客看到的是什么?logo、产品名、颜色、背景,以及登录按钮上的文案。
- 有没有一行“powered by”,靠什么才能去掉?一个开关、一个更高的档位,或者合同里的一个条款。三种情况都存在,价钱各不相同。
- 出错状态长什么样?密码错误、邀请过期、账号被锁——这些最可能还是厂商的默认模板,而且正是一个正在窝火的用户读得最仔细的页面。
- 浏览器标签页里是什么?每一条路由上的页面标题,以及 favicon。问一问 favicon 是每个组织一个,还是整个平台共用一份;从单一静态路径提供它,是常见的偷懒做法。
- 有两个 logo 吗?一个浅色模式的、一个深色模式的,通常还有一个方形标记。问一问:如果你只上传了一个,而用户切到深色模式,会发生什么。
- 从平台里流出去的文档里有什么?证书 PDF、导出的报表、成绩单。先看页脚,再看文件元数据——厂商的名字在那里活得最久。
继承,以及以什么粒度继承
如果你运营的不止一个组织——客户企业、集团里的学校、各国子公司——那么“品牌会不会继承”就不是一个是非题,而是一个粒度问题,而工作量是消失还是成倍增加,就取决于这个粒度。
- 如果一个子组织什么都不设,它拿到的是什么?是父级的品牌,还是厂商的默认样式。对一个集团来说,后者是错的:每所新学校一开张,看起来都像那个厂商。
- 是全有或全无,还是逐字段?一所想用集团配色、但用自己校徽的学校,需要字段级的回退。整块继承会逼着每个子级为了换一个 logo 而把十四个颜色重新填一遍。
- 浅色和深色 logo 是作为一对一起回退的吗?如果它们各自独立回退,那么一个只上传了浅色 logo 的子级,会把父级的深色 logo 孤零零地留在自己的新配色上。这是个小问题,但换来的停顿很说明情况。
- 谁有权改它?是子级自己的管理员,还是每一次改动都要经过你的中央团队。后者是一条一年之后你还在维护的支持队列。
- 能继承多深?两层很常见。一家旗下学校还带校区的出版社,需要更多层。
- 除了设计,术语也会继承吗?如果你可以把“学生”改叫“学员”,那就问一问这会不会向下级联,以及是不是每种语言要分别设置。
每个子组织都能有自己的品牌和域名吗,还是只有顶层账户可以?
这一条在整份清单里差异最大,也正是它把一个多租户平台和一个换了主题的单租户平台区分开来。许多产品只给账户做品牌,给子账户的是父级品牌的一个过滤视图——对部门来说没问题,对客户来说就是错的。问一问:一个子级能不能持有自己的主机名、证书、一对 logo、配色和发件人,以及到哪一层深度这些就没有了。
自己动手做的几项测试
移动端体验
先弄清楚卖给你的是哪一样,因为“我们有移动端”盖住的是两种产品,各有各的品牌故事。如果是原生 App,那些问题就是商务问题,而不是外观问题。应用商店条目上写的是谁的名字?开发者账号归谁,谁来提交版本?是不是每个客户一个独立构建,随之还有一轮独立的审核周期?
如果是响应式 Web 应用,品牌走的是和桌面站点同一条代码路径,在这件事上通常是更好的答案。要求在你自己的域名上按手机宽度看一看,然后问:学员把它添加到主屏幕时,出现的是什么名字和什么图标。
页面源码
早晚会有人去看网页源代码——客户的 IT 团队,或者一个好奇的学员。你不是在藏什么;你是在检查这个平台当初是不是按“以别人的名义对外提供”来建的。两条命令就能回答大半。
# 你的域名上提供的那张证书,写的是谁的名字?
openssl s_client -connect learn.yourbrand.com:443 \
-servername learn.yourbrand.com </dev/null 2>/dev/null \
| openssl x509 -noout -text | grep -A1 'Subject Alternative Name'
# HTML 和响应头里说了什么?
curl -sL https://learn.yourbrand.com | grep -io 'vendorname' | wc -l
curl -sI https://learn.yourbrand.com | grep -iE 'server|x-powered-by|content-security-policy'证书这一项检查最有意思。有些平台按客户主机名逐个签发证书;另一些把许多客户放在同一张多名称证书上。如果你客户域名上的备用名称列表里点了其他客户的名,那就是关于这家厂商还服务了谁的公开信息,而安全评审会把它找出来。
在 HTML 里,读一读页面标题、`og:site_name` 标签、web manifest、脚本和图片是从哪些主机名加载的,以及内容安全策略响应头里的分析和错误上报端点。那些端点是最常见的破绽,因为没人把它们当成品牌的一部分。
这通电话该怎么开
- 要一个跑在你自己控制的域名上的真实租户,而不是一段录好的演示。花一天做 DNS,比用一年的合同去试便宜。
- 让他们往你控制的邮箱发一封真实的邀请和一封真实的密码重置。读链接的目标地址,读邮件头。
- 冷启动打开登录页:无痕窗口、深色模式、手机上。
- 对着你自己的主机名跑一遍上面那两条命令。
- 把答案收进一份共享文档,标上日期。“在开发中”写下来是个不错的答案,到第四个月才发现就很糟糕。
凡是换来一次界面演示、而不是一个回答的问题,就接着往下追。这种反应很少是在回避——通常只是说明以前没人问过。
Lurno 站在哪里
我们自己的答案,包括没做完的部分。域名是按组织来的,树的任意深度都可以,在该组织自己的设置里配置:输入主机名,把界面上列出的 DNS 记录发布出去,盯着状态直到证书显示为已生效,然后把它标为主域名。主机名走 Cloudflare;TLS 自动签发、自动续期。登录页只凭主机名就解析出 logo、标题、标语、主题和背景,在任何人完成认证之前。一旦某个域名成为主域名,该组织的邀请链接就建在它上面。
品牌设置是十七个字段——十四个颜色令牌,标题字体、正文字体、圆角半径——再加一个浅色 logo、一个深色 logo、一个 favicon、一个标题和一句标语。继承回答的正是上面那个粒度问题:没有设置主题的子组织,整套沿用父级的主题;一对 logo 作为一个整体继承,所以你不会把一个深色 logo 孤零零地留在浅色背景上;标题、标语和 favicon 则逐字段回退。术语可以按语言分别改名,通知邮件从组织自己的子域名发出。完整模型在白标页上;邮件由谁发送,写在安全页的子处理方清单里。
缺口,直说。没有原生移动 App——Lurno 是一个响应式 Web 应用,所以移动端和其他一切用的是同一套品牌,但应用商店里没有一个挂着你名字的 App,而原生 App 在路线图上,尚未交付。SAML 和 OIDC 单点登录同样在路线图上;今天存在的是合作方登录:由你的后端把一个它已经认证过的学员,用一份签名断言交接过来。支付和结账在开发中。
白标不是注册时打开的一个开关。它是一家厂商在你打来电话的许多年前,把边界画在哪里的结果,而这些边界在一个真实租户的地址栏、邮件头和页面源码里都读得出来。拿一个真实域名花半个小时,比开一下午的会更能解决这份清单上的问题——我们也一样,这正是演示的用处。