周五打算给客户发版,结果在这里卡了大半天,写篇博客记录下。
0. SSO 的实现
SSO,Single sign-on,单点登录,即统一处理用户登录、提供用户身份凭据的功能。使用 SSO,可以只维护一套用户体系,容易开发维护;对用户来说,只需要登录一次就能使用该开发商的全部产品,也很轻松方便。
一般来说,SSO 的流程是:
- 用户使用 A产品,域名是 pa.mydomain.com,登录服务(S)位于 login.mydomain.com
- 用户使用提供服务的 A产品,A产品需要登录,用户选择登录
- 来到登录服务,完成登录
- S服务将用户指回 A产品,返回的 URL 里包含一个 token
- A产品拿到 token,请求 S服务,验证 token,获取部分用户信息(比如邮箱,一般只用来展示
- A产品生成自己所需的身份凭据,并以此验证用户身份
我厂的产品也是这么实现的。
1. Chrome 扩展遇到的问题
本地调试一切正常,但是加载成扩展之后,从登录服务跳回扩展会遇到 ERR_BLOCKED_BY_CLIENT
错误,URL 也被重定向到 chrome://invalid/
。我在这里卡了很久,主要是不知道该怎么定位问题和搜索答案。
后来经过反复尝试,我终于发现,只有从登录页面跳转回去插件页面的时候,即 location.href='chrome-extension://{id}/ui/index.html
的时候,才会报错,所以立刻换用 chrome extension href ERR_BLOCKED_BY_CLIENT
作为关键词,立刻找到了答案:redirect to chrome-extension:// results in ERR_BLOCKED_BY_CLIENT。
然后阅读文档:Manifest – Web Accessible Resources(可由 Web 访问的资源),得知需要在 manifest.json
里添加对应的配置:
{
... "web_accessible_resources": [
"ui/index.html"
],
...
}
添加后 SSO 就正常了。
2. 后记
不过我没想明白的是,这个配置意义何在?配置写在扩展里,防止 web 访问扩展里的文件,似乎并没有什么帮助,也没什么安全性的顾虑。也许是我还没遇到吧。
欢迎吐槽,共同进步