【转】SAAS软件-ToB 破局之道

一篇把中国企业软件真正的困局、现况和我实践的破局之道串起来讲完。

有未知,就有预知。有预知,就有无知。

我们回到现实。中国 SaaS 的基本市场情况,我叫它“捡烟屁股”。

在两三年前,美股 SaaS 还没如此规模的、成批量的爆发,该领域国际资本还未外溢到中国,大部分 ToB 人只能徘徊在中国经济主体之外,捡着中国经济发展的缝隙,寻找客户,像在捡别人抽剩下的烟。

SaaS 产品通用性根植于目标市场中实践和流程的通用性,不能凭空编造而来。

而在中国企业中,由于通用行业范式的缺失,市场竞争机制的不透明、甚至不可控制、无法预测,市场主体的经营管理模式千奇百怪,行业和区域间沟壑纵深。由此得出推论:中国的企业软件模式,必然体现为“主干小、四肢大”的“向日葵模式”

以竞争为核心的市场,天天看的都是对手,打的是情报战。以客户为核心的市场,眼光才能看向客户,打的是服务牌。只有后者,才会行业有长久效益,也才有持久增长的基础。

而对于发展中国家而言,最高效的办法,其实就是最土的办法:抄作业。然而,如果抄个答案,没理解过程,无法推一反三,必然在中国这片迥乎不同的土壤中,无法得以应用。必须把信息拆开揉碎,消化掉,变成自己的养分,并因地制宜地创造最佳方案。这种“既有方案分析、拆解、组合、应用”的思路,和发达国家的“探索创新”模式,对资源、人员、理念的要求完全不同,也不应追求相同。

产品经年累月积累的那剩余 80% 的功能,就只为满足剩余 20% 客户中的一小部分。很多产品能力,我扪心自问,没有信心哪怕 2% 的客户能够使用到,但为了“未来可能出现的需求情况”,仍然会做到主线版本中。这和纯粹做交付和服务比起来,毕竟有产品在,肯定要更好。但距离理想仍然很遥远:这是偷懒的做法,给了自己在“做产品”的虚假预期,得以获取心理慰藉,其实还是在做交付,只是把交付做进了产品。

原文链接:https://mp.weixin.qq.com/s/DltDGK5BCjnwW-n1V2OElQ

寻找“身体-生活-工作”的平衡

在各个焦虑的场景里,更多的忘记了是什么在支撑着你走到今天,走过时日。

是身体。在节奏越来越快越来越紧急的生活中,生活为了工作,工作为了生活,是吧?有几分道理。我们熬夜,我们深度工作许久,总还是觉得年轻身体能抗的了。

没有善待的身体,需要在各个之间寻找一个平衡,加上身体这一要素。

如果说工作太苦,需要更多的生活,那给更多的生活时,身体就更好或更健康了,不见得。不工作的时日就是生活,而生活的时光中就让身体更好了,不见得。

这逻辑关系对否?

不能因为工作了10+小时就是在伤身体,而躺在沙发上一天玩手机不工作就是在善待身体了。许多的逻辑不能用时长来看待,只能算着是一个潜在的因素罢了。

阿里的“认真生活,快乐工作”需要每个人自身去考评,很难有标准的依据去平衡。

如何善待身体?定期体检(一年一次),周期性的坚持锻炼(最好以周为单位,每次1小时以上),睡足8小时。

如何过好生活?没有一个标准的答案,心态好,积极向上,开开心心,有人有事有意义就行啦。

工作中多喝水,多走动(每天1万步),多上厕所。特别是IT行业,要寻找到自己的平衡之术,才能在坚持多年后的工作中有点点成绩,且还有个不错的身体。跨掉的不会是工作,也不会是生活,唯有你的身体会跨掉。

平凡人做非凡事,非凡人做非凡事。其实平凡人就干平凡事。工作的核心要把难的事变成平凡人也能干,还能干好;而不是总希望平凡人去干非凡事,或一个人去干几人的事,往往事与愿违,半斤八两。

IT人经常所说的996,但又有许多人坚持了多年的996而继续着,坚持每个周两次锻炼,篮球足球或游泳,当身体锻炼舒展后,在一周5天多的工作中变得紧绑,而又在下一个周末的锻炼变得舒展,周期性地循环着十几年;但凡有点小的成绩出来之时皆是多少个小周期的循环着坚持着。

价值皆在工作中体现,而不是说你价值多少后才去证明,那往往是证明不了的。没有哪公司会对你说:给你支付100万/年的福利,你去给做出100万的价值回报公司。弄反了的人。

身体里装着你的灵魂你的思考你的邪恶你的世界,还有整个宇宙的奥秘。400KM以上速度的撞击身体,瞬间灰飞烟灭成气态,比如MU5735。

OIDC中JWK,JWKS的介绍与使用

JWKS全称为 JSON Web Key Set,是指多个JWK组合在一起的一种格式(详见 https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41#section-5 );

JWK全称是JSON Web Key,其标准协议链接:https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41

JWK在OIDC中的主要作用是为JWT(id_token)提供加密密钥,用于加密/解密或签名/验签,是JSON格式的数据。

综上所说,掌握了如何生成JWK,再按照JWKS协议的要求组合起来即可。根据使用不同的加密算法,各种算法的JWK展示内容会有些区别,一个使用RSA算法的JWK格式的数据如下,使用jose4j生成:

{
  "kty": "RSA",
  "kid": "myoidc-keyid",
  "use": "sig",
  "alg": "RS256",
  "n": "xMNL1jDatbHWGDH_H9GZbb2R4Ck2ga-lfE6wJnno_MfqJibSqkiLTZ7P06woJFxzB0WDu2PBe-ptRNoJhEnkzL8c1mgbGOdPVCsaaDm-POGZ3gnWGcyzyuJ9s9km41Rlan3TuuC3HIniY4bmyQAZ-SLwrFk7Bfa91ui4F9S5RvM",
  "e": "AQAB",
  "d": "q73XDM65p8vgll_VUn2NUPcdQ65VUB7y76xzHjJchX8tRj2utUj6pjaPKi_jHdG_6UHouIBa2oEE_QrfMaOZ2wA6LgYPXT_a296LKoOtKKRUlgob_leHxn0FJxLOXtEHgMqDgtMQ1-eFipsFgriip94dmcLEWW3YVK_y5JwJrnE",
  "p": "7OqN19bEbMb9cr9zA98QQq9LOgvQfq5-nOvzwMsubqMosHxViRnivFz2-3LpusK7u2XEG5EljqUxZrf4lgeVmw",
  "q": "1Jy9ksoLuQ5tuc4docgLaXQWqf3iaTm3iC07AA4v9jHzvnkewWFS_PUPPcra4475Dew-y7oIENaRBMijrrWViQ",
  "dp": "HBEdhLh4xLo-RF3R7l96uauyqcnEhX1-mnCJjAmGEq1ZoK7aI0fhyJbq25cdgXaYbvb7aJilbmS7mYOp-3wiiQ",
  "dq": "NRMLn-EgHAomCgQSEZjGgISiQ71FD8-AqVXhLJpeDq9ZkWra6ptJBCyIqXxCOBwwv_EBnAnMiaeGfBM6CRr7QQ",
  "qi": "VCdAeu4h25X_kM69Netc3SKPo5P-1VjeSHz0Ko0QuSMF0INc6H2yi7hZgZuYANVaTF1Ipf6lWfHBLpuRGh3lXw"
}

JWK数据的格式具体可参见 https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41#section-4

主要属性:kty(Key类型),use(两个可选值:sig or enc),alg(具体的算法),kid(Key的唯一标识id)

 

有了JWK数据,只需要按照JWKS的格式组装成对应的JSON数据即可,以上面的JWK组装的JWKS数据如下:

{
  "keys": [
    {
      "p": "7OqN19bEbMb9cr9zA98QQq9LOgvQfq5-nOvzwMsubqMosHxViRnivFz2-3LpusK7u2XEG5EljqUxZrf4lgeVmw",
      "kty": "RSA",
      "q": "1Jy9ksoLuQ5tuc4docgLaXQWqf3iaTm3iC07AA4v9jHzvnkewWFS_PUPPcra4475Dew-y7oIENaRBMijrrWViQ",
      "d": "q73XDM65p8vgll_VUn2NUPcdQ65VUB7y76xzHjJchX8tRj2utUj6pjaPKi_jHdG_6UHouIBa2oEE_QrfMaOZ2wA6LgYPXT_a296LKoOtKKRUlgob_leHxn0FJxLOXtEHgMqDgtMQ1-eFipsFgriip94dmcLEWW3YVK_y5JwJrnE",
      "e": "AQAB",
      "use": "sig",
      "kid": "myoidc-keyid",
      "qi": "VCdAeu4h25X_kM69Netc3SKPo5P-1VjeSHz0Ko0QuSMF0INc6H2yi7hZgZuYANVaTF1Ipf6lWfHBLpuRGh3lXw",
      "dp": "HBEdhLh4xLo-RF3R7l96uauyqcnEhX1-mnCJjAmGEq1ZoK7aI0fhyJbq25cdgXaYbvb7aJilbmS7mYOp-3wiiQ",
      "alg": "RS256",
      "dq": "NRMLn-EgHAomCgQSEZjGgISiQ71FD8-AqVXhLJpeDq9ZkWra6ptJBCyIqXxCOBwwv_EBnAnMiaeGfBM6CRr7QQ",
      "n": "xMNL1jDatbHWGDH_H9GZbb2R4Ck2ga-lfE6wJnno_MfqJibSqkiLTZ7P06woJFxzB0WDu2PBe-ptRNoJhEnkzL8c1mgbGOdPVCsaaDm-POGZ3gnWGcyzyuJ9s9km41Rlan3TuuC3HIniY4bmyQAZ-SLwrFk7Bfa91ui4F9S5RvM"
    }
  ]
}

以上的JWK,JWKS的示例的完整代码(JAVA实现)可在此查看 https://gitee.com/mkk/MyOIDC/blob/master/myoidc-server/src/test/java/myoidc/server/infrastructure/JWKSTest.java。代码中还包括除RSA外,ECC,OCT的示例实现。

 

JWK本身未定义一种新的加密算法或变种,只是定义一种JSON格式的数据展示(更符合互联网传输),其底层实现依旧依赖PKI体系的技术,如x509,公钥/私钥体系。在其协议介绍中能更好地体现出来。

20200920160628

 

如果是使用非JAVA语言,也可以使用对应的PKI技术生成JWK,如openssl;

一个使用JDK自带的 keytool 工具生成的示例如下:

keytool -genkeypair -alias oidc-demo -validity 180 -keyalg RSA -keypass oidc-demo -keystore oidc-demo.jks -storepass oidc-demo

命令输入后依次填写DN的各类信息,即可生成 oidc-demo.jks文件,密码为 oidc-demo,文件中有私钥公钥等信息。

若需要导出为 x509格式数据,使用keytool命令:

keytool -exportcert -keystore oidc-demo.jks -rfc -file oidc-demo.cer -alias oidc-demo

输入密码后生成的 oidc-demo.cer文件为x509格式。