diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/README.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/README.md new file mode 100644 index 000000000..0c6c2c27b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/README.md @@ -0,0 +1,41 @@ +# Website + +This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. + +### Installation + +``` +$ yarn +``` + +### Local Development + +``` +$ yarn start +``` + +This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. + +### Build + +``` +$ yarn build +``` + +This command generates static content into the `build` directory and can be served using any static contents hosting service. + +### Deployment + +Using SSH: + +``` +$ USE_SSH=true yarn deploy +``` + +Not using SSH: + +``` +$ GIT_USER= yarn deploy +``` + +If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/10_welcome.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/10_welcome.md new file mode 100644 index 000000000..cedc0b369 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/10_welcome.md @@ -0,0 +1,164 @@ +--- +sidebar_position: 1 +title: 概述 +--- + + +## MaxKey概述 +MaxKey单点登录认证系统,谐音为马克思的钥匙寓意是最大钥匙,是业界领先的IAM身份管理和认证产品;支持OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM等标准协议;提供安全、标准和开放的用户身份管理(IDM)、身份认证(AM)、单点登录(SSO)、资源管理和权限管理等。 + + +官方QQ:**1054466084** + + +邮箱EMAIL: support@maxsso.net + + +代码托管 GitHub | 码云(Gitee) + +### 什么是单点登录 + +>**单点登录(Single Sign On)**简称为**SSO** +> +>用户只需要登录认证中心一次就可以访问所有相互信任的应用系统,无需再次登录,主要功能: +> +>1.所有应用系统共享一个身份认证系统 +> +>2.所有应用系统能够识别和提取ticket信息 + + + +## 标准协议 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号协议支持
1 OAuth 2.x/OpenID Connect
2 SAML 2.0
3 JWT
4 CAS
5 FormBased
6 TokenBased(Post/Cookie)
7 ExtendApi
8 EXT
+ +![单点登录](/images/authz.png) + +## 登录支持 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号登录方式类型
1 图片验证码字母/数字/算术
2 双因素认证 短信或者邮件动态验证码
3 短信认证腾讯云短信/阿里云短信/网易云信
4 TOTP或者HOTP动态口令Google/Microsoft Authenticator/FreeOTP/支持TOTP或者HOTP
5 Windows域认证Kerberos/SPNEGO/AD域
6 LDAP认证OpenLDAP/ActiveDirectory/标准LDAP服务器
7 社交账号微信/QQ/微博/钉钉/Google/Facebook/其他
8 扫码登录企业微信/钉钉/飞书扫码登录
+ +![认证模型](/images/authn.png) + +## 产品优势 + +1. 提供标准的认证接口以便于其他应用集成SSO,安全的移动接入,安全的API、第三方认证和互联网认证的整合。 + +2. 提供用户生命周期管理,支持SCIM 2协议;开箱即用的连接器(Connector)实现身份供给同步。 + +3. 简化微软Active Directory域控、标准LDAP服务器机构和账号管理,密码自助服务重置密码。 + +4. 认证多租户功能,支持集团下多企业独立管理或企业下不同部门数据隔离的,降低运维成本。 + +5. 认证中心具有平台无关性、环境多样性,支持Web、手机、移动设备等, 如Apple iOS,Andriod等,将认证能力从B/S到移动应用全面覆盖。 + +6. 基于Java EE平台,微服务架构,采用Spring、MySQL、Tomcat、Redis、MQ等开源技术,扩展性强。 + +7. 开源、安全、自主可控,许可证 Apache 2.0 License & MaxKey版权声明。 + + +## 项目版本路线图 + +![项目版本路线图](/images/roadmap.jpg) + +## 最有价值开源项目 +Gitee-最有价值开源项目 + +![Gitee-最有价值开源项目](/images/gitee_mvp.png) \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/11_news.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/11_news.md new file mode 100644 index 000000000..e2feb2612 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/11_news.md @@ -0,0 +1,66 @@ +--- +title: 新闻动态 +--- +# 新闻动态 + +关于Authing.cn在百度搜索关键字“MaxKey单点登录认证系统”侵权的进展通告-[2022/07/16] 查看 + +MaxKey 单点登录认证系统前后端分离 v3.5.1GA 发布[2022/06/01] 查看 + +MaxKey 单点登录认证系统前后端分离 v3.5.0GA 发布[2022/05/11] 查看 + +MaxKey 单点登录认证系统 v3.5.0 RC 发布[2022/05/01] 查看 + +MaxKey 单点登录认证系统 v3.3.0 GA 发布[2022/03/03] 查看 + +MaxKey 单点登录认证系统 v3.2.0 GA 发布[2022/02/17] 查看 + +关于Authing.cn在百度搜索关键字“MaxKey单点登录认证系统”侵权的通告-[2021/12/15] 查看 + +MaxKey 单点登录认证系统 v3.1.0 GA 发布[2021/11/03] 查看 + +MaxKey 单点登录认证系统微服务架构 v3.0.0GA 发布[2021/09/29] 查看 + +MaxKey 单点登录认证系统 v2.9.0 GA 发布[2021/08/24] 查看 + +MaxKey 单点登录认证系统 v 2.8.1GA 发布 [2021/06/25] 查看 + +MaxKey 单点登录认证系统 v2.7.0GA 发布 [2021/04/15] 查看 + +Dromara 开源社区再次新增两个 GVP 项目 [2021/03/16] 查看 + +MaxKey单点登录认证系统 v 2.6.0GA 发布 [2021/03/05] 查看 + +MaxKey单点登录认证系统 v2.5.0GA 发布 [2021/02/06] 查看 + +MaxKey单点登录认证系统 v2.4.0GA 发布 [2021/01/01] 查看 + +单点登录认证系统 MaxKey v2.3.0GA 发布 [2020/11/11] 查看 + +单点登录认证系统 MaxKey v2.2.0GA 发布 [2020/09/24] 查看 + +单点登录认证系统 MaxKey v2.2.0RC 发布 [2020/09/04] 查看 + +六个高Star开源项目,让你更懂OAuth和单点登录 [2020/08/17] 查看 + +MaxKey官方网站全新改版 [2020/08/06] MaxKey.top + +单点登录认证系统 MaxKey v2.1.0GA 发布 [2020/08/01] 查看 + +单点登录认证系统 MaxKey v2.0.0GA 发布 [2020/07/13] 查看 + +单点登录认证系统 MaxKey v2.0.0RC1 发布 [2020/06/01] 查看 + +开源sso单点登陆系统推荐,MaxKey社区努力进步中 [2020/05/20]查看 + +单点登录认证系统 MaxKey v1.4.0GA 发布 [2020/05/01] 查看 + +还得看 Java!Gitee 4月最火 Java 项目大盘点 [2020/04/07]查看 + +单点登录认证系统 MaxKey v1.3.0GA 发布 [2020/04/04] 查看 + +单点登录认证系统 MaxKey v1.2.0GA 发布 [2020/02/18] 查看 + +MaxKey单点登录认证系统 oschina收录时间 [2019-12-09]查看 + +MaxKey单点登录认证系统开源重构 [2019-02-07] \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/12_team.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/12_team.md new file mode 100644 index 000000000..3f35ab48d --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/12_team.md @@ -0,0 +1,243 @@ +--- +title: 项目团队 +className: ./css/custom.css +--- +## 项目团队 + +一个成功的项目需要许多人扮演许多角色。有些成员编写代码或文档,而另一些成员作为测试人员有价值,可以提交补丁和建议。 + +项目团队由成员和贡献者组成。成员可以直接访问项目的源代码并积极发展代码库。贡献者通过向成员提交补丁和建议来改善项目。该项目的贡献者数量是无限的。今天就参与。非常感谢该项目的所有贡献。 + +## 团队成员 + +以下是具有提交特权的开发者列表,这些开发者以一种或另一种方式直接对项目做出了贡献。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
名称头像(CodeID)组织角色时区
shimingxy + + + MaxKeyTopPMC ChairAsia/北京
shibanglin + + + + MaxKeyTopPMC MemberAsia/北京
fucan1017 + + + + MaxKeyTopPMC MemberAsia/北京
Coloey + + + + MaxKeyTopPMC MemberAsia/北京
apacheBright + + + + MaxKeyTopPMC MemberAsia/北京
FranisiL + + + + MaxKeyTopPMC MemberAsia/北京
Garrett.Xia + + + + MaxKeyTopPMC MemberAsia/北京
+ + +## 贡献者 + +以下其他人员通过建议,补丁或文档的方式为该项目做出了贡献。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
名称头像(CodeID)组织角色时区问题
stdnt-xiao + + + + contributorAsia/北京Docker和docker-compose部署的优化
QQ793732900(恍然如梦) + + contributorAsia/北京解决Maxkey在Chrome “您的连接不是私密连接” 问题
xiazhenyou + + + + contributorAsia/北京MaxKey-SpringBoot4CAS-demo
要懂得舍得(pcore) + + + contributorAsia/北京一键登录
yutel + + + + contributorAsia/北京退出功能优化
alanland + + + + contributorAsia/北京Docker支持
MemoryF + + + + contributorAsia/北京前后端分离注销问题
caffebabee + + + + contributorCN
tzk007 + + + + contributorCNMAC 启动时获取OS信息报错修复
whensuc + + + + contributorCN修正redis连接不释放
JLLeitschuh + + + + contributorBoston, MAvuln-fix: Temporary File Information Disclosure
+ +## 其他贡献者 + +https://github.com/dromara/MaxKey/graphs/contributors diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/13_licenses.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/13_licenses.md new file mode 100644 index 000000000..35ef10b03 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/13_licenses.md @@ -0,0 +1,98 @@ +--- +title: 项目许可证 +--- + +## 概况 +

通常,为项目列出的许可证是项目本身的许可证,而不是依赖项。

+ +## 项目许可证 +

Apache License, Version 2.0

+ + +http://www.apache.org/licenses/LICENSE-2.0 + + +``` +Copyright [2024] [MaxKey of copyright https://www.maxkey.top] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +``` + +## Apache-2.0中文解释 + +Apache License Version 2.0 鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。Apache Licence 也是对商业应用友好的许可,使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。 + + +协议中明确写出,只要遵守该许可的条款和条件的前提下,每位贡献者将被授予永久的、全球性的、非排他性的、免费的、免版税的、不可撤销的版权许可,以复制、准备衍生作品、公开展示、公开使用、再许可、分发本作品和其衍生作品(无论是以“源码”还是“目标”形式)。 + + +也就是不仅可以用,还可以对基于 Apache License Version 2.0 的作品或衍生作品进行修改或增补,并应用到商业项目。但前提是满足以下几个条件: + +1、需要给代码的用户一份 Apache Licence; + +2、如果你修改了代码,需要在被修改的文件中说明; + +3、在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明; + +4、如果再发布的产品中包含一个 Notice 文件,则在 Notice 文件中需要带有 Apache Licence。你可以在 Notice 中增加自己的许可,但不可以表现为对 Apache Licence 构成更改。 + + + +总结下来,就是需要在相关产品的 发行版本,Notice 文件、源码或文档里,添加归属声明的可读拷贝,并给接收者提供开源项目中提供的 Apache License Version 2.0 许可证的拷贝,在分发的衍生作品的源代码中,必须保留本作品源码中的所有版权、专利、商标和归属声明。 + + + +公司在使用 Apache License Version 2.0 授权的开源软件,进行分发的过程中,不应隐瞒或故意忽略提及对此软件的使用。 + +## 版权声明 +必须保留本作品及源码中的所有版权、专利、商标和归属声明,请遵守开源许可证,合规使用开源产品,避免法律纠纷。 + +## 第三方依赖声明 + +参见项目依赖 + + +## 违反开源协议新闻 + +关于Authing.cn在百度搜索关键字“MaxKey单点登录认证系统”侵权的进展通告-2022年07月16日 +
+ +开源项目维权成功案例: spug 开源运维平台成功维权-2022年06月28日 +
+ +删库跑路、“投毒”、改协议,开源有哪几大红线千万不能踩?-2022年06月24日 +
+ +GPL 法律之战:它是自由软件许可证,更具合同效力-2022年05月18日 +
+ +违规再分发 SkyWalking,火山引擎回应并道歉-2022年01月29日 +
+ +关于Authing.cn在百度搜索关键字“MaxKey单点登录认证系统”侵权的通告-2021年12月15日 +
+ +首例!违反 GPL 协议致侵权,被判赔偿 50 万元-2021年09月09日 +
+ +Apache Doris 声明 | 你们想知道的一切,都在这里了-2021年09月09日 +
+ +致老男孩教育的维权声明 - Spug 运维-2021年03月31日 +
+ +博云违反 Apache 2.0 开源协议被要求整改,开源协议到底应该如何遵守?-2020年06月19日 +
+ +开源作者痛斥京东重量级项目抄袭-2018年09月30日 diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/14_cevsenterprise.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/14_cevsenterprise.md new file mode 100644 index 000000000..f1deb5863 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/14_cevsenterprise.md @@ -0,0 +1,664 @@ +--- +title: 企业版 +--- + +

企业版和社区版对比

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
模块
Category
功能
Features
社区版
Community
企业版
Enterprise
标准协议OpenID Connect 1.0
标准协议OAuth v2.0/2.1
标准协议SAML V2.0
标准协议CAS 1.0/2.0/3.0
标准协议JWT
标准协议TOKEN令牌支持
标准协议密码代填(FORMBASED)支持
标准协议API扩展支持
标准协议扩展定制支持
认证服务用户登录
认证服务用户登录-图片验证码
认证服务用户登录-短信验证码
认证服务用户登录-TOTP动态令牌
认证服务用户登录-邮件验证码
认证服务用户登录-社交账号登陆
认证服务用户登录-企业微信、钉钉、飞书扫码登陆
认证服务用户登录-双因素认证
认证服务用户登录-Active Directory用户登录
认证服务用户登录-OpenLDAP用户登录
认证服务用户登录-Windows域认证
认证服务HMAC_SHA256信任登录
认证服务IP地址转换行政区域,Ip2region & GeoLite2离线地址库
认证服务登录注销
认证服务 应用访问权限控制
认证服务密码修改
认证服务密码过期修改
认证服务首次登陆密码修改
认证服务找回密码
认证服务安全配置
认证服务用户信息修改
认证服务社交账号绑定
认证服务主题切换
认证服务时间令牌
认证服务 应用账号管理
认证服务 多种设备支持
认证服务 系统登录日志
认证服务 应用访问日志
认证服务Redis集群支持
管理服务身份管理-机构管理
管理服务身份管理-用户管理
管理服务身份管理-组管理
管理服务身份管理-组成员管理
管理服务身份管理-岗位管理
管理服务账号管理简单映射
管理服务应用管理
管理服务访问控制-会话管理
管理服务访问控制-组访问控制(RBAC)管理
管理服务访问控制-用户访问控制(ACL)管理
管理服务权限管理-资源管理
管理服务权限管理-权限管理
管理服务权限管理-角色管理
管理服务权限管理-细粒度权限
管理服务OpenAPI-资源管理
管理服务OpenAPI-权限管理
管理服务分级授权-组织授权
管理服务分级授权-应用授权
管理服务分级授权-角色授权
管理服务配置管理-同步器管理
管理服务配置管理-登录策略
管理服务配置管理-密码策略
管理服务配置管理-弱密码策略
管理服务管理端单点登录
管理服务配置管理-账号策略
管理服务配置管理-适配器管理
生命周期管理REST接口机构和用户同步
生命周期管理SCIM2接口机构和用户同步
生命周期管理MQ(RocketMQ/KAFKA)同步支持
生命周期管理同步器把存在上游系统的机构和账号同步到MaxKey
生命周期管理Active Directory同步器
生命周期管理标准LDAP同步器
生命周期管理企业微信同步器
生命周期管理钉钉同步器
生命周期管理飞书同步器
生命周期管理北森HR同步器
生命周期管理连接器把MaxKey的机构和账号同步到下游系统
生命周期管理Active Directory连接器
生命周期管理标准LDAP连接器
生命周期管理企业微信连接器
生命周期管理钉钉连接器
生命周期管理飞书连接器
生命周期管理华为WeLink连接器
日志审计仪表盘报表
日志审计系统管理日志
日志审计系统登录日志
日志审计应用登录日志
日志审计同步器日志
日志审计连接器日志
其他Maven版本
其他JAVA SDK
.NET SDK
其他支持多平台
Windows
LINUX
UNIX
其他支持主流浏览器:
Google Chrome
Mozilla Firefox
Internet Explorer 10
Microsoft Edge
其他支持PC、平板PAD、手机Moblie
其他开发集成指南
支持服务产品文档及安装配置(集群)
社区
支持服务版本升级及BUG修复社区
支持服务官方QQ(1054466084)支持
支持服务官方邮件(support@maxsso.net)支持
支持服务专属微信群/QQ群在线支持
支持服务集成解决方案咨询
支持服务技术培训
支持服务定制开发支持
支持服务客户化界面定制
支持服务紧急故障修复
支持服务研发团队支持
\ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/15_cevscas.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/15_cevscas.md new file mode 100644 index 000000000..7fd5382e9 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/15_cevscas.md @@ -0,0 +1,614 @@ +--- +title: 开源产品对比 +--- + +

MaxKey和Keycloak/CAS对比

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
模块功能MaxKeyKeycloakApereo CAS
标准协议OpenID Connect 1.0插件
标准协议OAuth v2.0/2.1插件
标准协议SAML V2.0插件
标准协议CAS 1.0/2.0/3.0
标准协议JWT定制定制
标准协议TOKEN令牌支持
标准协议密码代填(FORMBASED)支持
标准协议API扩展支持
标准协议扩展定制支持定制定制
认证服务用户登录
认证服务用户登录-图片验证码定制
认证服务用户登录-短信验证码
认证服务用户登录-TOTP动态令牌定制
认证服务用户登录-邮件验证码
认证服务用户登录-社交账号登陆
认证服务用户登录-企业微信、钉钉扫码登陆
认证服务用户登录-双因素认证定制
认证服务用户登录-Active Directory用户登录
认证服务用户登录-OpenLDAP用户登录
认证服务用户登录-Windows域认证企业版
认证服务登录注销
认证服务 应用访问权限控制定制
认证服务密码修改
认证服务密码过期修改
认证服务首次登陆密码修改
认证服务找回密码
认证服务安全配置
认证服务用户信息修改
认证服务社交账号绑定
认证服务主题切换
认证服务时间令牌插件
认证服务 应用账号管理
认证服务 多种设备支持
认证服务 用户登录日志
认证服务 应用访问日志
认证服务 管理日志
管理服务机构管理
管理服务用户管理
管理服务账号管理
管理服务应用管理
管理服务访问控制-角色管理
管理服务访问控制-角色成员管理
管理服务访问控制-访问控制管理
管理服务权限管理-资源管理
管理服务权限管理-权限管理
管理服务配置管理-同步器管理
管理服务配置管理-适配器管理
管理服务配置管理-密码策略
管理服务管理端单点登录
生命周期管理REST接口机构和用户同步
生命周期管理SCIM2接口机构和用户同步
生命周期管理消息同步支持企业版
生命周期管理同步器把存在上游系统的机构和账号同步到MaxKey
生命周期管理Active Directory同步器
生命周期管理标准LDAP同步器
生命周期管理企业微信同步器
生命周期管理钉钉同步器
生命周期管理连接器把MaxKey的机构和账号同步到下游系统
生命周期管理Active Directory连接器企业版
生命周期管理标准LDAP连接器企业版
生命周期管理企业微信连接器企业版
生命周期管理钉钉连接器企业版
生命周期管理飞书连接器企业版
生命周期管理华为WeLink连接器企业版
日志审计统计报表
日志审计管理日志审计
日志审计登录日志审计
日志审计应用访问日志审计
日志审计连接器日志审计
日志审计同步器日志审计
其他JAVA SDK
.NET SDK
其他支持多平台
Windows
LINUX
UNIX
其他支持主流浏览器:
Google Chrome
Mozilla Firefox
Internet Explorer 10
Microsoft Edge
其他支持PC、平板PAD、手机Moblie
其他开发集成指南
客户服务产品文档及安装配置(集群)
开源社区
开源社区
开源社区
客户服务版本升级及BUG修复开源社区开源社区开源社区
客户服务在线技术支持官方QQ
客户服务集成解决方案咨询企业版
客户服务技术培训企业版
客户服务定制开发支持企业版
客户服务客户化界面定制企业版
客户服务紧急故障修复企业版
团队研发团队国内✅国外国外
diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/16_dependency.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/16_dependency.md new file mode 100644 index 000000000..d0963a653 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/16_dependency.md @@ -0,0 +1,1354 @@ +--- +title: 项目依赖 +--- +## 基础软件 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SoftWareVersionIntroductionHomeLicense
MySQL Community Server8.0.* + MySQL is the most trusted and widely used open source database platform in use today. 10 out of the top 10 most popular and highly-trafficked websites in the world rely on MySQL. + https://www.mysql.com/GNU General Public License v2.0
PostgreSQL 13.6.* + PostgreSQL is a powerful, open source object-relational database system with over 30 years of active development that has earned it a strong reputation for reliability, feature robustness, and performance. + https://www.postgresql.org/PostgreSQL License
OpenJDK17 + The place to collaborate on an open-source implementation of the Java Platform, Standard Edition, and related projects,open-source JDK for most popular Linux distributions. Oracle's free, GPL-licensed, production-ready OpenJDK JDK 14 binaries are at jdk.java.net/14; Oracle's commercially-licensed JDK 14 binaries for Linux, macOS, and Windows, based on the same code + http://openjdk.java.net/GNU General Public License v2.0
Node.jsNode.js v16.13.1 + Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. + https://nodejs.org/MIT License
Tomcat/Tomcat-embed9.0.* + The Apache Tomcat® software is an open source implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies. The Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket specifications are developed under the Java Community Process. + https://tomcat.apache.org/Apache License 2.0
nginx1.21.* + nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev. + http://nginx.org/2-clause BSD-like license
Redis6.0.* + Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes with radius queries and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster + https://redis.io/BSD licensed
OpenLDAP4.4.* + OpenLDAP Software is an open source implementation of the Lightweight Directory Access Protocol. + https://www.openldap.org/OpenLDAP Public License
Apache Kafka2.5.0 + Kafka® is used for building real-time data pipelines and streaming apps. It is horizontally scalable, fault-tolerant, wicked fast, and runs in production in thousands of companies. + https://kafka.apache.org/Apache License 2.0
Apache RocketMQ4.9.* + Apache RocketMQ™ is a unified messaging engine, lightweight data processing platform. + https://rocketmq.apache.org/Apache License 2.0
Gradle7.* + Gradle is an open-source build automation tool focused on flexibility and performance. Gradle build scripts are written using a Groovy or Kotlin DSL. Read about Gradle features to learn what is possible with Gradle. + https://gradle.org/Apache License 2.0
Eclipseeclipse-jee-2020-06 + The Eclipse IDE is famous for our Java Integrated Development Environment (IDE), but we have a number of pretty cool IDEs, including our C/C++ IDE, JavaScript/TypeScript IDE, PHP IDE, and more. + https://www.eclipse.org/Eclipse Public License - v 2.0
Visual Studio CodeVSCode Version 1.66 + Visual Studio Code is a lightweight but powerful source code editor which runs on your desktop and is available for Windows, macOS and Linux + https://code.visualstudio.com/MIT license
+ +## 项目依赖包 + +

以下是此项目的项目依赖中的编译依赖项列表。这些依赖项可以包含在子模块中,以编译和运行子模块:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DependencyGroupIdArtifactIdVersionTypeLicense
testjunitjunit4.11jarEPL 1.0
testjavax.servletjavax.servlet-api3.0.1jarGPL 2.0
testorg.mockitomockito-all1.10.19jarMIT
testxmlunitxmlunit1.6jarBSD
compilecommons-beanutilscommons-beanutils1.9.3jarApache-2.0
compilecommons-codeccommons-codec1.15jarApache-2.0
compilecommons-collectionscommons-collections3.2.2jarApache-2.0
compileorg.apache.commonscommons-collections44.4jarApache-2.0
compileorg.apache.commonscommons-compress1.2jarApache-2.0
compileorg.apache.commonscommons-csv1.7jarApache-2.0
compileorg.apache.commons commons-text1.9jarApache-2.0
compileorg.apache.commonscommons-dbcp22.6.0jarApache-2.0
compilecommons-dbutilscommons-dbutils1.7jarApache-2.0
compileorg.apache.commonscommons-digester33.2jarApache-2.0
compilecommons-digestercommons-digester2.1jarApache-2.0
compilecommons-iocommons-io2.8.0jarApache-2.0
compilecommons-langcommons-lang2.6jarApache-2.0
compileorg.apache.commonscommons-lang33.11jarApache-2.0
compilecommons-loggingcommons-logging1.2jarApache-2.0
compileorg.apache.commonscommons-pool22.6.2jarApache-2.0
compilecommons-httpclientcommons-httpclient3.1jarApache-2.0
compilecommons-fileuploadcommons-fileupload1.4jarApache-2.0
compileorg.apache.commonscommons-email1.5jarApache-2.0
compileorg.apache.httpcomponentshttpclient4.5.13jarApache-2.0
compileorg.apache.httpcomponentsfluent-hc4.5.13jarApache-2.0
compileorg.apache.httpcomponentshttpclient-cache4.5.13jarApache-2.0
compileorg.apache.httpcomponentshttpmime4.5.13jarApache-2.0
compileorg.apache.httpcomponentshttpcore4.4.14jarApache-2.0
compileorg.apache.velocityvelocity1.7jarApache-2.0
compilevelocityvelocity-dep1.4jarApache-2.0
compileorg.freemarkerfreemarker2.3.31jarApache-2.0
compileorg.apache.commonsnot-yet-commons-ssl0.3.9jarApache-2.0
compile org.apache.poi + poi
+ poi-scratchpad
+ poi-ooxml
+ poi-ooxml-schemas +
4.1.2jarApache-2.0
compile org.apache.xmlbeansxmlbeans3.0.1jarApache-2.0
compileorg.apache.logging.log4j + log4j-1.2-api
+ log4j-api
+ log4j-core
+ log4j-jcl
+ log4j-jul
+ log4j-slf4j-impl
+ log4j-web +
2.17.0jarApache-2.0
compileorg.slf4jslf4j-api1.7.30jarApache-2.0
compileorg.jboss.loggingjboss-logging3.4.1.FinaljarApache-2.0
compileorg.springframework + spring-aop
+ spring-aspects
+ spring-beans
+ spring-core
+ spring-context
+ spring-context-indexer
+ spring-context-support
+ spring-expression
+ spring-instrument
+ spring-jcl
+ spring-jdbc
+ spring-jms
+ spring-messaging
+ spring-orm
+ spring-oxm
+ spring-tx
+ spring-web
+ spring-webflux
+ spring-webmvc
+ spring-websocket
+ spring-test +
5.3.14jarApache-2.0
compileorg.apache.kafkakafka-clients2.6.1jarApache-2.0
compileorg.springframework.kafkaspring-kafka2.8.0jarApache-2.0
compileorg.springframework.retryspring-retry1.3.0jarApache-2.0
compileorg.springframework.security + spring-security-core
+ spring-security-web
+ spring-security-crypto +
5.6.0jarApache-2.0
compileorg.springframework.boot + spring-boot
+ spring-boot-starter
+ spring-boot-actuator
+ spring-boot-autoconfigure
+ spring-boot-starter-freemarker
+ spring-boot-starter-log4j2
+ spring-boot-starter-web
+ spring-boot-starter-tomcat
+ spring-boot-starter-test +
2.6.1jarApache-2.0
compileorg.springframework.securityspring-security-oauth2.5.1jarApache-2.0
compileorg.springframework.data + spring-data-commons
+ spring-data-keyvalue
+ spring-data-redis +
5.6.0jarApache-2.0
compileorg.springframework.pluginspring-plugin-core2.0.0.RELEASEjarApache-2.0
compileorg.springframework.pluginspring-plugin-metadata2.0.0.RELEASEjarApache-2.0
compileorg.springframework.sessionspring-session-core5.6.0jarApache-2.0
compileorg.springframework.sessionspring-session-data-redis5.6.0jarApache-2.0
compileorg.opensamlopensaml2.6.6jarApache-2.0
compileorg.opensamlopenws1.5.6jarApache-2.0
compileorg.opensamlxmltooling1.4.6jarApache-2.0
compilenet.shibboleth.utilitiesjava-support7.5.1jarApache-2.0
compilecom.nimbusdsnimbus-jose-jwt9.4.1jarApache-2.0
compilenet.jcipjcip-annotations1.0jarApache-2.0
compilenet.minidevjson-smart2.3jarApache-2.0
compilenet.minidevasm1.0.2jarApache-2.0
compilecom.xkcoding.httpsimple-http1.0.3jarLGPL 3.0
compileme.zhyd.oauthJustAuth1.15.9jarMIT
compileorg.javassistjavassist3.23.0-GAjarApache-2.0
compileorg.owasp.esapiesapi2.2.0.0jarBSD 2-clause
compilecom.sun.mailjavax.mail1.6.2jarGPL 2.0
compileorg.eclipse.persistencejavax.persistence2.2.1jarEclipse Public License v. 2.0
compilejavax.activationactivation1.1.1jarCDDL 1.0
compilejavax.annotationjavax.annotation-api1.3.2jarGPLv2
compilejavax.transactionjta1.1jarGPLv2
compilejavax.transactionjavax.transaction-api1.3jarGPLv2
compilejavax.validationvalidation-api2.0.1.FinaljarApache-2.0
compilejavax.xmljsr1731.0jarApache-2.0
compilejavax.xml.bindjaxb-api2.3.1jarCDDL 1.1
compilecom.sun.xml.bindjaxb-core2.3.0.1jarEclipse Distribution License - v 1.0
compilecom.sun.xml.bindjaxb-impl2.3.2jarEclipse Distribution License - v 1.0
compilecom.sun.xml.bindjaxb-xjc2.3.2jarEclipse Distribution License - v 1.0
compileorg.bouncycastlebcpkix-jdk15on1.64jarBouncy Castle Licence
compileorg.bouncycastlebcprov-jdk15on1.64jarBouncy Castle Licence
compileorg.bouncycastlebcprov-ext-jdk15on1.64jarBouncy Castle Licence
compilecom.google.crypto.tinktink1.4.0jarApache-2.0
compilecom.jhlabsfilters2.0.235-1jarApache-2.0
compilecom.github.pengglekaptcha2.3.2jarApache-2.0
compilecom.google.code.gsongson2.8.8jarApache-2.0
compilecom.fasterxml.jackson.core + jackson-annotations
+ jackson-core
+ jackson-databind +
2.12.1jarApache-2.0
compilecom.fasterxmlclassmate1.5.0jarApache-2.0
compilecom.alibabafastjson1.2.74jarApache-2.0
compileorg.reactivestreamsreactive-streams1.0.2jarCC0 1.0
compileio.projectreactorreactor-core3.2.10.RELEASEjarApache-2.0
compileeu.tekulszxcvbn_2.9.20.2jarMIT
compileorg.quartz-schedulerquartz2.3.2jarApache-2.0
compilemysqlmysql-connector-java8.0.26jarGPL 2.0
compileorg.postgresqlpostgresql42.2.20jarBSD-2-Clause
compilecom.alibabadruid1.2.8jarApache-2.0
compilecom.alibabadruid-spring-boot-starter1.2.8jarApache-2.0
compileredis.clientsjedis3.7.1jarMIT
compileorg.ehcacheehcache3.9.0jarApache-2.0
compileorg.mybatismybatis3.5.8jarApache-2.0
compileorg.mybatismybatis-spring2.0.6jarApache-2.0
compileorg.hibernate.validatorhibernate-validator6.2.0.FinaljarApache-2.0
compileorg.hibernatehibernate-validator-cdi6.2.0.FinaljarApache-2.0
compileorg.hibernate.validatorhibernate-validator-annotation-processor6.2.0.FinaljarApache-2.0
compilejoda-timejoda-time2.10.9jarApache-2.0
compileorg.yamlsnakeyaml1.261.26Apache-2.0
compilenet.sourceforge.nekohtmlnekohtml1.9.22jarApache-2.0
compileorg.jdomjdom2.0.2jarApache-2.0
compilecom.google.zxingcore3.4.1jarApache-2.0
compilecom.google.guavaguava31.0.1-jrejarApache-2.0
compileognlognl3.2.14jarApache-2.0
compilecglibcglib3.3.0jarApache-2.0
compileorg.lionsoulip2region1.7.2jarApache-2.0
compileorg.ow2.asmasm7.3.1jarBSD 3-clause
compileaopallianceaopalliance1.0jarPublic
compileorg.aspectjaspectjtools1.9.4jarEPL 1.0
compiledom4jdom4j1.6.1jarBSD
compilexalanserializer2.7.2jarApache-2.0
compilexml-resolverxml-resolver1.2jarApache-2.0
compileorg.apache.santuarioxmlsec1.5.8jarApache-2.0
compileorg.ogcexpp31.1.6jarApache-2.0
compilecom.thoughtworks.xstreamxstream1.4.10jarBSD 3-clause
compileorg.passaypassay1.6.0jarApache 2.0 & LGPL 3.0
compileio.micrometer micrometer-core1.6.4jarApache 2.0
compileorg.latencyutils LatencyUtils2.0.3jarCC0 1.0
compileorg.codehaus.woodstox stax2-api4.2.1jar BSD 2-clause
compileorg.mapstruct mapstruct1.4.1.FinaljarApache 2.0
compilecom.aliyunaliyun-java-sdk-core4.5.1jarAliyun
compilecom.tencentcloudapitencentcloud-sdk-java3.1.33jarApache-2.0
compileorg.apache.tomcat.embedtomcat-embed-core9.0.46jarApache-2.0
compileorg.apache.tomcat.embedtomcat-embed-logging-juli8.5.2jarApache-2.0
compilemybatis-jpa-extramybatis-jpa-extra2.8jarApache-2.0
compilemybatis-jpa-extramybatis-jpa-extra-spring-boot-starter2.8jarApache-2.0
compilecom.highgoHgdbJdbc2.3jarApache-2.0
compilegradle.plugin.com.google.cloud.toolsjib-gradle-plugin3.1.4jarApache-2.0
compileio.swaggerswagger-annotations
+ swagger-models
1.6.2jarApache-2.0
compileio.swagger.core.v3 + swagger-annotations
+ swagger-core
+ swagger-integration
+ swagger-models
+
2.1.11jarApache-2.0
compileio.springfox + springfox-bean-validators
+ springfox-core
+ springfox-data-rest
+ springfox-spi
+ springfox-oas
+ springfox-schema
+ springfox-swagger2
+ springfox-swagger-ui
+ springfox-swagger-common
+ springfox-spring-webmvc
+ springfox-spring-web
+ springfox-spring-webflux
+ springfox-boot-starter +
3.0.0jarApache-2.0
compilecom.github.xiaoymin + knife4j-annotations
+ knife4j-core
+ knife4j-spring-mvc
+ knife4j-spring
+ knife4j-spring-ui
+ knife4j-spring-boot-starter
+ knife4j-spring-boot-autoconfigure +
3.0.2jarApache-2.0
+ +## 前端组件依赖 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DependencyComponentVersionTypeLicense
compileAngular13.3.3typescriptMIT-style License
compileAnt Design of Angular(NG-ZORRO)v13.1.1typescriptMIT
compileNG ALAINv13.4.2typescriptMIT
compileng-ant-adminv12.2+typescriptMIT License
compileCryptoJS4.1.1javascriptMIT License
diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/17_roadmap.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/17_roadmap.md new file mode 100644 index 000000000..484469c8e --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/17_roadmap.md @@ -0,0 +1,297 @@ +--- +title: 开发路线图 +--- + +## Roadmap + + + + + + + + + + + + + + + + + + + + + + + + + +
时间计划状态
2024Q2权限管理优化
2024Q2数据同步优化
2024Q1增强身份管理
+ +## Roadmap-2023 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
时间计划状态
2023Q3Java 17+
2023Q3Jakarta EE 10+
2023Q3Spring Framework 6
2023Q3Spring Boot 3
+ +## Roadmap-2022 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
时间计划状态
2022Q4docker-compose部署优化
2022Q3Spring Boot 2.7.x
2022Q2前后端分离
2022Q2会话管理
2022Q2二级缓存优化
2022Q2Ant Design of Angular
2022Q2OpenID Connect optimize
2022Q1JWT optimize
2022Q1OAuth 2.1
+ +## Roadmap-2021 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
时间计划状态
2021Q4Zero trust scenario integration
2021Q4腾讯iOA零信任产品适配
2021Q4Bootstrap 5.x
2021Q4SpringBoot 2.6.x
2021Q4docker-compose支持
2021Q3好雨科技Rainbond适配
2021Q3Nacos支持
2021Q3Maxkey-Cloud (micro service support)
2021Q3Multi-Tenancy
2021Q2国产数据库瀚高DB的适配
2021Q2Microsoft Active Directory支持
2021Q2SpringBoot 2.5.x
2021Q1Swagger文档支持
+ +## Roadmap-2020 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
时间计划状态
2020Q4Docker部署支持
2020Q3SAML 2.0优化
2020Q3SCIM 2支持
2020Q3SpringBoot 2.4.x
2020Q2企业微信、钉钉、飞书扫码登录
2020Q2RBAC 基于角色的访问控制
2020Q2短信验证码支持
2020Q1CAS 1.0,2.0,3.0支持
2020Q1Bootstrap 4.x
2020Q1密码策略支持
+ +## Roadmap-2019 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
时间计划状态
2019Q4SpringBoot 2.2.x
2019Q4OAuth 2.0支持
2019Q4SAML 2.0支持
2019Q4JWT支持
\ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/18_links.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/18_links.md new file mode 100644 index 000000000..b40084e72 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/18_links.md @@ -0,0 +1,216 @@ +--- +title: 友情链接 +--- +# 友情链接 + +## Dromara成员 + +Dromara 致力于微服务云原生解决方案的组织。 + +
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+ +
+ +## 友情链接 + +为 MaxKey 提供各种帮助和支持的朋友们,我们一起共奋进 + +
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + + +
\ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/_category_.json.bak b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/_category_.json.bak new file mode 100644 index 000000000..080aa9506 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/_category_.json.bak @@ -0,0 +1,8 @@ +{ + "label": "关于", + "position": 1, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important Docusaurus concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/news/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/news/_category_.json new file mode 100644 index 000000000..5ca1af63e --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/news/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "侵权通告", + "link": { + "type": "generated-index", + "description": "侵权通告." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/news/licenses_zqjy.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/news/licenses_zqjy.md new file mode 100644 index 000000000..2bbd2b711 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/news/licenses_zqjy.md @@ -0,0 +1,37 @@ +--- +title: 关于Authing.cn在百度搜索关键字侵权的通告 +--- + +## 版权归属 + +MaxKey单点登录认证系统,谐音马克思的钥匙寓意是最大钥匙,是业界领先的企业级IAM身份管理和认证产品,支持OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM等标准协议,提供简单、标准、安全和开放的用户身份管理(IDM)、身份认证(AM)、单点登录(SSO)、RBAC权限管理和资源管理等。 + +MaxKey单点登录认证系统是Dromara开源组织旗下的产品,并在中国版权保护中心申请软件著作权,软件著作权软件名称为MaxKey单点登录认证系统,简称MaxKey单点登录。 + +## 侵权情况 + +**2021年11月20日**在百度搜索“**MaxKey单点登录认证系统**”关键字,发现以下的搜索结果: + +结果1 + + +结果2 + + +结果3 + + + +Authing(北京蒸汽记忆科技有限公司)旗下有产品和Dromara开源组织的MaxKey单点登录认证系统属于竞争关系,Authing明知故犯,误导了MaxKey单点登录认证系统的客户,侵害了Dromara开源组织的权益,触犯了《**中华人民共和国著作权法**》。 + +## 进展情况 + +2021年11月21日,联系Authing的负责人通知其进行整改 + + + +**2021年11月28日**问题并未得到解决。 + +**2021年11月29日**,通过邮件《10910-关于maxkey单点登录认证系统关键字搜索的问题》告知百度公司存在的问题,同时按照百度要求提交软件著作权并申请百度品牌保护,保护的品牌为**MaxKey单点登录认证系统(MaxKey单点登录)**。 + +**截至2021年12月15日问题还未得到解决,特发此通告。** \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/news/licenses_zqjy_2207.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/news/licenses_zqjy_2207.md new file mode 100644 index 000000000..65ba3f123 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/about/news/licenses_zqjy_2207.md @@ -0,0 +1,33 @@ +--- +title: 关于Authing.cn在百度搜索关键字侵权的进展通告-202207 +--- + +## 版权归属 + +MaxKey单点登录认证系统,谐音马克思的钥匙寓意是最大钥匙,是业界领先的IAM身份管理和认证产品,支持OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM等标准协议,提供安全、标准和开放的用户身份管理(IDM)、身份认证(AM)、单点登录(SSO)、RBAC权限管理和资源管理等。 + +MaxKey单点登录认证系统是Dromara开源组织旗下的产品,并在中国版权保护中心申请软件著作权,软件著作权软件名称为MaxKey单点登录认证系统,简称MaxKey单点登录。 + +## 侵权情况 + +**2022年07月16日**在百度搜索“**MaxKey单点登录认证系统**”关键字,发现以下的搜索结果: + +结果1 + + + +结果2 + + + +结果3 + + + +Authing(北京蒸汽记忆科技有限公司)旗下有产品和Dromara开源组织的MaxKey单点登录认证系统属于竞争关系,Authing明知故犯,误导了MaxKey单点登录认证系统的客户,侵害了Dromara开源组织的权益,触犯了《**中华人民共和国著作权法**》。 + +## 进展情况 + +**2021年11月29日**,通过邮件《10910-关于maxkey单点登录认证系统关键字搜索的问题》告知百度公司存在的问题,同时按照百度要求提交软件著作权并申请百度品牌保护,保护的品牌为**MaxKey单点登录认证系统(MaxKey单点登录)**。 + +**截至2022年07月16日问题任未得到解决,特发此通告。** \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/babel.config.js b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/babel.config.js new file mode 100644 index 000000000..e00595dae --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/2019-05-28-first-blog-post.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/2019-05-28-first-blog-post.md new file mode 100644 index 000000000..02f3f81bd --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/2019-05-28-first-blog-post.md @@ -0,0 +1,12 @@ +--- +slug: first-blog-post +title: First Blog Post +authors: + name: Gao Wei + title: Docusaurus Core Team + url: https://github.com/wgao19 + image_url: https://github.com/wgao19.png +tags: [hola, docusaurus] +--- + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/2019-05-29-long-blog-post.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/2019-05-29-long-blog-post.md new file mode 100644 index 000000000..26ffb1b1f --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/2019-05-29-long-blog-post.md @@ -0,0 +1,44 @@ +--- +slug: long-blog-post +title: Long Blog Post +authors: endi +tags: [hello, docusaurus] +--- + +This is the summary of a very long blog post, + +Use a `` comment to limit blog post size in the list view. + + + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/2021-08-01-mdx-blog-post.mdx b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/2021-08-01-mdx-blog-post.mdx new file mode 100644 index 000000000..c04ebe323 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/2021-08-01-mdx-blog-post.mdx @@ -0,0 +1,20 @@ +--- +slug: mdx-blog-post +title: MDX Blog Post +authors: [slorber] +tags: [docusaurus] +--- + +Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/). + +:::tip + +Use the power of React to create interactive blog posts. + +```js + +``` + + + +::: diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg new file mode 100644 index 000000000..11bda0928 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/2021-08-26-welcome/index.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/2021-08-26-welcome/index.md new file mode 100644 index 000000000..9455168f1 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/2021-08-26-welcome/index.md @@ -0,0 +1,25 @@ +--- +slug: welcome +title: Welcome +authors: [slorber, yangshun] +tags: [facebook, hello, docusaurus] +--- + +[Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog). + +Simply add Markdown files (or folders) to the `blog` directory. + +Regular blog authors can be added to `authors.yml`. + +The blog post date can be extracted from filenames, such as: + +- `2019-05-30-welcome.md` +- `2019-05-30-welcome/index.md` + +A blog post folder can be convenient to co-locate blog post images: + +![Docusaurus Plushie](./docusaurus-plushie-banner.jpeg) + +The blog supports tags as well! + +**And if you don't want a blog**: just delete this directory, and use `blog: false` in your Docusaurus config. diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/authors.yml b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/authors.yml new file mode 100644 index 000000000..bcb299156 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/blog/authors.yml @@ -0,0 +1,17 @@ +endi: + name: Endilie Yacop Sucipto + title: Maintainer of Docusaurus + url: https://github.com/endiliey + image_url: https://github.com/endiliey.png + +yangshun: + name: Yangshun Tay + title: Front End Engineer @ Facebook + url: https://github.com/yangshun + image_url: https://github.com/yangshun.png + +slorber: + name: Sébastien Lorber + title: Docusaurus maintainer + url: https://sebastienlorber.com + image_url: https://github.com/slorber.png diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/_category_.json new file mode 100644 index 000000000..825341fb0 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "单点登录", + "position": 6, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important Docusaurus concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/inteapps.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/inteapps.md new file mode 100644 index 000000000..e4fd94f04 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/inteapps.md @@ -0,0 +1,139 @@ +--- +title: 常用应用列表 +sidebar_position: 4 +--- + +## 常用应用列表 + +MaxKey与常用应用集成,持续更新。。。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
应用名称图标类型文档
阿里云SAAS(云服务)集成指南
腾讯云SAAS(云服务)集成指南
华为云SAAS(云服务)
SalesForceSAAS(云服务)
腾讯企业邮箱SAAS(云服务)
华为云速邮箱SAAS(云服务)
泛微OA企业应用
O2OA企业应用
GitLab企业应用集成指南
JumpServer企业应用
ZABBIX企业应用
Kubernetes企业应用
Apache Knox企业应用
Apache APISIX企业应用
Jenkins企业应用集成指南
Liferay Portal企业应用
Grafana企业应用
禅道项目管理企业应用集成指南
Atlassian Confluence企业应用
Atlassian Jira企业应用集成指南
+ + \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/_category_.json new file mode 100644 index 000000000..9eab38793 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "应用集成", + "position": 3, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/gitlab.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/gitlab.md new file mode 100644 index 000000000..a15435f06 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/gitlab.md @@ -0,0 +1,113 @@ +--- +title: GitLab集成指南 +sidebar_position: 7 +--- + +## GitLab 介绍 + +GitLab 是由 GitLab Inc.开发,使⽤ MIT 许可证的基于⽹络的 Git 仓库管理⼯具,且具有 wiki 和 issue +跟踪功能。使⽤ Git 作为代码管理⼯具,并在此基础上搭建起来的 web 服务。 + +官⽅⽹站地址:https://about.gitlab.com/ + +## GitLab 安装配置 + +### GitLab 安装 + +请参照官⽅⽂档 https://about.gitlab.com/install/ + +### 配置 + +具体可参照 https://docs.gitlab.com/ee/integration/oauth_provider.html + +编辑 gitlab.rb + +```sh +vim /etc/gitlab/gitlab.rb +``` + +增加 Oauth 配置: + +```ini +gitlab_rails['omniauth_enabled'] = true +gitlab_rails['omniauth_allow_single_sign_on'] = ['oauth2_generic'] #跟下⾯的 name 对应,不建议修改 +gitlab_rails['omniauth_block_auto_created_users'] = false # 是否⾃动创建账号 +gitlab_rails['omniauth_providers'] = [ + { + 'name' => 'oauth2_generic', #此处跟maxke配置的回调地址有关系 + 'label': 'SSO', # 此处显示在 SSO 授权登录的名称 + // highlight-start + 'app_id' => '9cdbccbe-47a0-4adb-9d3d-7e0eceacaace', + 'app_secret' => 'F3QOMTUwMzIwMjExMTMyMTAzNDknMW', + // highlight-end + 'args' => { + client_options: { + // highlight-start + 'site' => 'http://yourdomain', # maxkey 认证端的域名 + 'authorize_url'=>'/sign/authz/oauth/v20/authorize', + 'token_url'=>'/sign/authz/oauth/v20/token', + 'user_info_url' => '/sign/api/oauth/v20/me' + // highlight-end + }, + user_response_structure: { + root_path: [], + // highlight-start + id_path: ['username'], + // highlight-end + attributes: { name: 'realname', email: 'username'} + }, + #name: 'maxkey', + strategy_class: "OmniAuth::Strategies::OAuth2Generic" + } + } +] +``` +配置⽂件修改完成后, 重设配置: +``` +gitlab-ctl reconfigure +``` + +重设完毕, 等待约 30 秒。 + +重新启动 gitliab +``` +gitlab-ctl restart +``` + +### 创建账号 +....略 + +### 创建⼀个账号 maxkey +....略 + +### 关联 Gitlab 账号 + +⽤户登录 gitlab 之后, 在 setting-Account 中点击 Connect 进⾏账户关联。 + + + + +关联成功后, 即可使⽤登录⻚的 Oauth2 登录。 + +### 注意事项 +Gitlab 必须要⼿动关联后, 才可单点登录。 +https 需要配置 omiauth 的 provider_ignores_state:true, 同时需要把 maxkey 的证书放到 gitlab 的 +trusted-certs 下, 然后 重新配置 gitlab-ctl reconfigure 就好了。 + +## MaxKey 配置及登录验证 + +### 应⽤配置 + +进⼊后台"应⽤管理" ,编辑应⽤ + + +进入"OAuth2.0 配置",配置如下 + + +### 应⽤访问赋权 + +如果不在该列表内,可以“新增成员” + +### 单点登录验证 + +重新登录 MaxKey,点击"Gitlab"图标单点登录 diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/index.txt b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/index.txt new file mode 100644 index 000000000..bf0580420 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/index.txt @@ -0,0 +1,26 @@ +a 1 +b 2 +c 3 +d 4 +e 5 +f 6 +g 7 +h 8 +i 9 +j 10 +k 11 +l 12 +m 13 +n 14 +o 15 +p 16 +q 17 +r 18 +s 19 +t 20 +u 21 +v 22 +w 23 +x 24 +y 25 +z 26 diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/jenkins.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/jenkins.md new file mode 100644 index 000000000..7cc02b1fa --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/jenkins.md @@ -0,0 +1,46 @@ +--- +title: Jenkins集成指南 +sidebar_position: 10 +--- + +## Jenkins 介绍 +Jenkins 是⼀个开源软件项⽬,是基于 Java 开发的⼀种持续集成⼯具,⽤于监控持续重 复的⼯作, +旨在提供⼀个开放易⽤的软件平台,使软件的持续集成变成可能。 + +Jenkins 是⼀个功能强⼤的应⽤程序,允许持续集成和持续交付项⽬,⽆论⽤的是什么 平台。这是 +⼀个免费的源代码,可以处理任何类型的构建或持续集成。集成 Jenkins 可以⽤ 于⼀些测试和部署 +技术。 + +Jenkins 是⼀种软件允许持续集成。Jenkins 安装在⼀台服务上也中央构建发⽣的地⽅。 + +官⽅⽹站地址:https://www.jenkins.io/ + +## Jenkins 安装配置 +### Jenkins 安装 +请参照官⽅⽂档 https://www.jenkins.io/doc/book/installing/ + +### 认证插件安装 +登录 jenkins 安装 cas-plugin + +参⻅⽂档 https://plugins.jenkins.io/cas-plugin/ + + +### 认证配置 +配置认证服务, 进⼊Configure Global Security, 具体配置⼊下 + + +备注:配置的URL为:http://yourdomain/sign/authz/cas/ + +## MaxKey 配置及登录验证 +### 应⽤配置 +进⼊后台"应⽤管理" ,编辑应⽤ + + +进入"CAS配置",配置如下 + + +### 应⽤访问赋权 +如果不在该列表内,可以“新增成员” + +### 单点登录验证 +重新登录MaxKey,点击"Jenkins"图标单点登录 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/jira.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/jira.md new file mode 100644 index 000000000..65265aafd --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/jira.md @@ -0,0 +1,67 @@ +--- +title: Jira集成指南 +sidebar_position: 10 +--- + +## Atlassian Jira介绍 +JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 + +JIRA中配置灵活、功能全面、部署简单、扩展丰富,其超过150项特性得到了全球115个国家超过19,000家客户的认可。 + +官方网站地址:https://www.atlassian.com/software/jira + +## Jira安装配置 +### Jira 安装 +请参照官方文档 +https://confluence.atlassian.com/adminjiraserver0813/installing-jira-applications-1027137422.html + +安装路径D:\MaxKey\3party\Jira8.13.10 + +数据路径D:\MaxKey\3party\Jira8.13.10_data + +### Jira启动https +修改D:\MaxKey\3party\Jira8.13.10\conf + +```xml + +``` + +### 认证配置 +配置认证服务,进入Jira,具体配置入下 + + + +基本URL更改为https://jira.maxkey.top:8443 + + + + +备注: + +单一登录发行者:http://yourdomain/sign/saml + +身份提供者单一登录URL:http://yourdomain/sign/authz/saml20/{appid} + +用户名映射:```{NameID}``` + +## MaxKey 配置及登录验证 +### 应⽤配置 +进⼊后台"应⽤管理" ,编辑应⽤ + + +进入"SAML配置",配置如下 + + +### 应⽤访问赋权 +如果不在该列表内,可以“新增成员” + +### 单点登录验证 +重新登录MaxKey,点击“Jira”图标单点登录 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/zentao.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/zentao.md new file mode 100644 index 000000000..902015092 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/integration/zentao.md @@ -0,0 +1,114 @@ +--- +title: 禅道项目管理集成指南 +sidebar_position: 26 +--- + +## 禅道(ZenTao) 介绍 +禅道是第一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。 + +官方网站地址:https://www.zentao.net/ + +## 安装配置 +禅道11.5.1版本开始,增加第三方应用免密登录禅道的功能 + +具体单点登录的方案 + +https://www.zentao.net/book/zentaopmshelp/344.html + +软件下载 + +https://www.zentao.net/download.html + +ZenTaoPMS.***.win**.exe + +在window本地安装 + +安装完成后目录 + + +运行start.exe + +点击“服务”,修改端口避免和maxkey冲突 + + +去掉”启用Apache用户访问验证”,后“启动禅道” + + +## 禅道配置免密登录禅道 +https://www.zentao.net/book/zentaopmshelp/344.html + +禅道11.5.1版本开始,增加第三方应用免密登录禅道的功能。 + +下面,我们来介绍一下免密登录的具体配置。 + +### 添加应用,开启免密登录 + +登录禅道,到后台--二次开发--应用,添加应用时开启免密登录。 + +只有免密登录,选择开启后方可使用。 + + + +### 免密登录的签名机制 +以图中红框内容为例,假设你的禅道访问地址为www.zentao.net 或者 http://47.105.128.128/biz 。 + +我们的请求格式则为: + +http://www.zentao.net/api.php?m=user&f=apilogin&account=account&code=test&time=timestamp&token=token + +或者 + +http://47.105.128.128/biz/api.php?m=user&f=apilogin&account=account&code=test&time=timestamp&token=token + + + +说明: + +m:模块名,是固定的,不可更改。 + +f :方法名, 是固定的,不可更改。 + +account:你想要登录的用户名,该用户需存在于禅道系统中。 + +code:应用代号。 + +time:当前时间戳,php可用time()函数获取。时间戳只一次有效,下次免密登录时,需要刷新页面。 + +token:算法为:code、应用密钥、time()字符串合并,再进行 md5 加密。 + +``` +$code = 'test'; +$key = 'a5246932b0f371263c252384076cd3f0'; +$time = '1557034496'; +$token = md5($code . $key . $time); +``` + +### 错误提示 +401  缺少参数或应用未设置密钥 + +403  被限制访问 + +404  应用不存在 + +405  token已失效 + +406  用户不存在 + +407  错误的时间戳 + +## MaxKey 配置及登录验证 +### 应⽤配置 +进⼊后台"应⽤管理" ,编辑应⽤ + + +"API配置",配置如下 + + +"扩展配置",配置如下 + + +### 应⽤访问赋权 +如果不在该列表内,可以“新增成员” + +### 单点登录验证 +重新登录MaxKey,点击"Jenkins"图标单点登录 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/_category_.json new file mode 100644 index 000000000..f1cb2f18d --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "标准协议", + "position": 2, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/cas/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/cas/_category_.json new file mode 100644 index 000000000..0a86a3353 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/cas/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "CAS协议集成", + "position": 3, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/cas/cas.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/cas/cas.md new file mode 100644 index 000000000..9298afb97 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/cas/cas.md @@ -0,0 +1,13 @@ +--- +sidebar_position: 1 +title: CAS协议集成 +--- +# CAS应用集成 +本文介绍CAS应用如何与MaxKey进行集成。 + +## 应用注册 + +应用在MaxKey管理系统进行注册,注册的配置信息如下 +![sso_cas_conf](/images/sso/sso_cas_conf.png) + + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/cas/cas_java.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/cas/cas_java.md new file mode 100644 index 000000000..1ff0f79cc --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/cas/cas_java.md @@ -0,0 +1,365 @@ +--- +sidebar_position: 2 +title: CAS Java应用集成 +--- +# CAS Java应用集成 + +## CAS客户端配置 + +本文使用JAVA WEB程序为例 + +源代码地址 + +https://github.com/MaxKeyTop/MaxKey-Demo/blob/master/maxkey-demo-cas + + +### 引入依赖包 + +jar包依赖如下 + +```java +cas-client-core-3.2.1.jar +commons-codec-1.9.jar +commons-io-2.2.jar +commons-logging-1.1.1.jar +``` + + +### web.xml配置 +```xml + + + + + org.jasig.cas.client.session.SingleSignOutHttpSessionListener + + + CAS Single Sign Out Filter + org.jasig.cas.client.session.SingleSignOutFilter + + + CAS Single Sign Out Filter + /index.jsp + + + CAS Filter + org.jasig.cas.client.authentication.AuthenticationFilter + + + casServerLoginUrl + http://sso.maxkey.top/sign/authz/cas/login + + + + serverName + http://cas.demo.maxkey.top:8080/ + + + + CAS Filter + /index.jsp + + + + CAS Validation Filter + org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter + + + casServerUrlPrefix + http://sso.maxkey.top/sign/authz/cas/ + + + + serverName + http://cas.demo.maxkey.top:8080/ + + + + CAS Validation Filter + /index.jsp + + + CAS HttpServletRequest Wrapper Filter + + org.jasig.cas.client.util.HttpServletRequestWrapperFilter + + + + CAS HttpServletRequest Wrapper Filter + /index.jsp + + + CAS Assertion Thread Local Filter + org.jasig.cas.client.util.AssertionThreadLocalFilter + + + CAS Assertion Thread Local Filter + /index.jsp + + + index.jsp + + +``` + +### 获取登录名及用户属性 + +```java +<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> +<%@ page language="java" import="java.util.Map.Entry" %> +<%@ page language="java" import="org.apache.commons.codec.binary.Base64" %> +<%@ page language="java" import="org.jasig.cas.client.authentication.AttributePrincipal" %> +<%@ page language="java" import="org.jasig.cas.client.validation.Assertion" %> +<%@ page language="java" import="org.jasig.cas.client.util.AbstractCasFilter" %> +<% + String path = request.getContextPath(); + String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; + System.out.println("CAS Assertion Success . "); + Assertion assertion = (Assertion) request.getSession().getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION); + String username= assertion.getPrincipal().getName(); +%> + + + + + Demo CAS + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + <% + Map attMap = assertion.getPrincipal().getAttributes(); + for (Entry entry : attMap.entrySet()) { + String attributeValue=entry.getValue()==null?"":entry.getValue().toString(); + System.out.println("attributeValue : "+attributeValue); + if(attributeValue.startsWith("base64:")){ + attributeValue=new String(Base64.decodeBase64(attributeValue.substring("base64:".length())),"UTF-8"); + } + %> + + + + + <%}%> +
CAS Demo for MaxKey
CAS Logo
CAS Assertion<%=username %>
CAS Has Attributes <%=!assertion.getPrincipal().getAttributes().isEmpty() %> size : <%=assertion.getPrincipal().getAttributes().size() %>
CAS <%=entry.getKey() %> <%=attributeValue %>
+
+ + +``` + + +## SpringBoot CAS配置 + +源代码地址 + +https://github.com/MaxKeyTop/MaxKey-SpringBoot4CAS-demo + + +demo分别写了三个请求:拦截请求 test1/index,test1/index1 以及不拦截请求test1/index2, + +### 引入依赖包 + +```xml + + net.unicon.cas + cas-client-autoconfig-support + 2.3.0-GA + +``` + +### SpringBoot配置 + +``` +server: + port: 8989 +cas: + # cas服务端地址 + server-url-prefix: http://sso.maxkey.top/sign/authz/cas/ + # cas服务端登陆地址 + server-login-url: http://sso.maxkey.top/sign/authz/cas/login + # 客户端访问地址 + client-host-url: http://localhost:8989/ + # 认证方式,默认cas + validation-type: cas + # 客户端需要拦截的URL地址 + authentication-url-patterns: + - /test1/index + - /test1/index1 +``` + +扩展配置项 +``` +cas.authentication-url-patterns +cas.validation-url-patterns +cas.request-wrapper-url-patterns +cas.assertion-thread-local-url-patterns +cas.gateway +cas.use-session +cas.redirect-after-validation +cas.allowed-proxy-chains +cas.proxy-callback-url +cas.proxy-receptor-url +cas.accept-any-proxy +server.context-parameters.renew +``` + +### CAS注解 +在application启动类上加上 @EnableCasClient 注解 + +```java +@SpringBootApplication +@EnableCasClient +public class DemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } + +} +``` + +### 获取登录用户信息 + +```java + @GetMapping("test1/index1") + public String index1(HttpServletRequest request){ + String token =request.getParameter("token"); + System.out.println("token : "+token); + Assertion assertion = (Assertion) request.getSession().getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION); + + String username= assertion.getPrincipal().getName(); + System.out.println(username); + + return "test index cas拦截正常,登录账号:"+username; + } +``` + +## CAS REST登录 + +```java +package org.maxkey.web.authorize.endpoint; + +import org.pac4j.cas.profile.CasRestProfile; +import org.pac4j.cas.client.rest.CasRestFormClient; +import org.pac4j.cas.config.CasConfiguration; +import org.pac4j.cas.credentials.authenticator.CasRestAuthenticator; +import org.pac4j.cas.profile.CasProfile; +import org.pac4j.core.context.J2EContext; +import org.pac4j.core.context.WebContext; +import org.pac4j.core.credentials.TokenCredentials; +import org.pac4j.core.credentials.UsernamePasswordCredentials; +import org.pac4j.core.exception.HttpAction; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; + +import java.util.Map; +import java.util.Set; + +//https://apereo.github.io/cas/6.0.x/protocol/REST-Protocol.html + +public class RestTestClient { + + public static void main(String[] args ) throws HttpAction { + final String casUrlPrefix = "http://sso.maxkey.top/sign/authz/cas/"; + String username ="admin"; + String password ="maxkey"; + String serviceUrl = "http://cas.demo.maxkey.top:8080/demo-cas/"; + CasConfiguration casConfiguration = new CasConfiguration(casUrlPrefix); + final CasRestAuthenticator authenticator = new CasRestAuthenticator(casConfiguration); + final CasRestFormClient client = new CasRestFormClient(casConfiguration,"username","password"); + final MockHttpServletRequest request = new MockHttpServletRequest(); + final MockHttpServletResponse response = new MockHttpServletResponse(); + + final WebContext webContext = new J2EContext(request, response); + casConfiguration.init(); + UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(username,password); + CasRestAuthenticator restAuthenticator = new CasRestAuthenticator(casConfiguration); + // authenticate with credentials (validate credentials) + restAuthenticator.validate(credentials, webContext); + final CasRestProfile profile = (CasRestProfile) credentials.getUserProfile(); + // get service ticket + final TokenCredentials casCredentials = client.requestServiceTicket(serviceUrl, profile, webContext); + // validate service ticket + final CasProfile casProfile = client.validateServiceTicket(serviceUrl, casCredentials, webContext); + + Map attributes = casProfile.getAttributes(); + Set> mapEntries = attributes.entrySet(); + for (Map.Entry entry : mapEntries) { + System.out.println(entry.getKey() + ":" + entry.getValue()); + } + client.destroyTicketGrantingTicket(profile,webContext); + } +} +``` + +详细见请参考 + +https://github.com/MaxKeyTop/MaxKey/blob/master/maxkey-protocols/maxkey-protocol-cas/src/test/java/org/maxkey/web/authorize/endpoint/RestTestClient.java \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/cas/cas_python.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/cas/cas_python.md new file mode 100644 index 000000000..dd6270d28 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/cas/cas_python.md @@ -0,0 +1,132 @@ +--- +sidebar_position: 2 +title: CAS Python应用集成 +--- +# CAS Python应用集成 + +## CAS客户端配置 + +本文使用Python程序为例 + +### 前置条件 + +Python以其简洁的语法、易读性和可扩展性而闻名。支持多种编程 范式,包含了用于网络编程、数据库交互、文本处理、数学计算等多个方面的功能。 + +安装以下版本 +``` +Python 3.10.9 +``` + +### 引入依赖包 + +包依赖如下 + +```bash +pip install flask +pip install python-cas +``` + + +### 运行程序 +```bash +set FLASK_ENV=development +set FLASK_APP=python_cas_demo.py +flask run --host 0.0.0.0 +``` + +### Python源代码 +```python +from flask import Flask, request, session, redirect, url_for +from cas import CASClient + +app = Flask(__name__) +app.secret_key = 'V7nlCN90LPHOTA9PGGyf' + +cas_client = CASClient( + version=3, + service_url='http://localhost:5000/cas/login?next=%2Fcas%2Fprofile', + server_url='http://sso.maxkey.top/sign/authz/cas/' +) + + +@app.route('/cas/') +def index(): + body = """ + + + Python CAS Demo + + + +

Welcome to python-cas Flask MaxKey Demo

+

点击MaxKey登录[CAS]

+ + +""" + return body + + +@app.route('/cas/profile') +def profile(method=['GET']): + if 'username' in session: + return '欢迎 %s. Logout' % session['username'] + return 'Login required. 退出登录', 403 + + +@app.route('/cas/login') +def login(): + if 'username' in session: + # Already logged in + return redirect(url_for('profile')) + + next = request.args.get('next') + ticket = request.args.get('ticket') + print("ticket: ", ticket) + if not ticket: + # No ticket, the request come from end user, send to CAS login + cas_login_url = cas_client.get_login_url() + app.logger.info('CAS login URL: %s', cas_login_url) + print('CAS login URL: %s', cas_login_url) + return redirect(cas_login_url) + + # There is a ticket, the request come from CAS as callback. + # need call `verify_ticket()` to validate ticket and get user profile. + app.logger.debug('ticket: %s', ticket) + app.logger.debug('next: %s', next) + print('ticket: %s', ticket) + print('next: %s', next) + + user, attributes, pgtiou = cas_client.verify_ticket(ticket) + + app.logger.debug( + 'CAS verify ticket response: user: %s, attributes: %s, pgtiou: %s', user, attributes, pgtiou) + print( + 'CAS verify ticket response: user: %s, attributes: %s, pgtiou: %s', user, attributes, pgtiou) + + if not user: + return 'Failed to verify ticket. Login' + else: # Login successfully, redirect according `next` query parameter. + session['username'] = user + return redirect(next) + + +@app.route('/cas/logout') +def logout(): + redirect_url = url_for('logout_callback', _external=True) + cas_logout_url = cas_client.get_logout_url(redirect_url) + app.logger.debug('CAS logout URL: %s', cas_logout_url) + print('CAS logout URL: %s', cas_logout_url) + + return redirect(cas_logout_url) + + +@app.route('/cas/logout_callback') +def logout_callback(): + # redirect from CAS logout request after CAS logout successfully + session.pop('username', None) + return 'Logged out from CAS. Login' + +@app.route('/cas/ping') +def ping(): + return 'pong' +``` diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/formbased.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/formbased.md new file mode 100644 index 000000000..036ca82d7 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/formbased.md @@ -0,0 +1,16 @@ +--- +sidebar_position: 7 +--- +# FormBased应用集成 +本文介绍FormBased应用如何与MaxKey进行集成。 + +## 应用注册 + +应用在MaxKey管理系统进行注册,注册的配置信息如下 + +![sso_form_yd_conf](/images/sso/sso_form_yd_conf.png) + + +## 认证定制 + +可以基于相关的信息定制其他的认证方式。 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/jwt/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/jwt/_category_.json new file mode 100644 index 000000000..edff902f0 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/jwt/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "JWT协议集成", + "position": 5, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/jwt/jwt.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/jwt/jwt.md new file mode 100644 index 000000000..b3389d8cd --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/jwt/jwt.md @@ -0,0 +1,13 @@ +--- +sidebar_position: 1 +title: JWT协议集成 +--- +# JWT应用集成 +本文介绍JWT应用如何与MaxKey进行集成。 + +## 应用注册 + +应用在MaxKey管理系统进行注册,注册的配置信息如下 + +![sso_jwt_conf](/images/sso/sso_jwt_conf.png) + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/jwt/jwt_java.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/jwt/jwt_java.md new file mode 100644 index 000000000..1dd6bd825 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/jwt/jwt_java.md @@ -0,0 +1,119 @@ +--- +sidebar_position: 2 +title: JWT Java客户端集成 +--- + +## JWT Java客户端集成 + +本文使用JAVA WEB程序为例 + +### 引入客户端所需包 + +```java +gson-2.2.4.jar +maxkey-client-sdk.jar +nimbus-jose-jwt-8.10.jar +commons-codec-1.9.jar +commons-io-2.2.jar +commons-logging-1.1.1.jar +``` + + +### 获取令牌和用户信息及验证签名 + +```java +<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> +<%@ page language="java" import="org.maxkey.client.oauth.model.*" %> +<%@ page language="java" import="org.maxkey.client.utils.*" %> +<%@ page language="java" import="com.nimbusds.jwt.JWTClaimsSet" %> +<%@ page language="java" import="com.nimbusds.jose.*" %> +<%@ page language="java" import="com.nimbusds.jwt.*" %> +<%@ page language="java" import="com.connsec.oidc.jose.keystore.*" %> +<%@ page language="java" import="com.nimbusds.jose.jwk.*" %> +<%@ page language="java" import="java.io.File" %> +<%@ page language="java" import="com.nimbusds.jose.crypto.*" %> +<%@ page language="java" import="com.google.gson.*" %> +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; +String token=request.getParameter("jwt"); +System.out.println("jwt "+token); +SignedJWT signedJWT=null; +File jwksFile=new File(PathUtils.getInstance().getClassPath()+"jwk.jwks"); +JWKSet jwkSet=JWKSet.load(jwksFile); +RSASSAVerifier rsaSSAVerifier = new RSASSAVerifier(((RSAKey) jwkSet.getKeyByKeyId("maxkey_rsa")).toRSAPublicKey()); +try { + signedJWT = SignedJWT.parse(token); +} catch (java.text.ParseException e) { + // Invalid signed JWT encoding +} +System.out.println("signedJWT "+signedJWT); +JWTClaimsSet jwtClaims =signedJWT.getJWTClaimsSet(); +%> + + + + + JWT 1.0 Demo + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
JSON Web Token (JWT) 1.0 Demo
JWT 1.0 Logo
Issuer<%=jwtClaims.getIssuer() %>
Subject<%=jwtClaims.getSubject()%>
Audience<%=jwtClaims.getAudience() %>
ExpirationTime<%=jwtClaims.getExpirationTime() %>
JWTID<%=jwtClaims.getJWTID() %>
IssueTime<%=jwtClaims.getIssueTime() %>
Verify<%=signedJWT.verify(rsaSSAVerifier) %>
JWTClaims + +
+
+ + + +``` diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/jwt/jwt_php.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/jwt/jwt_php.md new file mode 100644 index 000000000..c598ee64c --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/jwt/jwt_php.md @@ -0,0 +1,46 @@ +--- +sidebar_position: 2 +title: JWT PHP客户端集成 +--- + +## JWT PHP客户端集成 + +### 引入依赖firebase/php-jwt + +```php +composer require firebase/php-jwt +``` + +### 验证签名 + +```php + +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oauth2/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oauth2/_category_.json new file mode 100644 index 000000000..97b0e12e3 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oauth2/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "OAuth2协议集成", + "position": 1, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oauth2/oauth2.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oauth2/oauth2.md new file mode 100644 index 000000000..fe84da1af --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oauth2/oauth2.md @@ -0,0 +1,449 @@ +--- +sidebar_position: 1 +title: OAuth2协议标准 +--- + +# OAuth2协议标准 +本文介绍OAuth2应用如何与MaxKey进行集成。 + +## 认证流程 +采用Authorization Code获取Access Token的授权验证流程又被称为Web Server Flow,适用于所有Server端的应用。其调用流程示意图如下: +![sso_oauth](/images/sso/sso_oauth.png) + + +对于应用而言,其流程由获取Authorization Code和通过Authorization Code获取Access Token这2步组成。 + +1.引导需要授权的用户到如下地址: + +``` +http://sso.maxkey.top/sign/authz/oauth/v20/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI +``` + +2.页面跳转至 + +``` +YOUR_REGISTERED_REDIRECT_URI/?code=CODE +``` + +3.换取Access Token + +``` +http://sso.maxkey.top/sign/authz/oauth/v20/token?client_id=YOUR_CLIENT_ID&client_secret=YOUR _SECRET&grant_type=authorization_code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI&code=CODE +``` + +返回值 + +```json +{ "access_token":"SlAV32hkKG", "remind_in ":3600, "expires_in":3600 } +``` + +## 应用注册 +应用在MaxKey管理系统进行注册,注册的配置信息如下 + +![sso_oauth_conf](/images/sso/sso_oauth_conf.png) + + +## API接口标准 + + + + + + + + + + + + + + + + + + + + + + +
接口 说明 详细说明
/authz/oauth/v20/authorize 请求用户授权Token http://sso.maxkey.top/sign接收app sso认证请求,
client_id为需要认证的应用的id;
/authz/oauth/v20/token 获取授权过的 Access Token 后台应用获取 code ,调用接口进行 code 校验;
校验成功获取访问 token
/api/oauth/v20/me 授权用户信息查询接口 通过访问 token 获取登录用户信息
+ + +### 授权接口 + +/authz/oauth/v20/authorize + +请求用户授权Token + + + + + + + + + + + + + + +
接口名称 请求用户授权Token
url http://sso.maxkey.top/sign/authz/oauth/v20/authorize
请求方式 http get/post
+ +
请求参数
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
参数 说明
client_id 注册应用时分配的client_id。
redirect_uri 应用回调地址,注册时需要配置
grant_type授权类型。
etc param其他参数。
+ 响应返回app应用程序,包含请求参数如下: +
+ http://app.maxkey.org/app/callback?code =PQ7q7W91a-oMsCeLvIaQm6bTrgtp7 +
code用于调用/authz/oauth/token,接口获取授权后的访问token。
+ +### 令牌接口 +/authz/oauth/v20/token + +通过/authz/oauth/v20/token用code换取访问token + + + + + + + + + + + + + + +
接口名称 token 接口
url http://sso.maxkey.top/sign/authz/oauth/v20/token
请求方式 http get/post
+ +
请求参数
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
参数 说明
client_id 注册应用时分配的client_id。
client_secret 注册应用时分配的client_secret
redirect_uri 应用回调地址,注册时需要配置
code调用authz/oauth/v20/authorize获得的code值。
grant_type授权类型。Grant type
username当grant_type=password时,此参数表示直接认证用户名。
password当grant_type=password时,此参数表示直接认证用户密码。
etc param其他参数
+实际请求如下: + +```http +The actual request might look like: +POST /authz/oauth/v20/token token HTTP/1.1 +Host: sso.maxkey.org/openapi +Content-Type: application/x-www-form-urlencoded +code= PQ7q7W91a-oMsCeLvIaQm6bTrgtp7& +client_id=QPKKKSADFUP876& +client_secret=client_secret& +redirect_uri=http://app.maxkey.org/app/callback +``` +
+ 返回数据 +
+ A successful response to this request contains the following fields: +
access_token用该token能调用SSO的API
+ 成功返回JSON数据,如下: + +```json +{ + "access_token":"token_id", + "id_token":"id_token" +} +``` +
+ +### 用户属性接口 +/api/oauth/v20/me + + + + + + + + + + + + + + +
接口名称 token 接口
url http://sso.maxkey.top/sign/api/oauth/v20/me
请求方式 http get/post
+ +
请求参数
+ + + + + + + + + + + + + + + + + + + +
参数 说明
access_token 调用sso/ token获得的token值。
+ 实际请求如下: + +```http +POST /oauth/ userinfo HTTP/1.1 +Host: sso.maxkey.org/openapi +Content-Type: application/x-www-form-urlencoded +access_token= PQ7q7W91a-oMsCeLvIaQm6bTrgtp7 +``` + +
+ 返回数据/ response data +
+

成功返回JSON数据,如下:

+ +```json +{ + "userid":"zhangs" +} +``` + +
+zhangs是认证的用户ID +
+ + + +OAuth认证接口属性列表 + + + + + + + + + + + + +
属性名(Attribute) 描述 数据类型
uiduid字符串
+ + + +## OAuth2.0 错误码 + +MaxKey OAuth2.0实现中,授权服务器在接收到验证授权请求时,会按照OAuth2.0协议对本请求的请求头部.请求参数进行检验,若请求不合法或验证未通过,授权服务器会返回相应的错误信息,包含以下几个参数: + +error: 错误码 + +error_description: 错误的描述信息 + + + +错误信息的返回方式有两种: + +当请求授权Endpoint:http://sso.maxkey.top/sign/authz/oauth/v20/authorize 时出现错误,返回方式是:跳转到redirect_uri,并在uri 的query parameter中附带错误的描述信息。 + +当请求access token endpoint:http://sso.maxkey.top/sign/authz/oauth/v20/token 时出现错误,返回方式:返回JSON文本。 + +例如: +```json +{ + "error":"unsupported_response_type", + "error_description":"不支持的 ResponseType." +} +``` + +OAuth2.0错误响应中的错误码定义如下表所示: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
编号错误码(error)描述(error_description)
1empty_client_id参数client_id为空
2empty_client_secret参数client_secret为空
3empty_redirect_uri参数redirect_uri为空
4empty_response_type参数response_type为空
5empty_codecode为空
6app_unsupport_sso应用不支持sso登录
7app_unsupport_oauth应用不支持OAuth认证
8invalid_client_id非法的client_id
9invalid_response_type非法的response_type
10invalid_scope非法的scope
11invalid_grant_type非法的grant_type
12redirect_uri_mismatch非法的redirect_uri
13unsupported_response_type不支持传递的response_type
14invalid_code非法的code
15unsupported_refresh_token不支持refresh_token的方式
16access_token_expriseaccess_token过期
17invalid_access_token非法的access_token
18invalid_refresh_token非法的refresh_token
19refresh_token_expriserefresh_token过期
+ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oauth2/oauth2_java.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oauth2/oauth2_java.md new file mode 100644 index 000000000..bfc20b5ff --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oauth2/oauth2_java.md @@ -0,0 +1,201 @@ +--- +sidebar_position: 2 +title: OAuth2 Java客户端集成 +--- + +## OAuth2 Java客户端集成 + + +本文使用JAVA WEB程序为例 + +### 引入依赖包 + +```java +gson-2.2.4.jar +maxkey-client-sdk.jar +nimbus-jose-jwt-8.10.jar +commons-codec-1.9.jar +commons-io-2.2.jar +commons-logging-1.1.1.jar +``` + +### 认证授权 + +```java +<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> +<%@ page language="java" import="org.maxkey.client.oauth.oauth.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.builder.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.builder.api.MaxkeyApi20" %> +<%@ page language="java" import="org.maxkey.client.oauth.model.Token" %> + +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+path+"/"; + +String callback="http://oauth.demo.maxkey.top:8080/demo-oauth/oauth20callback.jsp"; +OAuthService service = new ServiceBuilder() + .provider(MaxkeyApi20.class) + .apiKey("b32834accb544ea7a9a09dcae4a36403") + .apiSecret("E9UO53P3JH52aQAcnLP2FlLv8olKIB7u") + .callback(callback) + .build(); +Token EMPTY_TOKEN = null; +String authorizationUrl = service.getAuthorizationUrl(EMPTY_TOKEN); + +request.getSession().setAttribute("oauthv20service", service); + +%> + + + + + + + OAuth 2.0 SSO + + + + + + + + + + oauth 2.0 sso + + +``` + +### 获取令牌及用户信息 + +```java +<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> +<%@ page language="java" import="org.maxkey.client.oauth.oauth.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.builder.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.builder.api.MaxkeyApi20" %> +<%@ page language="java" import="org.maxkey.client.oauth.model.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.domain.*" %> +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; + +OAuthService service = (OAuthService)request.getSession().getAttribute("oauthv20service"); +if(service == null){ + String callback="http://oauth.demo.maxkey.top:8080/demo-oauth/oauth20callback.jsp"; + service = new ServiceBuilder() + .provider(MaxkeyApi20.class) + .apiKey("b32834accb544ea7a9a09dcae4a36403") + .apiSecret("E9UO53P3JH52aQAcnLP2FlLv8olKIB7u") + .callback(callback) + .build(); +} + +Token EMPTY_TOKEN = null; +Verifier verifier = new Verifier(request.getParameter("code")); +Token accessToken = service.getAccessToken(EMPTY_TOKEN, verifier); + +OAuthClient restClient=new OAuthClient("http://sso.maxkey.top/sign/api/oauth/v20/me"); +UserInfo userInfo=restClient.getUserInfo(accessToken.getAccess_token()); + +%> + + + + + OAuth V2.0 Demo + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OAuth V2.0 Demo
OAuth V2.0 Logo
Login<%=userInfo.getUsername() %>
DisplayName<%=userInfo.getDisplayName() %>
Department<%=userInfo.getDepartment() %>
JobTitle<%=userInfo.getJobTitle() %>
email<%=userInfo.getEmail() %>
ResponseString + +
+ +
+ + +``` + +## OAuth2 PASSWORD模式 + +本文使用JAVA 程序为例 + +```java +package org.maxkey.client.oauth.test; + +import org.maxkey.client.http.Response; +import org.maxkey.client.oauth.builder.api.MaxkeyPasswordApi20; +import org.maxkey.client.oauth.model.OAuthConfig; +import org.maxkey.client.oauth.model.Token; +import org.maxkey.client.oauth.oauth.OAuthPasswordService; + +public class MaxkeyPasswordDemo { + /** + * @param args + */ + public static void main(String[] args) { + String accessTokenUrl="http://sso.maxkey.top/sign/authz/oauth/v20/token"; + String clientId = "b32834accb544ea7a9a09dcae4a36403"; + String clientSerect = "E9UO53P3JH52aQAcnLP2FlLv8olKIB7u"; + + String callback = "http://oauth.demo.maxkey.top:8080/demo-oauth/oauth20callback.jsp"; + String responseType ="token"; + String approvalprompt = "auto"; + + OAuthConfig oauthServiceConfig=new OAuthConfig(clientId,clientSerect,callback); + MaxkeyPasswordApi20 passwordApi20=new MaxkeyPasswordApi20(accessTokenUrl); + OAuthPasswordService oAuthPasswordService=new OAuthPasswordService(oauthServiceConfig,passwordApi20); + Token accessToken = null; + Response response = null; + accessToken = oAuthPasswordService.getAccessToken("admin", "maxkey"); + } +} +``` + + +### 详细见请参考 + +https://github.com/MaxKeyTop/MaxKey-Client-sdk/blob/master/src/test/java/org/maxkey/client/oauth/test/MaxkeyPasswordDemo.java \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oidc/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oidc/_category_.json new file mode 100644 index 000000000..cc78ccad9 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oidc/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "OIDC协议集成", + "position": 2, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oidc/oidc.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oidc/oidc.md new file mode 100644 index 000000000..6a3940917 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oidc/oidc.md @@ -0,0 +1,98 @@ +--- +sidebar_position: 1 +--- +# OpenID Connect协议集成 +本文介绍OpenID Connect协议如何与MaxKey进行集成。 + +## 认证流程 + +请参照OAuth2认证流程 + +## 应用注册 +应用在MaxKey管理系统进行注册,注册的配置信息如下 + +![sso_oidc_conf](/images/sso/sso_oidc_conf.png) + + +## 集成和接口 +用户属性接口/api/connect/v10/userinfo + +通过访问token 获取登录用户信息及签名信息,在程序中必须验证相关的签名信息。 + + + + + + + + + + + + + + +
接口名称 OIDC授权用户信息查询接口
url https://sso.maxkey.org/sign/api/connect/v10/userinfo
请求方式 http get/post
+ +
请求参数
+ + + + + + + + + + + + + + + + + + + +
参数 说明
access_token 调用sso/ token获得的token值。
+ 实际请求如下: + +```http +POST /oauth/userinfo HTTP/1.1 +Host: sso.maxkey.org/openapi +Content-Type: application/x-www-form-urlencoded +access_token= PQ7q7W91a-oMsCeLvIaQm6bTrgtp7 +``` +
+ 返回数据/ response data +
+

成功返回JSON数据,如下:

+ +```json +{ + userid : "zhangs" +} +``` + +
+zhangs是认证的用户ID +
+ + + +OAuth认证接口属性列表 + + + + + + + + + + + + +
属性名(Attribute) 描述 数据类型
uiduid字符串
+ +其他请参照OAuth2 diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oidc/oidc_java.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oidc/oidc_java.md new file mode 100644 index 000000000..0503b334c --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/oidc/oidc_java.md @@ -0,0 +1,213 @@ +--- +sidebar_position: 2 +title: OIDC Java客户端集成 +--- + +## OIDC V1客户端集成 + +本文使用JAVA WEB程序为例 + +### 引入依赖包 + +```java +gson-2.2.4.jar +maxkey-client-sdk.jar +nimbus-jose-jwt-8.10.jar +commons-codec-1.9.jar +commons-io-2.2.jar +commons-logging-1.1.1.jar +``` + +### 认证授权 + +```java +<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> +<%@ page language="java" import="org.maxkey.client.oauth.oauth.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.builder.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.builder.api.MaxkeyApi20" %> +<%@ page language="java" import="org.maxkey.client.oauth.model.Token" %> + +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+path+"/"; + +String callback="http://oauth.demo.maxkey.top:8080/demo-oauth/oauth20callback.jsp"; +OAuthService service = new ServiceBuilder() + .provider(MaxkeyApi20.class) + .apiKey("ae20330a-ef0b-4dad-9f10-d5e3485ca2ad") + .apiSecret("KQY4MDUwNjIwMjAxNTE3NTM1OTEYty") + .callback(callback) + .build(); +Token EMPTY_TOKEN = null; +String authorizationUrl = service.getAuthorizationUrl(EMPTY_TOKEN); + +request.getSession().setAttribute("oauthv20service", service); + +%> + + + + + + + OIDC V1 SSO + + + + + + + + + OIDC V1 SSO + + + +``` + + +### 登录验证 + +获取令牌、用户信息及验证签名 (id_token及用户信息) + +```java +<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> +<%@ page language="java" import="org.maxkey.client.oauth.oauth.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.builder.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.builder.api.MaxkeyApi20" %> +<%@ page language="java" import="org.maxkey.client.oauth.model.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.domain.*" %> +<%@ page language="java" import="org.maxkey.client.utils.*" %> +<%@ page language="java" import="com.nimbusds.jwt.JWTClaimsSet" %> +<%@ page language="java" import="com.nimbusds.jose.*" %> +<%@ page language="java" import="com.nimbusds.jwt.*" %> +<%@ page language="java" import="com.connsec.oidc.jose.keystore.*" %> +<%@ page language="java" import="com.nimbusds.jose.jwk.*" %> +<%@ page language="java" import="java.io.File" %> +<%@ page language="java" import="com.nimbusds.jose.crypto.*" %> +<%@ page language="java" import="com.google.gson.*" %> + +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; + +OAuthService service = (OAuthService)request.getSession().getAttribute("oauthv20service"); + +if(service==null){ + String callback="http://oauth.demo.maxkey.top:8080/demo-oauth/oidc10callback.jsp"; + service = new ServiceBuilder() + .provider(MaxkeyApi20.class) + .apiKey("ae20330a-ef0b-4dad-9f10-d5e3485ca2ad") + .apiSecret("KQY4MDUwNjIwMjAxNTE3NTM1OTEYty") + .callback(callback) + .build(); +} + +Token EMPTY_TOKEN = null; +Verifier verifier = new Verifier(request.getParameter("code")); +Token accessToken = service.getAccessToken(EMPTY_TOKEN, verifier); + +//JWTClaimsSet idClaims = JWTClaimsSet.parse(accessToken.getId_token()); +SignedJWT signedJWT=null; + +//JWKSetKeyStore jwkSetKeyStore=new JWKSetKeyStore(); + +File jwksFile=new File(PathUtils.getInstance().getClassPath()+"jwk.jwks"); +JWKSet jwkSet=JWKSet.load(jwksFile); + +RSASSAVerifier rsaSSAVerifier = new RSASSAVerifier(((RSAKey) jwkSet.getKeyByKeyId("maxkey_rsa")).toRSAPublicKey()); +try { + signedJWT = SignedJWT.parse(accessToken.getId_token()); +} catch (java.text.ParseException e) { + // Invalid signed JWT encoding +} +; + +OAuthClient restClient=new OAuthClient("http://sso.maxkey.top/sign/api/connect/v10/userinfo",accessToken.getToken()); + +OIDCUserInfo userInfo=restClient.getOIDCUserInfo(accessToken.getToken()); + +%> + + + + + + + OpenID Connect 1.0 Demo + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OpenID Connect 1.0 Demo
OpenID Connect 1.0 Logo
Login<%=userInfo.getSub() %>
DisplayName<%=userInfo.getName()%>
Department<%=userInfo.getGender() %>
email<%=userInfo.getEmail() %>
ResponseString + +
Id_token<%=accessToken.getId_token() %>
Verify<%=signedJWT.verify(rsaSSAVerifier) %>
Issuer<%=signedJWT.getJWTClaimsSet().getIssuer() %>
JWTClaims + +
+
+ + + + +``` diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/saml/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/saml/_category_.json new file mode 100644 index 000000000..cb8b87500 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/saml/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "SAML协议集成", + "position": 4, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/saml/saml_aly.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/saml/saml_aly.md new file mode 100644 index 000000000..9915076de --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/saml/saml_aly.md @@ -0,0 +1,23 @@ +--- +sidebar_position: 1 +title: SAML阿里云集成 +--- +# SAML阿里云集成 +本文介绍阿里云使用SAML如何与MaxKey进行集成。 + +

应用注册

+ +1)首先需要注册阿里云,并开通SAML认证功能,下载阿里云SAML元数据,具体说明文档请参照 + +访问控制 > 单点登录管理(SSO) > SSO概览 + + +2)应用在MaxKey管理系统进行注册,注册的配置信息如下,注册时需要提供阿里云SAML元数据 +![sso_saml_aly_conf](/images/sso/sso_saml_aly_conf.png) + + +扩展属性配置,把阿里云的3个相关属性配置到MaxKey中 + +![sso_saml_aly_conf_ex](/images/sso/sso_saml_aly_conf_ex.png) + +3)把MaxKey元数据上传到阿里云,参照阿里云文档 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/saml/saml_salesforce.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/saml/saml_salesforce.md new file mode 100644 index 000000000..ef65903c8 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/saml/saml_salesforce.md @@ -0,0 +1,5 @@ +--- +sidebar_position: 3 +--- +# SAMLSalesForce集成 +TODO \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/saml/saml_txy.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/saml/saml_txy.md new file mode 100644 index 000000000..0d47827cb --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/saml/saml_txy.md @@ -0,0 +1,21 @@ +--- +sidebar_position: 2 +--- +# SAML腾讯云集成 +本文介绍腾讯云使用SAML如何与MaxKey进行集成。 + +

应用注册

+ +1)首先需要注册腾讯云,并开通SAML认证功能,下载腾讯云SAML元数据,具体说明文档请参照 + +文档中心>访问管理>用户指南>身份提供商 + +2)应用在MaxKey管理系统进行注册,注册的配置信息如下,注册时需要提供腾讯云SAML元数据 + +![sso_saml_txy_conf](/images/sso/sso_saml_txy_conf.png) + +扩展属性配置,把腾讯云的3个相关属性配置到MaxKey中 + +![sso_saml_txy_conf_ex](/images/sso/sso_saml_txy_conf_ex.png) + +3)把MaxKey元数据上传到腾讯云,参照腾讯云文档 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/tokenbased.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/tokenbased.md new file mode 100644 index 000000000..227c1f442 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso/tokenbased.md @@ -0,0 +1,241 @@ +--- +sidebar_position: 6 +--- + +# TokenBased协议集成 +本文介绍TokenBased协议如何与MaxKey进行集成。 + +## 应用注册 + +应用在MaxKey管理系统进行注册,注册的配置信息如下 + +![sso_token_conf](/images/sso/sso_token_conf.png) + +LTPA使用Cookie传输令牌 + +![sso_token_ltpa_conf](/images/sso/sso_token_ltpa_conf.png) + + +## TokenBased客户端集成 + +本文使用JAVA WEB程序为例 + +### 引入客户端所需包 + +```ini +gson-2.2.4.jar +maxkey-client-sdk.jar +nimbus-jose-jwt-8.10.jar +commons-codec-1.9.jar +commons-io-2.2.jar +commons-logging-1.1.1.jar +``` + +### 简单令牌 + +```java +<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> +<%@ page language="java" import="org.maxkey.client.tokenbase.*"%> +<%@ page language="java" import="org.maxkey.client.crypto.*"%> +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; + +String token =request.getParameter("token"); +System.out.println("token : "+token); +String tokenString=TokenUtils.decode(token, "x8zPbCya", ReciprocalUtils.Algorithm.DES); +String parseToken[]=TokenUtils.parseSimpleBasedToken(tokenString); +%> + + + + + + SimpleBasedToken Demo + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
SimpleBasedToken Demo
SimpleBasedToken Logo
UserName<%=parseToken[0]%>
Authentication at Time<%=parseToken[1]%>
+
+ + +``` + +### 基于JSON令牌 + +```java +<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> +<%@ page language="java" import="org.maxkey.client.tokenbase.*"%> +<%@ page language="java" import="org.maxkey.client.crypto.*"%> +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; + +String token =request.getParameter("token"); +System.out.println("token : "+token); +String tokenString=TokenUtils.decode(token, "lEWhDLTo", ReciprocalUtils.Algorithm.DES); +Map tokenMap=TokenUtils.parseJsonBasedToken(tokenString); + +%> + + + + + + JsonBasedToken Demo + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
JsonBasedToken Demo
JsonBasedToken Logo
UID<%=tokenMap.get("uid") %>
UserName<%=tokenMap.get("username") %>
Department<%=tokenMap.get("department") %>
Email<%=tokenMap.get("email") %>
Authentication at Time<%=tokenMap.get("at")%>
Expires<%=tokenMap.get("expires")%>
+
+ + +``` + +### 基于LTPA JSON(COOKIE JSON)令牌 + +```java +<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> +<%@ page language="java" import="org.maxkey.client.ltpa.*"%> +<%@ page language="java" import="org.maxkey.client.crypto.*"%> +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; + +String ltpaVaule=LtpaUtils.readLtpa(request, "maxkey.top", "ltpa"); +System.out.println("============ ltpaVaule "+ltpaVaule); +Map tokenMap=null; +if(ltpaVaule!=null){ + String ltpaString=LtpaUtils.decode(ltpaVaule, "k1tk41Ng", ReciprocalUtils.Algorithm.DES); + tokenMap=LtpaUtils.parseLtpaJson(ltpaString); +} +%> + + + + + + + LTPA Demo + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LTPA Demo
LTPA Logo
UID<%=tokenMap.get("uid") %>
UserName<%=tokenMap.get("username") %>
Department<%=tokenMap.get("department") %>
Email<%=tokenMap.get("email") %>
Authentication at Time<%=tokenMap.get("at")%>
Expires<%=tokenMap.get("expires")%>
+
+ + + +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso_ui.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso_ui.md new file mode 100644 index 000000000..aa005e984 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/am/sso_ui.md @@ -0,0 +1,16 @@ +--- +title: 单点登录UI +sidebar_position: 1 +--- +# 单点登录UI + +## 登录视图 + + +![登录视图](/images/maxkey_login.png) + + +## 应用视图 + + +![应用视图](/images/maxkey_index.png) diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/_category_.json new file mode 100644 index 000000000..cf431b9f8 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "API接口", + "position": 10, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/authz.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/authz.md new file mode 100644 index 000000000..46d322817 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/authz.md @@ -0,0 +1,75 @@ +--- +title: 认证总地址接口 +sidebar_position: 11 +--- + +## 认证总地址接口 + + +**接口地址**:`/sign/authz/{id}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

参数应用ID,分发到不同应用的认证地址

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/10validate.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/10validate.md new file mode 100644 index 000000000..fe7550187 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/10validate.md @@ -0,0 +1,57 @@ +--- +title: CAS 1.0 ticket验证接口 +--- + +## CAS 1.0 ticket验证接口 + + +**接口地址**:`/sign/authz/cas/validate` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

通过ticket获取当前登录用户信息

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|service|service|query|true|string|| +|ticket|ticket|query|true|string|| +|renew|renew|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/20proxyValidate.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/20proxyValidate.md new file mode 100644 index 000000000..0fb0bc1eb --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/20proxyValidate.md @@ -0,0 +1,59 @@ +--- +title: CAS 2.0 ticket代理验证接口 +--- + +## CAS 2.0 ticket代理验证接口 + + +**接口地址**:`/sign/authz/cas/proxyValidate` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`application/xml` + + +**接口描述**:

通过ticket获取当前登录用户信息

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|service|service|query|true|string|| +|ticket|ticket|query|true|string|| +|format|format|query|false|string|| +|pgtUrl|pgtUrl|query|false|string|| +|renew|renew|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/20serviceValidate.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/20serviceValidate.md new file mode 100644 index 000000000..fc9767b58 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/20serviceValidate.md @@ -0,0 +1,59 @@ +--- +title: CAS 2.0 ticket验证接口 +--- + +## CAS 2.0 ticket验证接口 + + +**接口地址**:`/sign/authz/cas/serviceValidate` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`application/xml` + + +**接口描述**:

通过ticket获取当前登录用户信息

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|service|service|query|true|string|| +|ticket|ticket|query|true|string|| +|format|format|query|false|string|| +|pgtUrl|pgtUrl|query|false|string|| +|renew|renew|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/30proxy.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/30proxy.md new file mode 100644 index 000000000..e0d27c1d8 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/30proxy.md @@ -0,0 +1,57 @@ +--- +title: CAS 3.0 ProxyTicket代理验证接口 +--- + +## CAS 3.0 ProxyTicket代理验证接口 + + +**接口地址**:`/sign/authz/cas/p3/proxy` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

通过ProxyGrantingTicket获取ProxyTicket

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|pgt|pgt|query|true|string|| +|targetService|targetService|query|true|string|| +|format|format|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```javascript + +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/30proxyValidate.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/30proxyValidate.md new file mode 100644 index 000000000..31eafb60d --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/30proxyValidate.md @@ -0,0 +1,59 @@ +--- +title: CAS 3.0 ticket代理验证接口 +--- + +## CAS 3.0 ticket代理验证接口 + + +**接口地址**:`/sign/authz/cas/p3/proxyValidate` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

通过ProxyTicket获取当前登录用户信息

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|service|service|query|true|string|| +|ticket|ticket|query|true|string|| +|format|format|query|false|string|| +|pgtUrl|pgtUrl|query|false|string|| +|renew|renew|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```javascript + +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/30serviceValidate.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/30serviceValidate.md new file mode 100644 index 000000000..8099c5e67 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/30serviceValidate.md @@ -0,0 +1,59 @@ +--- +title: CAS 3.0 ticket验证接口 +--- + +## CAS 3.0 ticket验证接口 + + +**接口地址**:`/sign/authz/cas/p3/serviceValidate` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

通过ticket获取当前登录用户信息

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|service|service|query|true|string|| +|ticket|ticket|query|true|string|| +|format|format|query|false|string|| +|pgtUrl|pgtUrl|query|false|string|| +|renew|renew|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```javascript + +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/_category_.json new file mode 100644 index 000000000..649b7266e --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "CAS接口", + "position": 2, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/authz.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/authz.md new file mode 100644 index 000000000..8c541034b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/authz.md @@ -0,0 +1,74 @@ +--- +title: CAS页面跳转应用ID认证接口 +--- + +## CAS页面跳转应用ID认证接口 + + +**接口地址**:`/sign/authz/cas/{id}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数应用ID

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/_category_.json new file mode 100644 index 000000000..ec9acc032 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "REST认证接口", + "position": 4, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/serviceTicket.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/serviceTicket.md new file mode 100644 index 000000000..abbb66fd6 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/serviceTicket.md @@ -0,0 +1,60 @@ +--- +title: ServiceTicket接口 +--- + +## CAS REST认证接口 + + +**接口地址**:`/sign/authz/cas/v1/tickets/{ticketGrantingTicket}` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

通过TGT获取ST

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ticketGrantingTicket|ticketGrantingTicket|path|true|string|| +|password||formData|false|string|| +|service||formData|false|string|| +|renew||formData|false|string|| +|username||formData|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|201|Created|| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/ticketGrantingTicket.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/ticketGrantingTicket.md new file mode 100644 index 000000000..bce9093e4 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/ticketGrantingTicket.md @@ -0,0 +1,55 @@ +--- +title: ticketGrantingTicket接口 +--- + +## CAS REST认证接口 + + +**接口地址**:`/sign/authz/cas/v1/tickets/{ticketGrantingTicket}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

检查TGT状态

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ticketGrantingTicket|ticketGrantingTicket|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/ticketGrantingTicketdelete.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/ticketGrantingTicketdelete.md new file mode 100644 index 000000000..a2f15ba0f --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/ticketGrantingTicketdelete.md @@ -0,0 +1,55 @@ +--- +title: 注销TGT状态接口 +--- + +## CAS REST认证接口 + + +**接口地址**:`/sign/authz/cas/v1/tickets/{ticketGrantingTicket}` + + +**请求方式**:`DELETE` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

注销TGT状态

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ticketGrantingTicket|ticketGrantingTicket|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/tickets.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/tickets.md new file mode 100644 index 000000000..e4acde2a4 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/tickets.md @@ -0,0 +1,58 @@ +--- +title: CAS REST认证接口 +--- + +## CAS REST认证接口 + + +**接口地址**:`/sign/authz/cas/v1/tickets` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

通过用户名密码获取TGT

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|password||formData|false|string|| +|service||formData|false|string|| +|username||formData|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|201|Created|| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/users.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/users.md new file mode 100644 index 000000000..cd104afa6 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/casrest/users.md @@ -0,0 +1,58 @@ +--- +title: 用户名密码登录接口 +--- + +## CAS REST认证接口 + + +**接口地址**:`/sign/authz/cas/v1/users` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

用户名密码登录接口

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|password||formData|false|string|| +|service||formData|false|string|| +|username||formData|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|201|Created|| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/login.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/login.md new file mode 100644 index 000000000..a697eff1b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/login.md @@ -0,0 +1,74 @@ +--- +title: CAS页面跳转service认证接口 +--- + +## CAS页面跳转service认证接口 + + +**接口地址**:`/sign/authz/cas/login` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数service

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|service|service|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/logout.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/logout.md new file mode 100644 index 000000000..e443746cc --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/cas/logout.md @@ -0,0 +1,74 @@ +--- +title: CAS注销接口 +--- + +## CAS注销接口 + + +**接口地址**:`/sign/authz/cas/logout` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

CAS注销接口

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|service|service|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/extendapi.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/extendapi.md new file mode 100644 index 000000000..f46c4e85b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/extendapi.md @@ -0,0 +1,75 @@ +--- +title: ExtendApi接口 +sidebar_position: 6 +--- + +## ExtendApi认证地址接口 + + +**接口地址**:`/sign/authz/api/{id}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

参数应用ID

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/formbased.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/formbased.md new file mode 100644 index 000000000..aa8059652 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/formbased.md @@ -0,0 +1,75 @@ +--- +title: FormBased接口 +sidebar_position: 7 +--- + +## FormBased认证地址接口 + + +**接口地址**:`/sign/authz/formbased/{id}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

参数应用ID

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/jwt.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/jwt.md new file mode 100644 index 000000000..f04188feb --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/jwt.md @@ -0,0 +1,75 @@ +--- +title: JWT接口 +sidebar_position: 4 +--- + +## JWT应用ID认证接口 + + +**接口地址**:`/sign/authz/jwt/{id}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

应用ID

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/login.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/login.md new file mode 100644 index 000000000..2e057f270 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/login.md @@ -0,0 +1,73 @@ +--- +title: 登录接口 +sidebar_position: 8 +--- + +## 登录接口 + + +**接口地址**:`/sign/login` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

用户登录地址

+ + + +**请求参数**: + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/logout.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/logout.md new file mode 100644 index 000000000..c123c95d1 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/logout.md @@ -0,0 +1,75 @@ +--- +title: 单点注销接口 +sidebar_position: 9 +--- + +## 单点注销接口 + + +**接口地址**:`/sign/force/logout` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

redirect_uri跳转地址

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|redirect_uri|redirect_uri|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/_category_.json new file mode 100644 index 000000000..35a4cdadd --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "OAuth2接口", + "position": 1, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/authorize.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/authorize.md new file mode 100644 index 000000000..6d67b021e --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/authorize.md @@ -0,0 +1,77 @@ +--- +title: 认证接口 +sidebar_position: 1 +--- + +## OAuth 2.0 认证接口 + + +**接口地址**:`/sign/authz/oauth/v20/authorize` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数client_id,response_type,redirect_uri等

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|parameters|parameters|query|true||object| +|complete||query|false|boolean|| +|model|model|query|false|object|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/authz.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/authz.md new file mode 100644 index 000000000..ac1ddbc21 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/authz.md @@ -0,0 +1,75 @@ +--- +title: 认证ID接口 +sidebar_position: 2 +--- + +## OAuth 2.0 认证ID接口 + + +**接口地址**:`/sign/authz/oauth/v20/{id}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数应用ID,自动完成跳转认证拼接

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/check_token.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/check_token.md new file mode 100644 index 000000000..71ad7d6f0 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/check_token.md @@ -0,0 +1,56 @@ +--- +title: Token检查接口 +sidebar_position: 6 +--- + +## OAuth 2.0 token检查接口 + + +**接口地址**:`/sign/authz/oauth/v20/check_token` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数token

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|token|token|query|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +object +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/me.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/me.md new file mode 100644 index 000000000..607e993bf --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/me.md @@ -0,0 +1,57 @@ +--- +title: 用户信息接口 +sidebar_position: 4 +--- + +## OAuth 2.0 用户信息接口 + + +**接口地址**:`/sign/api/oauth/v20/me` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数access_token

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|access_token|access_token|query|false|string|| +|authorization|authorization|header|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```javascript + +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/oidcuserinfo.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/oidcuserinfo.md new file mode 100644 index 000000000..2c992c649 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/oidcuserinfo.md @@ -0,0 +1,56 @@ +--- +title: OIDC 用户信息接口 +sidebar_position: 5 +--- + +## OIDC 用户信息接口 + + +**接口地址**:`/sign/api/connect/v10/userinfo` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递Authorization参数access_token

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|Authorization|Authorization|header|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/token.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/token.md new file mode 100644 index 000000000..f4674081c --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/oauth2/token.md @@ -0,0 +1,162 @@ +--- +title: 获取AccessToken接口 +sidebar_position: 3 +--- + +## OAuth 2.0 获取AccessToken接口 + + +**接口地址**:`/sign/authz/oauth/v20/token` + + +**请求方式**:`GET` `POST` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数token等

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|parameters|parameters|query|true||object| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|OAuth2AccessToken| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|additionalInformation||object|| +|expiration||string(date-time)|string(date-time)| +|expired||boolean|| +|expiresIn||integer(int32)|integer(int32)| +|oauth2Exception||OAuth2Exception|OAuth2Exception| +|  additionalInformation||object|| +|  cause||Throwable|Throwable| +|    cause||Throwable|Throwable| +|    localizedMessage||string|| +|    message||string|| +|    stackTrace||array|StackTraceElement| +|      className||string|| +|      fileName||string|| +|      lineNumber||integer|| +|      methodName||string|| +|      nativeMethod||boolean|| +|    suppressed||array|Throwable| +|  httpErrorCode||integer(int32)|| +|  localizedMessage||string|| +|  message||string|| +|  oauth2ErrorCode||string|| +|  stackTrace||array|StackTraceElement| +|    className||string|| +|    fileName||string|| +|    lineNumber||integer|| +|    methodName||string|| +|    nativeMethod||boolean|| +|  summary||string|| +|  suppressed||array|Throwable| +|    cause||Throwable|Throwable| +|    localizedMessage||string|| +|    message||string|| +|    stackTrace||array|StackTraceElement| +|      className||string|| +|      fileName||string|| +|      lineNumber||integer|| +|      methodName||string|| +|      nativeMethod||boolean|| +|    suppressed||array|Throwable| +|refreshToken||OAuth2RefreshToken|OAuth2RefreshToken| +|scope||array|| +|tokenType||string|| +|value||string|| + + +**响应示例**: +```javascript +{ + "additionalInformation": {}, + "expiration": "", + "expired": true, + "expiresIn": 0, + "oauth2Exception": { + "additionalInformation": {}, + "cause": { + "cause": { + "cause": {}, + "localizedMessage": "", + "message": "", + "stackTrace": [ + { + "className": "", + "fileName": "", + "lineNumber": 0, + "methodName": "", + "nativeMethod": true + } + ], + "suppressed": [ + {} + ] + }, + "localizedMessage": "", + "message": "", + "stackTrace": [ + { + "className": "", + "fileName": "", + "lineNumber": 0, + "methodName": "", + "nativeMethod": true + } + ], + "suppressed": [ + {} + ] + }, + "httpErrorCode": 0, + "localizedMessage": "", + "message": "", + "oauth2ErrorCode": "", + "stackTrace": [ + { + "className": "", + "fileName": "", + "lineNumber": 0, + "methodName": "", + "nativeMethod": true + } + ], + "summary": "", + "suppressed": [ + {} + ] + }, + "refreshToken": {}, + "scope": [], + "tokenType": "", + "value": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/saml/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/saml/_category_.json new file mode 100644 index 000000000..4334fe75c --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/saml/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "SAML接口", + "position": 3, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/saml/idpinit.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/saml/idpinit.md new file mode 100644 index 000000000..037262803 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/saml/idpinit.md @@ -0,0 +1,75 @@ +--- +title: SAML 2.0 IDP Init接口 +sidebar_position: 1 +--- + +## SAML 2.0 IDP Init接口 + + +**接口地址**:`/sign/authz/saml20/idpinit/{appid}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数应用ID

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|appid|appid|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/saml/logout.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/saml/logout.md new file mode 100644 index 000000000..1f870d53e --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/saml/logout.md @@ -0,0 +1,72 @@ +--- +title: SAML单点注销地址接口 +sidebar_position: 3 +--- + +## SAML单点注销地址接口 + + +**接口地址**:`/sign/logout/saml` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**: + + +**请求参数**: + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/saml/metadata.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/saml/metadata.md new file mode 100644 index 000000000..fa3bc6b20 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/saml/metadata.md @@ -0,0 +1,56 @@ +--- +title: SAML 2.0 元数据接口 +sidebar_position: 4 +--- + +## SAML 2.0 元数据接口 + + +**接口地址**:`/sign/metadata/saml20/mxk_metadata_{appid}.xml` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`application/xml` + + +**接口描述**:

参数Idp_Metadata_应用ID

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|appid|appid|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/saml/spinit.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/saml/spinit.md new file mode 100644 index 000000000..d3754be53 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/saml/spinit.md @@ -0,0 +1,75 @@ +--- +title: SAML 2.0 SP Init接收接口 +sidebar_position: 2 +--- + +## SAML 2.0 SP Init接收接口 + + +**接口地址**:`/sign/authz/saml20/{appid}` + + +**请求方式**:`GET` `POST` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数应用ID

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|appid|appid|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/ticket.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/ticket.md new file mode 100644 index 000000000..07325dce0 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/ticket.md @@ -0,0 +1,54 @@ +--- +title: 在线ticket验证接口 +--- + +## 在线ticket验证接口 + + +**接口地址**:`/sign/onlineticket/validate` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**: + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ticket|ticket|query|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/timeout.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/timeout.md new file mode 100644 index 000000000..5ecdb6513 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/timeout.md @@ -0,0 +1,72 @@ +--- +title: 登录超时接口 +sidebar_position: 10 +--- + +## 登录超时接口 + + +**接口地址**:`/sign/timeout` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**: + + +**请求参数**: + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/tokenbased.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/tokenbased.md new file mode 100644 index 000000000..7809e2be0 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/api/tokenbased.md @@ -0,0 +1,75 @@ +--- +title: TokenBased接口 +sidebar_position: 5 +--- + +## TokenBased认证接口 + + +**接口地址**:`/sign/authz/tokenbased/{id}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数应用ID

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/_category_.json new file mode 100644 index 000000000..736731e93 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "学院", + "position": 11, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important Docusaurus concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/algorithm.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/algorithm.md new file mode 100644 index 000000000..2a8d11c29 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/algorithm.md @@ -0,0 +1,3 @@ +--- +layout: zh/default +--- \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/_category_.json new file mode 100644 index 000000000..29aa795d0 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "单点登录协议", + "position": 1, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important Docusaurus concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/cas.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/cas.md new file mode 100644 index 000000000..1b72ae3ce --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/cas.md @@ -0,0 +1,58 @@ +--- +title: CAS协议 +sidebar_position: 3 +--- +## CAS简介 + +CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点: + +CAS的目标是允许用户访问多个应用程序只提供一次用户凭据(如用户名和密码)。它还允许Web应用程序对用户进行身份验证,而不必获取用户的安全凭证,比如密码。 + +
    +
  1. 一个开放的,文档齐全的协议。
  2. +
  3. 开源的JAVA服务器组件。
  4. +
  5. CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
  6. +
  7. 与uPortal, BlueSocket, TikiWiki, Mule, Liferay, Moodle等等能很好集成。
  8. +
  9. 文档社区化和实现的支持。
  10. +
  11. 具有广泛的客户群的支持。
  12. +
+ +扩展阅读参看:官方技术说明CAS官方网站(en) | CAS维基百科(en) + +## CAS体系结构 +CAS 体系包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。 + +![cas1](/images/cas/1.png) + +## CAS原理 +CAS 最基本的协议过程: + +![cas1](/images/cas/2.png) + +SSO单点登录访问流程主要有以下步骤: + +1. 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。 + +2. 定向认证:SSO客户端会重定向用户请求到SSO服务器。 + +3. 用户认证:用户身份认证。 + +4. 发放票据:SSO服务器会产生一个随机的Service Ticket。 + +5. 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。 + +6. 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。 + +CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 3 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份合适,以确保 Service Ticket 的合法性。 + +在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。 + +另外,CAS 协议中还提供了 Proxy (代理)模式,以适应更加高级、复杂的应用场景,具体介绍可以参考 CAS 官方网站上的相关文档。 + +## CAS中3个术语 + +Ticket Granting ticket (TGT) :可以认为是CAS Server根据用户名密码生成的一张票,存在Server端 + +Ticket-granting cookie (TGC) :其实就是一个Cookie,存放用户身份信息,由Server发给Client端 + +Service ticket (ST) :由TGT生成的一次性票据,用于验证,只能用一次。相当于Server发给Client一张票,然后Client拿着这个票再来找Server验证,看看是不是Server签发的。 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/formbased.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/formbased.md new file mode 100644 index 000000000..e8eed2343 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/formbased.md @@ -0,0 +1,43 @@ +--- +title: FormBased代填 +sidebar_position: 7 +--- + +## FormBased介绍 + +HTTP+HTML FormBased(基于表单)的认证,目前一般简单的基于表单的认证,是一种登录技术,即一个网站使用一个Web表单收集,并随后进行身份验证;认证的凭证信息来源于用户代理,通常web浏览器。 (请注意,短语“基于表单的认证”是不明确的。请参阅进一步解释基于表单的认证。) + +## 交互概要 + +该技术的实现步骤是: +
    +
  1. 一个未经身份验证的用户代理通过HTTP协议从网站请求一个网页。
  2. +
  3. 该网站返回一个HTML网页的未经验证的用户代理。该网页包含提示用户为他们的用户名和密码,以及标有“登录”或“提交”按钮基于HTML的Web表单最低限度。
  4. +
  5. 用户填写自己的用户名和密码,然后按下提交按钮。
  6. +
  7. 所述用户代理发送的web表单数据(包括用户名和密码)到Web服务器。
  8. +
  9. 网站实现中,Web服务器上运行时,执行对网络的形式的数据部分的验证和确认操作。如果成功,该网站考虑用户代理进行认证。
  10. +
+ +## 采纳建议 + +HTTP + HTML基于表单的认证,可以说是万维网上采用当今最流行的用户认证技术。几乎所有维基,论坛,银行/财经网站,电子商务网站,网络搜索引擎,门户网站,和其他常见的Web服务器应用程序都选择了这种认证技术。 + + +这种普及显然是由于网站管理员或他们的雇主想要细粒度地控制征求用户凭据的表现和行为,而默认弹出对话框(用于HTTP基本访问身份验证或摘要接入认证),许多Web浏览器提供不允许精确的剪裁。所需的精确度可以通过公司的要求(如品牌)或实施问题的动机(如网站之类的软件对于MediaWiki,phpBB的,Drupal的,WordPress的默认配置)。无论理由,任何企业品牌或用户体验的调整不能从这个认证过程的几个安全考虑分散。 + +## 安全方面注意事项 +
    +
  1. 用户凭据传递了密文到web网站,除非采取诸如就业传输层安全(TLS)的监听。
  2. +
  3. 该技术基本上是特设在于有效地没有任何用户代理和所述网络服务器之间的交互,除HTTP之外的与HTML本身是标准化。通过该网站所使用的实际的认证机制是,默认,未知的用户和用户代理。形式本身,包括可编辑字段的数量,和期望的内容物,完全实现和部署相关的。
  4. +
  5. 这种技术本身临时的,否则犯罪分子极易伪装成可信任方在认证过程中。
  6. +
+ +## 代码实现 + +```xml +
+ + + +
+``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/jwtintros.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/jwtintros.md new file mode 100644 index 000000000..ead48e1b5 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/jwtintros.md @@ -0,0 +1,139 @@ +--- +title: JWT协议 +sidebar_position: 4 +--- +## JSON Web Token介绍 + +JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地将信息作为JSON对象传输。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用HMAC算法)或使用RSAECDSA的公用/专用密钥对对JWT进行签名。 + +尽管可以对JWT进行加密以在各方之间提供保密性,但我们将重点关注已签名的令牌。签名的令牌可以验证其中包含的声明的完整性,而加密的令牌则将这些声明隐藏在其他方的面前。当使用公钥/私钥对对令牌进行签名时,签名还证明只有持有私钥的一方才是对其进行签名的一方。 + +扩展阅读参看:官方技术说明 JWT + +## 什么时候使用JSON Web Token + +以下是JSON Web令牌有用的一些情况: + +授权:这是使用JWT的最常见方案。一旦用户登录,每个后续请求将包括JWT,从而允许用户访问该令牌允许的路由,服务和资源。单一登录是当今广泛使用JWT的一项功能,因为它的开销很小并且可以在不同的域中轻松使用。 + +信息交换:JSON Web令牌是在各方之间安全地传输信息的好方法。因为可以对JWT进行签名(例如,使用公钥/私钥对),所以您可以确定发件人是他们所说的人。此外,由于签名是使用标头和有效负载计算的,因此您还可以验证内容是否遭到篡改。 + +## JSON Web Token结构 + +JSON Web Token以紧凑的形式由三部分组成,这些部分由点(.)分隔,分别是: + +Header(标头) + +Payload(有效载荷) + +Signature(签名) + +因此,JWT通常如下所示。 + +```json xxxxx.yyyyy.zzzzz``` + +让我们分解不同的部分。 + +### Header(标头) + +标头通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法,例如HMAC SHA256或RSA。 + +例如: + +```json +{ + "alg": "HS256", + "typ": "JWT" +} +``` + +然后,此JSON被Base64Url编码以形成JWT的第一部分。 + +### Payload(有效载荷) + +令牌的第二部分是有效负载,其中包含声明。声明是有关实体(通常是用户)和其他数据的声明。索赔有以下三种类型:注册的,公共的和私人索赔。 + +已注册的权利要求:这些是一组非强制性的但建议使用的预定义权利要求,以提供一组有用的,可互操作的权利要求。其中一些是: iss(发布者), exp(到期时间), sub(主题), aud(受众群体)等。 + +请注意,声明名称仅是三个字符,因为JWT是紧凑的。 + +公开声明:使用JWT的人员可以随意定义这些声明。但是为避免冲突,应在 IANA JSON Web令牌注册表中定义它们,或将其定义为包含抗冲突名称空间的URI。 + +私人权利:这些都是使用它们同意并既不是当事人之间建立共享信息的自定义声明注册或公众的权利要求。 + +有效负载示例可能是: +```json +{ + "sub": "1234567890", + "name": "John Doe", + "admin": true +} +``` +然后,对有效负载进行Base64Url编码,以形成JSON Web令牌的第二部分。 + +请注意,对于已签名的令牌,此信息尽管可以防止篡改,但任何人都可以读取。除非将其加密,否则请勿将机密信息放入JWT的有效负载或报头元素中。 + +### Signature(签名) + +要创建签名部分,您必须获取编码的标头,编码的有效载荷,机密,标头中指定的算法,并对其进行签名。 + +例如,如果要使用HMAC SHA256算法,则将通过以下方式创建签名: +```json +HMACSHA256( + base64UrlEncode(header) + "." + + base64UrlEncode(payload), + secret) +``` +签名用于验证消息在此过程中没有更改,并且对于使用私钥进行签名的令牌,它还可以验证JWT的发送者是它所说的真实身份。 + +### 结合一起 + +输出是三个由点分隔的Base64-URL字符串,可以在HTML和HTTP环境中轻松传递这些字符串,与基于XML的标准(例如SAML)相比,它更紧凑。 + +下面显示了一个JWT,它已对先前的标头和有效负载进行了编码,并用一个秘密进行了签名。 编码的JWT + +![jwt_encoded-jwt3](/images/jwt/encoded-jwt3.png) + +如果您想使用JWT并将这些概念付诸实践,则可以使用jwt.io Debugger解码,验证和生成JWT。JWT.io调试器 + +![jwt_legacy-app-auth-5](/images/jwt/legacy-app-auth-5.png) + +## JSON Web Token工作机制 + +在身份验证中,当用户使用其凭据成功登录时,将返回JSON Web令牌。由于令牌是凭据,因此必须格外小心以防止安全问题。通常,令牌的保留时间不应超过要求的时间。 + +由于缺乏安全性,您也不应该将敏感的会话数据存储在浏览器中。 + +每当用户想要访问受保护的路由或资源时,用户代理通常应使用授权AuthorizationBearer承载模式标头中发送JWT 。标头的内容应如下所示: +```json +Authorization: Bearer [token] +``` +在某些情况下,这可以是无状态授权机制。服务器的受保护路由将在Authorization标头中检查有效的JWT ,如果存在,则将允许用户访问受保护的资源。如果JWT包含必要的数据,则可以减少查询数据库中某些操作的需求,尽管这种情况并非总是如此。 + +如果令牌是在Authorization标头中发送的,则跨域资源共享(CORS)不会成为问题,因为它不使用cookie。 + +下图显示了如何获取JWT并将其用于访问API或资源: + +![jwt_grant](/images/jwt/client-credentials-grant.png) + +JSON Web令牌如何工作 + +应用程序或客户端向授权服务器请求授权。这是通过不同的授权流程之一执行的。例如,典型的符合OpenID Connect的 Web应用程序将/oauth/authorize使用授权代码流通过端点。 +授予授权后,授权服务器会将访问令牌返回给应用程序。 +该应用程序使用访问令牌来访问受保护的资源(例如API)。 +请注意,使用签名的令牌,令牌中包含的所有信息都会暴露给用户或其他方,即使他们无法更改它。这意味着您不应将机密信息放入令牌中。 + +## 如何使用JSON Web Token + +让我们谈谈与Simple Web Tokens(SWT)和Security Assertion Markup Language Tokens安全性声明标记语言令牌(SAML)相比,JSON Web Tokens(JWT)的优势。 + +由于JSON不如XML冗长,因此在编码时JSON的大小也较小,从而使JWT比SAML更为紧凑。这使得JWT是在HTML和HTTP环境中传递的不错的选择。 + +在安全方面,只能使用HMAC算法由共享机密对SWT进行对称签名。但是,JWT和SAML令牌可以使用X.509证书形式的公用/专用密钥对进行签名。与签名JSON的简单性相比,使用XML数字签名对XML进行签名而不引入模糊的安全漏洞是非常困难的。 + +JSON解析器在大多数编程语言中都很常见,因为它们直接映射到对象。相反,XML没有自然的文档到对象映射。与SAML断言相比,这使使用JWT更加容易。 + +关于用法,JWT是在Internet规模上使用的。这强调了在多个平台(尤其是移动平台)上对JSON Web令牌进行客户端处理的简便性。 + +![jwt_comparing-jwt-vs-saml2](/images/jwt/comparing-jwt-vs-saml2.png) +比较已编码的JWT和已编码的SAML的长度 编码的JWT和编码的SAML的长度比较 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/oauth2.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/oauth2.md new file mode 100644 index 000000000..5a4485699 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/oauth2.md @@ -0,0 +1,114 @@ +--- +title: OAuth2.0协议 +sidebar_position: 1 +--- +## 什么是OAuth2 + +OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。 + +OAuth2.0:对于用户相关的OpenAPI(例如获取用户信息,动态同步,照片,日志,分享等),为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显式的向用户征求授权。 + +采用OAuth2.0标准协议来进行用户身份验证和获取用户授权,相对于之前的OAuth1.0协议,其认证流程更简单和安全。 + +扩展阅读参看:OAuth标准(英文) | OAuth维基百科(中文) + +## 应用场景 + +第三方应用授权登录:在APP或者网页接入一些第三方应用时,时长会需要用户登录另一个合作平台,比如QQ,微博,微信的授权登录。 + +![oauth2qq](/images/oauth2/qq.jpg) + +原生app授权:app登录请求后台接口,为了安全认证,所有请求都带token信息,如果登录验证、请求后台数据。 + +前后端分离单页面应用(spa):前后端分离框架,前端请求后台数据,需要进行oauth2安全认证,比如使用vue、react后者h5开发的app。 + +## 名词定义 + +(1) Third-party application:第三方应用程序,本文中又称"客户端"(client),比如打开知乎,使用第三方登录,选择qq登录,这时候知乎就是客户端。 + +(2)HTTP service:HTTP服务提供商,本文中简称"服务提供商",即上例的qq。 + +(3)Resource Owner:资源所有者,本文中又称"用户"(user),即登录用户。 + +(4)User Agent:用户代理,本文中就是指浏览器。 + +(5)Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。 + +(6)Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。 + +## 运行流程 + +![oauth2flow](/images/oauth2/flow.jpg) + +(A)用户打开客户端以后,客户端要求用户给予授权。 + +(B)用户同意给予客户端授权。 + +(C)客户端使用上一步获得的授权,向认证服务器申请令牌。 + +(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。 + +(E)客户端使用令牌,向资源服务器申请获取资源。 + +(F)资源服务器确认令牌无误,同意向客户端开放资源。 + +## 四种授权模式 + +授权码模式(authorization code) + +简化模式(implicit) + +密码模式(resource owner password credentials) + +客户端模式(client credentials) + +### 授权码模式 + +授权码模式(authorization code)是功能最完整、流程最严密的授权模式。 +![oauth2_code](/images/oauth2/code.jpg) + +(1)用户访问客户端,后者将前者导向认证服务器,假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。 + +(2)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌:GET /oauth/token?response_type=code&client_id=test&redirect_uri=重定向页面链接。请求成功返回code授权码,一般有效时间是10分钟。 + +(3)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。POST /oauth/token?response_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=重定向页面链接。请求成功返回access Token和refresh Token。 + + +### 简化模式Implicit + +适用于公开的浏览器单页应用 + +![oauth2_implicit](/images/oauth2/implicit.jpg) + +Access Token直接从授权服务器返回(只有前端渠道) + +不支持refresh tokens + +假定资源所有者和公开客户应用在同一个设备上 + +最容易受安全攻击 + + +### 用户名密码 Resource Owner Credentials + +![oauth2_resource](/images/oauth2/resource.jpg) + +使用用户名密码登录的应用,例如桌面App + +使用用户名/密码作为授权方式从授权服务器上获取access token + +一般不支持refresh token + +假定资源拥有者和公开客户子啊相同设备上 + + +### 客户端凭证 Client Credentials + +![oauth2_client](/images/oauth2/client.jpg) + +适用于服务器见通信场景,机密客户代表它自己或者一个用户 + +只有后端渠道,使用客户凭证获取一个access token + +因为客户凭证可以使用对称或者非对称加密,该方式支持共享密码或者证书 + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/openid.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/openid.md new file mode 100644 index 000000000..77dde8893 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/openid.md @@ -0,0 +1,228 @@ +--- +title: OpenID Connect协议 +sidebar_position: 2 +--- +## OpenID Connect简介 +OpenID Connect是基于OAuth 2.0规范族的可互操作的身份验证协议。它使用简单的REST / JSON消息流来实现,和之前任何一种身份认证协议相比,开发者可以轻松集成。 + +OpenID Connect允许开发者验证跨网站和应用的用户,而无需拥有和管理密码文件。OpenID Connect允许所有类型的客户,包括基于浏览器的JavaScript和本机移动应用程序,启动登录流动和接收可验证断言对登录用户的身份。 + +扩展阅读参看:官方技术说明Connect标准(英文) | OpenID Connect维基百科(en) + + +## OpenID的历史是什么? +OpenID Connect是OpenID的第三代技术。首先是原始的OpenID,它不是商业应用,但让行业领导者思考什么是可能的。OpenID 2.0设计更为完善,提供良好的安全性保证。然而,其自身存在一些设计上的局限性,最致命的是其中依赖方必须是网页,但不能是本机应用程序;此外它还要依赖XML,这些都会导致一些应用问题。 + +OpenID Connect的目标是让更多的开发者使用,并扩大其使用范围。幸运的是,这个目标并不遥远,现在有很好的商业和开源库来帮助实现身份验证机制。 + +## OIDC基础 +简要而言,OIDC是一种安全机制,用于应用连接到身份认证服务器(Identity Service)获取用户信息,并将这些信息以安全可靠的方法返回给应用。 + +在最初,因为OpenID1/2经常和OAuth协议(一种授权协议)一起提及,所以二者经常被搞混。 + +OpenID是Authentication,即认证,对用户的身份进行认证,判断其身份是否有效,也就是让网站知道“你是你所声称的那个用户”; +OAuth是Authorization,即授权,在已知用户身份合法的情况下,经用户授权来允许某些操作,也就是让网站知道“你能被允许做那些事情”。 +由此可知,授权要在认证之后进行,只有确定用户身份只有才能授权。 +(身份验证)+ OAuth 2.0 = OpenID Connect + +OpenID Connect是“认证”和“授权”的结合,因为其基于OAuth协议,所以OpenID-Connect协议中也包含了client_id、client_secret还有redirect_uri等字段标识。这些信息被保存在“身份认证服务器”,以确保特定的客户端收到的信息只来自于合法的应用平台。这样做是目的是为了防止client_id泄露而造成的恶意网站发起的OIDC流程。 + +举个例子。某个用户使用Facebook应用“What online quiz best describes you?” ,该应用可以通过Facebook账号登录,则你可以在应用中发起请求到“身份认证服务器”(也就是Facebook的服务器)请求登录。这时你会看到如下界面,询问是否授权。 + +![openid_1](/images/openid/1.png) + +在OAuth中,这些授权被称为scope。OpenID-Connect也有自己特殊的scope--openid ,它必须在第一次请求“身份鉴别服务器”(Identity Provider,简称IDP)时发送过去。 + +## OIDC流程 +OAuth2提供了Access Token来解决授权第三方客户端访问受保护资源的问题;相似的,OIDC在这个基础上提供了ID Token来解决第三方客户端标识用户身份认证的问题。OIDC的核心在于在OAuth2的授权流程中,一并提供用户的身份认证信息(ID-Token)给到第三方客户端,ID-Token使用JWT格式来包装,得益于JWT(JSON Web Token)的自包含性,紧凑性以及防篡改机制,使得ID-Token可以安全的传递给第三方客户端程序并且容易被验证。应有服务器,在验证ID-Token正确只有,使用Access-Token向UserInfo的接口换取用户的更多的信息。 + +有上述可知,OIDC是遵循OAuth协议流程,在申请Access-Token的同时,也返回了ID-Token来验证用户身份。 + +### 相关定义 + +EU:End User,用户。 + +RP:Relying Party ,用来代指OAuth2中的受信任的客户端,身份认证和授权信息的消费方; + +OP:OpenID Provider,有能力提供EU身份认证的服务方(比如OAuth2中的授权服务),用来为RP提供EU的身份认证信息; + +ID-Token:JWT格式的数据,包含EU身份认证的信息。 + +UserInfo Endpoint:用户信息接口(受OAuth2保护),当RP使用ID-Token访问时,返回授权用户的信息,此接口必须使用HTTPS。 + +下面我们来看看OIDC的具体协议流程。 + +根据应用客户端的不同,OIDC的工作模式也应该是不同的。和OAuth类似,主要看是否客户端能保证client_secret的安全性。 + +如果是JS应用,其所有的代码都会被加载到浏览器而暴露出来,没有后端可以保证client_secret的安全性,则需要是使用默认模式流程(Implicit Flow)。 + +如果是传统的客户端应用,后端代码和用户是隔离的,能保证client_secret的不被泄露,就可以使用授权码模式流程(Authentication Flow)。 + +此外还有混合模式流程(Hybrid Flow),简而言之就是以上二者的融合。 + +OAuth2中还有口令模式和“应有访问模式”的方式来获取Access Token(关于OAuth2的内容,可以参见OAuth2.0 协议入门指南),为什么OIDC没有扩展这些方式呢? +"口令模式"是需要用户提供账号和口令给RP的,既然都已经有用户名和口令了,就不需要在获取什么用户身份了。至于“应有访问模式”,这种方式不需要用户参与,也就无需要认证和获取用户身份了。这也能反映授权和认证的差异,以及只使用OAuth2来做身份认证的事情是远远不够的,也是不合适的。 + +### 授权码模式流程 + +![openid_2](/images/openid/2.png) + +授权码模式流程 +和OAuth认证流程类似 + +RP发送一个认证请求给OP,其中附带client_id; + +OP对EU进行身份认证; + +OP返回响应,发送授权码给RP; + +RP使用授权码向OP索要ID-Token和Access-Token,RP验证无误后返回给RP; + +RP使用Access-Token发送一个请求到UserInfo EndPoint; UserInfo EndPoint返回EU的Claims。 + + +#### 基于Authorization Code的认证请求 +RP使用OAuth2的Authorization-Code的方式来完成用户身份认证,所有的Token都是通过OP的Token EndPoint(OAuth2中定义)来发放的。构建一个OIDC的Authentication Request需要提供如下的参数: + +scope:必须。OIDC的请求必须包含值为“openid”的scope的参数。 + +response_type:必选。同OAuth2。 + +client_id:必选。同OAuth2。 + +redirect_uri:必选。同OAuth2。 + +state:推荐。同OAuth2。防止CSRF, XSRF。 + +示例如下: + +```http +GET /authorize? + response_type=code + &scope=openid%20profile%20email + &client_id=s6BhdRkqt3 + &state=af0ifjsldkj + &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb HTTP/1.1 + Host: server.example.com +``` + +#### 基于Authorization Code的认证请求的响应 +在OP接收到认证请求之后,需要对请求参数做严格的验证,具体的规则参见http://openid.net/specs/openid-connect-core-1_0.html#AuthRequestValidation,验证通过后引导EU进行身份认证并且同意授权。在这一切都完成后,会重定向到RP指定的回调地址(redirect_uri),并且把code和state参数传递过去。比如: + +```http + HTTP/1.1 302 Found + Location: https://client.example.org/cb? + code=SplxlOBeZQQYbYS6WxSbIA + &state=af0ifjsldkj +``` + +#### 获取ID Token +RP使用上一步获得的code来请求Token EndPoint,这一步桶OAuth2,就不再展开细说了。然后Token EndPoint会返回响应的Token,其中除了OAuth2规定的部分数据外,还会附加一个id_token的字段。id_token字段就是上面提到的ID Token。例如: + +```json + HTTP/1.1 200 OK + Content-Type: application/json + Cache-Control: no-store + Pragma: no-cache + + { + "access_token": "SlAV32hkKG", + "token_type": "Bearer", + "refresh_token": "8xLOxBtZp8", + "expires_in": 3600, + "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ.ewogImlzc + yI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5 + NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZ + fV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5Nz + AKfQ.ggW8hZ1EuVLuxNuuIJKX_V8a_OMXzR0EHR9R6jgdqrOOF4daGU96Sr_P6q + Jp6IcmD3HP99Obi1PRs-cwh3LO-p146waJ8IhehcwL7F09JdijmBqkvPeB2T9CJ + NqeGpe-gccMg4vfKjkM8FcGvnzZUN4_KSP0aAp1tOJ1zZwgjxqGByKHiOtX7Tpd + QyHE5lcMiKPXfEIQILVq0pc_E2DzL7emopWoaoZTF_m0_N0YzFC6g6EJbOEoRoS + K5hoDalrcvRYLSrQAZZKflyuVCyixEoV9GfNQC3_osjzw2PAithfubEEBLuVVk4 + XUVrWOLrLl0nx7RkKU8NXNHq-rvKMzqg" + }``` + +其中看起来一堆乱码的部分就是JWT格式的ID-Token。在RP拿到这些信息之后,需要对id_token以及access_token进行验证(具体的规则参见http://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation和http://openid.net/specs/openid-connect-core-1_0.html#ImplicitTokenValidation)。至此,可以说用户身份认证就可以完成了,后续可以根据UserInfo EndPoint获取更完整的信息。 + +#### 安全令牌 ID-Token + +上面提到过OIDC对OAuth2最主要的扩展就是提供了ID-Token。下面我们就来看看ID-Token的主要构成: + +iss = Issuer Identifier:必须。提供认证信息者的唯一标识。一般是Url的host+path部分; + +sub = Subject Identifier:必须。iss提供的EU的唯一标识;最长为255个ASCII个字符; + +aud = Audience(s):必须。标识ID-Token的受众。必须包含OAuth2的client_id; + +exp = Expiration time:必须。ID-Token的过期时间; + +iat = Issued At Time:必须。JWT的构建的时间。 + +auth_time = AuthenticationTime:EU完成认证的时间。如果RP发送认证请求的时候携带max_age的参数,则此Claim是必须的。 + +nonce:RP发送请求的时候提供的随机字符串,用来减缓重放攻击,也可以来关联ID-Token和RP本身的Session信息。 + +acr = Authentication Context Class Reference:可选。表示一个认证上下文引用值,可以用来标识认证上下文类。 + +amr = Authentication Methods References:可选。表示一组认证方法。 + +azp = Authorized party:可选。结合aud使用。只有在被认证的一方和受众(aud)不一致时才使用此值,一般情况下很少使用。 + +```json +{ + "iss": "https://server.example.com", + "sub": "24400320", + "aud": "s6BhdRkqt3", + "nonce": "n-0S6_WzA2Mj", + "exp": 1311281970, + "iat": 1311280970, + "auth_time": 1311280969, + "acr": "urn:mace:incommon:iap:silver" + } +``` +另外ID Token必须使用JWT(JSON Web Token)进行签名和JWE(JSON Web Encryption)加密,从而提供认证的完整性、不可否认性以及可选的保密性。关于JWT的更多内容,请参看JSON Web Token - 在Web应用间安全地传递信息 + +### 默认模式流程 + +![openid_3](/images/openid/3.png) + +默认模式流程 +默认流程和OAuth中的类似,只不过也是添加了ID-Token的相关内容。 + +这里需要说明的是:OIDC的说明文档里很明确的说明了用户的相关信息都要使用JWT形式编码。在JWT中,不应该在载荷里面加入任何敏感的数据。如果传输的是用户的User ID。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。 + +但是现在工业界已经不推荐使用OAuth默认模式,而推荐使用不带client_Secret的授权码模式。 + +### 混合模式 +混合模式简而言之就是以上提到的两种模式的混合,不过也有一些小的改变,就是允许直接向客户端返回Access-Token。 + +业界普遍认为,后端传递Token(比如服务器之间通信)要比前端(比如页面之间)可靠,所以如果直接返回令牌的情况下会把令牌的过期时间设置较短,但是比较 + +UserInfo Endpoint +可能有的读者发现了,ID-Token只有sub是和EU相关的,这在一般情况下是不够的,必须还需要EU的用户名,头像等其他的资料,OIDC提供了一组公共的cliams,来提供更多用户的信息,这就是——UserIndo EndPoin。 + +在RP得到Access Token后可以请求此资源,然后获得一组EU相关的Claims,这些信息可以说是ID-Token的扩展,ID-Token中只需包含EU的唯一标识sub即可(避免ID Token过于庞大和暴露用户敏感信息),然后在通过此接口获取完整的EU的信息。此资源必须部署在TLS之上,例如: + +```http + GET /userinfo HTTP/1.1 + Host: server.example.com + Authorization: Bearer SlAV32hkKG +``` + +成功之后响应如下: + +```json + HTTP/1.1 200 OK + Content-Type: application/json + + { + "sub": "248289761001", + "name": "Jane Doe", + "given_name": "Jane", + "family_name": "Doe", + "preferred_username": "j.doe", + "email": "janedoe@example.com", + "picture": "http://example.com/janedoe/me.png" + } +``` +其中sub代表EU的唯一标识,这个claim是必须的,其他的都是可选的。 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/saml.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/saml.md new file mode 100644 index 000000000..7bba9fb9d --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/saml.md @@ -0,0 +1,89 @@ +--- +title: SAML2.0协议 +sidebar_position: 5 +--- +## SAML 介绍 + +SAML即安全断言标记语言,英文全称是Security Assertion Markup Language。它是一个基于XML的标准,用于在不同的安全域(security domain)之间用户身份验证和授权数据交换。在SAML标准定义了身份提供者(identity provider)和服务提供者(service provider),这两者构成了前面所说的不同的安全域。 SAML是OASIS组织安全服务技术委员会(Security Services Technical Committee)的产品。官方技术说明可参看OASIS Security Services (SAML) TC. + +使用SAML,在线服务供应商可以联系一个独立的网络身份认证提供者,谁是试图访问受保护的内容的用户进行身份验证。 + +联邦是指两个或更多可信的业务合作伙伴组成的团体,其遵照的业务和技术协议允许来自联邦合作伙伴(成员公司)的用户以一种安全可靠的方式,无缝地访问另一家合作伙伴的资源。在联邦业务模型中(其中,服务是联邦化的,或可以与业务合作伙伴共享),根据有关实体间达成的协议,一家公司的用户的身份将被转换,以合法访问另一家公司的Web站点,而另一家公司无需了解该用户的原始身份。 + + +IDP认证中心提供了一个基于SAML的单点登录(SSO)服务,作为身份提供者(Identity provider),控制用户名、密码和其他信息,用于识别,身份验证和授权用户的Web应用程序。 + +备注:SAML应用集成需完成应用集成申请,详见SAML相关内容。 + +通过SAML实现IDP 与其他合作伙伴的联邦身份认证。 + +## 流程说明图 + +![saml1](/images/saml/saml1.png) + +

SAML实现联邦身份认证各方职责

+ + + + + + + + + + + + + + + + + + + + +
IDP认证中心(Identity Provider/IDP)合作伙伴(Service Provider/SP)
用户身份认证安全断言判定
联邦身份安全断言联邦身份维护
用户账号管理服务提供和访问控制
+ + +IDP和SP预先完成证书的互信配置,SAML认证基于断言,断言基于证书的加密,传递过程是安全的,只有证书的持有者才能对断言进行解析 + +重要注意:SAML SSO解决方案仅适用于Web应用程序. + +扩展阅读参看:官方技术说明SAML标准(英文) | SAML维基百科(中文) + +## SP-Init SSO流程 + +![saml1](/images/saml/saml2.png) + + +用户试图访问IDP的合作伙伴应用。 + +合作伙伴应用生成一个SAML身份验证请求。SAML请求编码并嵌入到URL IDP的SSO服务。RelayState参数包含编码的合作伙伴应用程序,用户尝试访问的URL也被嵌入在SSO URL。这的RelayState参数,就是要一个不透明的标识符,不作任何修改或检查传回的。 + +合作伙伴发送重定向到用户的浏览器。重定向URL编码SAML身份验证请求的,应提交到IDP的SSO服务。 + +IDP的SAML请求进行解码,并提取两个谷歌的断言消费服务(ACS)和用户的目标URL(RelayState参数)的URL。 + +IDP的用户进行身份验证。IDP可以通过要求有效的登录凭据,或通过检查有效的会话对用户进行身份验证。 + +IDP生成一个SAML响应,其中包含身份验证的用户的用户名。按照SAML 2.0规范,这种反应是公共和私人合作伙伴的DSA / RSA密钥数字签名的 + +IDP SAML响应和RelayState参数进行编码,并将该信息返回到用户的浏览器。IDP提供了一种机制,使浏览器可以转发信息到合作伙伴的ACS。 + +合作伙伴的ACS使用IDP的公钥验证SAML响应。如果成功验证的响应,ACS将用户重定向的目标URL。 + +用户被重定向的目标URL,并记录在合作伙伴应用程序。 + +## IDP-Init SSO流程 + +![saml1](/images/saml/saml3.png) + +IDP的用户进行身份验证。IDP可以通过要求有效的登录凭据,或通过检查有效的会话对用户进行身份验证。 + +IDP生成一个SAML响应,其中包含身份验证的用户的用户名。按照SAML 2.0规范,这种反应是公共和私人合作伙伴的DSA / RSA密钥数字签名的。 + +IDP SAML响应和RelayState参数进行编码,并将该信息返回到用户的浏览器。IDP提供了一种机制,使浏览器可以转发信息到合作伙伴的ACS。 + +合作伙伴的ACS使用IDP的公钥验证SAML响应。如果成功验证的响应,ACS将用户重定向的目标URL。 + +用户被重定向的目标URL,并记录在合作伙伴应用程序。 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/tokenbased.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/tokenbased.md new file mode 100644 index 000000000..52ec64071 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/protocols/tokenbased.md @@ -0,0 +1,96 @@ +--- +title: TokenBased协议 +sidebar_position: 6 +--- +## TokenBased介绍 + +TokenBased(基于令牌)的认证,是一种简单的令牌的认证,即认证中心和应用共享凭证或者数字证书,认证中心使用HTTP POST的方式提交令牌到应用系统,应用系统并随后进行身份验证; + +## 交互概要 + +该技术的实现步骤是: +
    +
  1. 一个未经身份验证的用户通过浏览器访问应用系统。
  2. +
  3. 应用系统跳转到认证中心,请求认证。
  4. +
  5. 用户填写自己的用户名和密码,然后按下提交按钮。
  6. +
  7. 认证中心完成用户认证,生成令牌并提交到应用系统认证地址。
  8. +
  9. 应用系统使用共享凭证或者数字证书验证令牌,从令牌中获取用户认证信息。
  10. +
  11. 应用系统完成系统登录。
  12. +
+ +### 令牌加密或者签名方式 + +
    +
  1. 加密方式:DES、DESede、AES、Blowfish,默认采用DES。
  2. +
  3. 签名方式:服务端使用RSA数字证书私钥加密,客户端使用RSA数字证书公钥验证。
  4. +
+ +### 令牌格式 + +```json +{ + "randomId":"652ec5f5-fff2-4b8e-b88d-e7ff3a217bca", + "uid":"29e82574-b37a-46ab-bac1-5fecbd24b24b", + "username":"zhangs1020", + "email":"zhangs1020@connsec.com", + "windowsAccount":"ZHANGS1020", + "employeeNumber":"ZHANGS1020", + "departmentId":"1000212", + "department":"IT信息中心", + "displayName":"张三", + "at":"2015-03-11T15:17:03.855Z", + "expires":"2015-03-11T15:18:03.855Z" +} +``` + +randomId是即时生成的随机数
+at是当前认证的时间
+expires是过期的间隔
+其他的字段可在管理控制台配置 + +## 简单令牌 + +认证用户名@@认证时间(UTC时间),例如: + +```json +testUser@2010-01-01T01:01:01.001Z +``` + +### 令牌加密 + +加密步骤: +
    +
  1. 申请公共的秘钥。
  2. +
  3. 使用秘钥对产生的Token使用DES、DESede、AES、Blowfish进行加密,默认采用DES。
  4. +
  5. 对加密的数据进行BASE64URL编码。
  6. +
+ + +简单token加密结果:
+ +```json +Y00jv2TCCuk365uB2-nDCUdboygeYFoUfETC7BNXr73dQWwFNRrfYltczDQ5iWg8NTO-GsP--VlR6L-JyNhZSg +``` + +### 令牌签名 + +token的签名格式:BASE64URL(UTF8(data)).BASE64URL(UTF8(signature)),中间用"."分开,前半部分是数据,后半部分是签名书数据,例如:
+```json +eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk +``` + +## LTPA介绍 + +LTPA是Lightweight ThirdParty Authentication简称,轻量级第三方认证,支持在一个因特网域中的一组 Web 服务器之间使用单一登录的认证框架,即通过cookie来传输Token。 + +当服务器配置LTPA认证方式,用户通过浏览器成功登录,服务器会自动发送一个session cookie给浏览器,此cookie中包含一个加密和签名Security Token信息,应用服务器根据Security Token解析得到登录用户信息自动完成应用系统认证。 + +### 交互概要 + + 该技术的实现步骤是: +
    +
  1. 一个未经身份验证的用户通过浏览器访问应用系统,应用系统跳转到认证中心。
  2. +
  3. 认证中心完成用户登录,把Security Token发给浏览器,并跳转到应用系统。
  4. +
  5. 应用系统解析Security Token,得出用户登录信息。
  6. +
  7. 应用系统使用用户信息完成自身的登录。
  8. +
\ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/slo.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/slo.md new file mode 100644 index 000000000..6ff09497b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/slo.md @@ -0,0 +1,12 @@ +--- +sidebar_position: 2 +--- +# 单点注销 + +单点注销(Single Logout)是指用户在一个系统退出后,其所能单点登录访问的所有系统都同时退出。单点注销主要是为提高安全性,避免用户忘记退出所有应用而造成信息的泄密。 + + +IDP支持单点注销(SLO),即用户不仅仅从认证中心注销,同时也注销从认证中心访问的应用系统。 + + +其实现方式也非常简单,由于SSO和单点登录的应用都是分开的,使用不同的域名,只是通过认证中心在多个应用系统中传递身份和登录系统。因此,首先注销单点登录应用,然后修改每个应用系统都使用SSO的单点注销页面,SSO的退出页面会将用户登录的Session注销掉。 diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/sso.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/sso.md new file mode 100644 index 000000000..5cf8492b7 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/college/sso.md @@ -0,0 +1,29 @@ +--- +layout: zh/default +sidebar_position: 1 +--- +# 单点登录 + +单点登录(英语:Single sign-on,缩写为 SSO),中文译为单点登录,一种对于许多相互关连,但是又是各自独立的软件系统, 提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。 + + +## 介绍 +在日常生活中,很多人由于忘记某些网站的登录密码而烦恼,因为大多数用户都要记忆不少于10个用户名和相应密码。为了便于记忆,很多人都在不同的站点使用相同的用户名和密码,虽然这样可以减少负担,但是同时也降低了安全性,而且使用不同的站点同样要进行多次登录。同时,随着信息化飞速发展,大型企业和政府部门等都开始使用电子系统进行办公,而且整个办公系统由多个不同的子系统构成,如办公自动化(OA)系统,财务管理系统,档案管理系统,信息查询系统等。如果每个系统都使用独立的登录和验证机制,那么每天工作人员都要登录不同的系统进行办公。用户登录的频繁操作,降低了员工的工作效率,造成工作成本的浪费。而大量的密码和用户名的记忆时间长了也会出现问题,忘记密码或者混淆密码都会造成很大的麻烦。基于以上原因,为用户提供一个畅通的登录通道变得十分重要。 + + +单点登录(SingleSign-On,SSO)是一种帮助用户快捷访问网络中多个站点的安全通信技术。单点登录系统基于一种安全的通信协议,该协议通过多个系统之间的用户身份信息的交换来实现单点登录。使用单点登录系统时,用户只需要登录一次,就可以访问多个系统,不需要记忆多个口令密码。单点登录使用户可以快速访问网络,从而提高工作效率,同时也能帮助提高系统的安全性。 + + + +百度百科 :百度词条 + + +## 优势 + +用户只需登录一次,即可通过单点登录系统访问后台的多个 应用系统,二次登陆时无需重新输入用户名和密码。 + +减少了由登录产生的时间消耗,辅助了用户管理。 + +基于角色访问控制:根据用户的角色和URL实现访问控制功能 + +全面的日志审计:精确地记录用户的日志,可按日期、地址、用户、资源等信息对日志进行查询、统计和分析 diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/_category_.json new file mode 100644 index 000000000..b72eaadcd --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "配置", + "position": 5, + "link": { + "type": "generated-index", + "description": "Configuration." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/druid_password.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/druid_password.md new file mode 100644 index 000000000..dddd20e66 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/druid_password.md @@ -0,0 +1,45 @@ +--- +title: Druid配置数据库加密 +sidebar_position: 9 +--- + +Druid 是一个 JDBC 组件库,包含数据库连接池、SQL Parser 等组件, 被大量业务和技术产品使用或集成,经历过最严苛线上业务场景考验,是你值得信赖的技术产品。 + +## 导入Druid依赖 +gradle.properties +``` +druidVersion =1.2.15 +druidspringbootstarterVersion =1.2.15 +``` + +build.gradle +``` +implementation group: 'com.alibaba', name: 'druid', version: "${druidVersion}" +implementation group: 'com.alibaba', name: 'druid-spring-boot-starter', version: "${druidspringbootstarterVersion}" +``` +版本根据实际情况进行更新,当前版本1.2.15 + +## 命令窗口中执行 + +```java +java -cp druid-1.2.15.jar com.alibaba.druid.filter.config.ConfigTools 数据库密码 +``` + +假设数据库密码是**maxkey**,命令如下 + +![druid_encrypt](/images/config/druid_encrypt.png) + +## 项目配置文件 +1、filters添加config + +2、配置解密,同时指定公钥 + +生成环境建议如下配置通过java-jar启动命令时指定spring.druid.publickey的值(java -jar xx.jar --spring.druid.publickey=公钥),避免通过yml获取到公钥,开发环境可将公钥配置在idea启动参数内。 + +```ini +spring.druid.publickey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIOu1Ew3t8xLDoaVs1byFllwf55yRqz1ekJviQ7wWsuYnOL4WWsIb7tUj9foiYt58kdua6rWcVBAsTjHHR4tLPECAwEAAQ== +spring.datasource.username=root +spring.datasource.password=F78ZV92w6MtSfMajYRqHDeorcColhpMiIokwfl2ecFLAhKS6gPMxzAEJgALtssonYNx0aDFQnQ0/ZjMhxeqL7w== +spring.datasource.filters=config +spring.datasource.connectionProperties=config.decrypt=true;config.decrypt.key=${spring.druid.publickey} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/google.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/google.md new file mode 100644 index 000000000..5011eb579 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/google.md @@ -0,0 +1,45 @@ +--- +title: 多因素认证 +sidebar_position: 3 +--- +# 多因素认证(MFA) + +双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统。双因素认证是一种采用时间同步技术的系统,采用了基于时间、事件和密钥三变量而产生的一次性密码来代替传统的静态密码。每个动态密码卡都有一个唯一的密钥,该密钥同时存放在服务器端,每次认证时动态密码卡与服务器分别根据同样的密钥,同样的随机参数(时间、事件)和同样的算法计算了认证的动态密码,从而确保密码的一致性,从而实现了用户的认证。就像我们去银行办卡送的口令牌. + +多因素认证(MFA),是一种计算机访问控制的方法,用户要通过两种以上的认证机制之后,才能得到授权,使用计算机资源。MFA的目的是建立一个多层次的防御,使未经授权的人访问计算机系统或网络更加困难,从而提高安全性。 + + +## TOTP或者HOTP支持 + +1、Google Authenticator + +2、Microsoft Authenticator + +3、FreeOTP + +4、支持TOTP或者HOTP协议 + + +优势:**使用简单、安全性高、低成本、无需携带额外设备** + + +## Google Authenticator支持 + +MaxKey支持谷歌验证器(Google Authenticator)双因素身份认证,步骤如下 + +1、下载Google Authenticator到手机 +![google1](/images/authn/google1.jpg) + + +2、登录到Maxkey,进入"安全设置"-->"时间令牌",如下图 + +![google2](/images/authn/google2.png) + +3、使用Google Authenticator扫描令牌的二维码 + +![google3](/images/authn/google3.jpg) + +4、退出MaxKey,进入到登录界面,"安全认证",输入用户名和密码,同时需要Google Authenticator产生的验证码登录,如下图 + +![google4](/images/authn/google4.png) + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/ha.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/ha.md new file mode 100644 index 000000000..9342755df --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/ha.md @@ -0,0 +1,112 @@ +--- +title: 高可用性 +sidebar_position: 1 +--- +# 高可用性 +High Availability + +## 通常架构 +Architecture +![微服务架构Microservice](/images/maxkey_ha.png) + +## 微服务架构 +Microservice Architecture + +![微服务架构Microservice](/images/maxkey_ha_micro.png) + + + +## 高可用性配置 + +### 环境准备 +准备两台服务器,并安装MaxKey + +### Redis缓存准备 + +安装Redis服务或者Redis集群 + +### 修改配置文件 +目录MaxKey-v*GA/maxkey/中以下文件 +``` +application-https(http).properties +``` +maxkey-web-maxkey*.jar中的 + +``` +application-https(http).properties。 +``` + +Redis配置 + +```ini +#redis +spring.redis.host=127.0.0.1 +spring.redis.port=6379 +spring.redis.password=password +spring.redis.timeout=10000 +spring.redis.jedis.pool.max-wait=1000 +spring.redis.jedis.pool.max-idle=200 +spring.redis.lettuce.pool.max-active=-1 +spring.redis.lettuce.pool.min-idle=0 +``` + +启动Sessions存储在Redis配置(v3.5.0之前版本) + +```ini +# Session store type. +spring.session.store-type=redis +# Session timeout. If a duration suffix is not specified, seconds is used. +server.servlet.session.timeout=1800 +# Sessions flush mode. +spring.session.redis.flush-mode=on_save +# Namespace for keys used to store sessions. +spring.session.redis.namespace=spring:session +``` + +### Nginx转发配置 + + 请参照Nginx官方网站完成配置 + + nginx-1.19.9关键转发配置如下 + +``` + #服务器的集群maxkeycluster ,weight是权重的意思,权重越大,分配的概率越大。 + upstream sso.maxkey.top{ + server 127.0.0.1:8080 weight=10; + #server 127.0.0.1:8082 weight=10; + ip_hash; + } + + server { + listen 443 ssl; + server_name localhost; + + ssl_certificate C:/IDES/nginx-1.19.9/maxkey.pem; + ssl_certificate_key C:/IDES/nginx-1.19.9/maxkey.key; + + ssl_session_cache shared:SSL:1m; + ssl_session_timeout 5m; + + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + + location / { + root html; + index index.html index.htm; + } + + #服务器集群路径 + location /maxkey/ { + proxy_pass http://sso.maxkey.top/maxkey/; + } + } +``` + + +### 证书签发 + +请参照如何用acme.sh申请证书 + +英文 + +中文 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/kerberos.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/kerberos.md new file mode 100644 index 000000000..c02b4f1fa --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/kerberos.md @@ -0,0 +1,19 @@ +--- +title: Kerberos认证 +sidebar_position: 6 +--- +# 基于Kerberos/SPNEGO/AD自动登录集成 + +MaxKey未提供基于Kerberos的认证,但是提供JWT的接入方式,可以通过Kerberos认证完成,然后使用JWT的实现MaxKey的自动登录。 + +建议参考 + +1)spring-security-kerberos的实现 + +https://github.com/spring-projects/spring-security-kerberos + +2)SPNEGO 实现 + +Integrated Windows Authentication and Authorization in Java + +http://spnego.sourceforge.net/ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/mfa.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/mfa.md new file mode 100644 index 000000000..40a74187a --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/conf/mfa.md @@ -0,0 +1,18 @@ +--- +title: 双因素认证 +sidebar_position: 4 +--- +# 双因素认证(MFA) + +双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统。双因素认证是一种采用时间同步技术的系统,采用了基于时间、事件和密钥三变量而产生的一次性密码来代替传统的静态密码。每个动态密码卡都有一个唯一的密钥,该密钥同时存放在服务器端,每次认证时动态密码卡与服务器分别根据同样的密钥,同样的随机参数(时间、事件)和同样的算法计算了认证的动态密码,从而确保密码的一致性,从而实现了用户的认证。就像我们去银行办卡送的口令牌. + +多因素认证(MFA),是一种计算机访问控制的方法,用户要通过两种以上的认证机制之后,才能得到授权,使用计算机资源。MFA的目的是建立一个多层次的防御,使未经授权的人访问计算机系统或网络更加困难,从而提高安全性。 + + +## 双因素认证 + +1、短信认证 腾讯云短信/阿里云短信/网易云信/定制 + +2、电子邮件 + +![sms](../../static/images/adminster/配置管理/短信服务.png) diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/dev/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/dev/_category_.json new file mode 100644 index 000000000..3f427ac3f --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/dev/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "开发指南", + "position": 7, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/dev/build.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/dev/build.md new file mode 100644 index 000000000..185895ddf --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/dev/build.md @@ -0,0 +1,117 @@ +--- +layout: zh/default +sidebar_position: 5 +--- +# 项目构建 + +## Java项目构建 +### 配置环境变量 +```powershell +setEnvVars.bat + +set JAVA_HOME=D:\IDE\jdk-17.0.9+9 + +set GRADLE_HOME=C:\IDE\gradle-8.8 +``` + + +### 标准构建 + +1.启动构建 + +```powershell +gradlew build -x test或者release.bat +``` + +2.构建结果 + +构建包路径 + +MaxKey/build + +依赖包路径 + +maxkey-webs/maxkey-web-manage/ + +maxkey-webs/maxkey-web-maxkey/ + + +### Docker构建 + +1.Docker 构建配置 + +```powershell +release_cnf_docker.bat +``` + +2.启动构建 + +```powershell +gradlew build jib -x test或者release_docker.bat +``` + +3.构建的结果 + +maxkey-web-manage/ + +maxkey-web-maxkey/ + + +### 传统构建 + +1.传统 构建配置 + +```powershell +release_cnf_tradition.bat +``` + +2.启动构建 + +gradlew build -x test或者release.bat + + +3.构建的结果 + +构建包路径 + +MaxKey/build/maxkey-jars + +依赖包路径 + +MaxKey/build/MaxKey-v(version)GA + + +## 前端构建Build + +1)MaxKey统一认证前端 + +maxkey-web-frontend/maxkey-web-app + +```powershell +ng build --prod --base-href /maxkey/ +``` + +2)MaxKey身份安全管理前端 + +maxkey-web-frontend/maxkey-web-mgt-app + +```powershell +ng build --prod --base-href /maxkey-mgt/ +``` + +## 问题及解决 + +问题1 +```powershell + yarn start + ``` + +``` +CategoryInfo : SecurityError: ,PSSecurityException +FullyQualifiedErrorId : UnauthorizedAccess +``` + +解决方案: +```powershell +Set-ExecutionPolicy RemoteSigned -Scope Process +``` diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/dev/development.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/dev/development.md new file mode 100644 index 000000000..855f280d9 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/dev/development.md @@ -0,0 +1,145 @@ +--- +layout: zh/default +sidebar_position: 1 +--- +# 开发指南 + + + +## 开发工具及相关软件 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
软件版本推荐备注
JDK17 +JAVA运行及开发工具包
Node.jsv20.15.1 +Node.js开发工具包
eclipse-jee2024-09推荐JAVA开发工具
Visual Studio Code1.95.3 +推荐前端开发工具
MySQL8.0.30 +数据库服务器
Gradle8.8+ 代码构建
Redis6 +可选高速缓存内存数据库
Kafka2.5.0 +可选用户生命周期管理同步消息中间件
RocketMQ4.9.0 +可选用户生命周期管理同步消息中间件
+ + +## 项目目录 + +``` +MaxKey #项目目录 +├── README.md #MaxKey项目介绍 +├── LICENSE #Apache License v2许可证 +├── NOTICE #MaxKey版权声明 +├── ReleaseNotes.txt #GA版本发布记录描述 +├── config #构建方式配置Jar,Docker,Standard +├── docker #Docker & docker-compose部署文件 +├── integrations #集成的例子 +├── maxkey-authentications #登录认证 +│ ├── maxkey-authentication-core #登录认证-核心功能 +│ ├── maxkey-authentication-provider #登录认证-认证服务 +│ └── maxkey-authentication-provider-mgt #管理端登录认证-认证服务 +├── maxkey-common #通用基础包和工具类 +├── maxkey-core #基础包 +├── maxkey-lib #本地jar包引入 +├── maxkey-persistence #数据库持久化和实时数据同步 +├── maxkey-protocols #认证协议实现 +│ ├── maxkey-protocol-authorize #认证协议及单点注销实现 +│ ├── maxkey-protocol-cas #CAS认证协议实现 +│ ├── maxkey-protocol-extendapi #飞扩展API实现 +│ ├── maxkey-protocol-formbased #Formbased实现,桌面认证实现开发浏览器插件实现 +│ ├── maxkey-protocol-jwt #JWT实现 +│ ├── maxkey-protocol-oauth-2.0 #OAuth 2.x,OpenID Connect实现 +│ ├── maxkey-protocol-saml-2.0 #SAML 2.0实现 +│ └── maxkey-protocol-tokenbased #tokenbased实现 +├── maxkey-starters #通用starter组件 +│ ├── maxkey-starter-captcha #图形验证码starter组件 +│ ├── maxkey-starter-ip2location #IP地址转归属地starter组件 +│ ├── maxkey-starter-otp #OTP动态口令starter组件 +│ ├── maxkey-starter-sms #短信发送starter组件 +│ ├── maxkey-starter-social #社交账号登录starter组件 +│ └── maxkey-starter-web #web公共starter组件 +├── maxkey-synchronizers #身份同步器maxkey-synchronizer +│ ├── maxkey-synchronizer #同步器接口 +│ ├── maxkey-synchronizer-activedirectory #微软Active Directory同步器 +│ ├── maxkey-synchronizer-feishu #飞书同步器 +│ ├── maxkey-synchronizer-ldap #标准LDAP同步器 +│ ├── maxkey-synchronizer-dingtalk #钉钉同步器 +│ ├── maxkey-synchronizer-workweixin #企业微信同步器 +│ └── maxkey-synchronizer-jdbc #JDBC同步器 +├── maxkey-web-apis #开放接口API +│ ├── maxkey-web-api-rest #REST身份管理接口 +│ └── maxkey-web-api-scim #SCIM2.0身份管理接口 +├── maxkey-web-frontend #web前端 +│ ├── maxkey-web-app #认证服务前端 +│ └── maxkey-web-mgt-app #管理服务前端 +├── maxkey-webs #web服务 +│ ├── maxkey-web-maxkey #认证系统 +│ ├── maxkey-web-mgt #管理系统 +│ ├── maxkey-web-openapi #开放API接口 +│ └── maxkey-gataway #基于Spring Cloud套件的网关服务 +├── shellscript #Window和LINUX启动脚本 +├── sql #数据库MYSQL脚本,GA版本对应SQL +├── checkstyle #编码规范配置 +├── gradle.properties #版本参数配置 +├── build.gradle #默认工程构建及版本控制 +├── build_cnf.gradle #工程构建配置脚本 +├── gradle #gradle的配置 +├── release.bat #标准构建版本 +├── release_cnf_docker.bat #构建Docker配置 +├── release_cnf_standard.bat #构建标准配置 +├── release_cnf_tradition.bat #构建传统配置 +├── release_docker.bat #docker构建 +├── release_docker_jib.bat #docker jib构建 +├── release_frontend_docker.bat #docker前端构建 +├── setEnvVars.bat #JDK及Gradle路径配置,开发人员配置 +└── settings.gradle #项目模块配置 +``` diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/dev/eclipse.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/dev/eclipse.md new file mode 100644 index 000000000..ce72ce961 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/dev/eclipse.md @@ -0,0 +1,113 @@ +--- +layout: zh/default +sidebar_position: 2 +--- +# Eclipse开发指南 + +Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。 + + +## 开发工具及相关软件 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
软件版本推荐目录备注
JDK17 +C:\ide\jdk-17.0.9+9JAVA运行及开发工具包
eclipse-jee2024-09推荐C:\ide\eclipse-jee-2024-09-RJAVA开发工具
Gradle8.8+ C:\ide\gradle-8.8代码构建
+ +## 仓库代码下载 +- 代码地址:访问 + +- 创建eclipse工作区,workspace-maxkey-demo + +- 代码克隆到工作区内 + +``` +workspace-maxkey-demo #工作区 +├── MaxKey #项目目录 +``` + + +## 开发环境启动 +- 启动eclipse + +![start](/images/dev/eclipse/start.png) + +- 选择工作区workspace-maxkey-demo + +![start_workspace](/images/dev/eclipse/start_workspace.png) + +- 选择导入Gradle项目 + +![import](/images/dev/eclipse/import.png) + +- 选择导入项目目录 + +![import2](/images/dev/eclipse/import2.png) + +- 本地Gradle配置 + +![import3](/images/dev/eclipse/import3.png) + +- 确认导入项目信息 + +![import4](/images/dev/eclipse/import4.png) + +- 项目导入等待 + +![import5](/images/dev/eclipse/import5.png) + +- 项目导入完成 + +![imports](/images/dev/eclipse/import_s.png) + +## 后端项目 + +1)MaxKey统一认证系统 + +maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyApplication.java + +![sso](/images/dev/eclipse/sso.png) + +2)MaxKey身份安全管理系统 + +maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtApplication.java + +![mgt](/images/dev/eclipse/mgt.png) + +## 项目运行 + +![run](/images/dev/eclipse/run.png) + +## 问题及解决 + +``` +“A cycle was detected in the build path of project: XXX” +``` + +解决方法: + +Eclipse Menu -> Window -> Preferences... -> Java -> Compiler -> Building -> Building path problems -> Circular dependencies -> 将Error改成Warning diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/dev/vscod_fe.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/dev/vscod_fe.md new file mode 100644 index 000000000..315535f4c --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/dev/vscod_fe.md @@ -0,0 +1,59 @@ +--- +layout: zh/default +sidebar_position: 4 +--- +# VS Code前端开发指南 +Visual Studio Code(简称“VS Code” )是Microsoft开发一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代Web和云应用的跨平台源代码编辑器, 可在桌面上运行,并且可用于Windows,macOS和Linux。它具有对JavaScript,TypeScript和Node.js的内置支持,并具有丰富的其他语言(例如C++,C#,Java,Python,PHP,Go)和运行时(例如.NET和Unity)扩展的生态系统。 + +## 开发环境启动 +- 启动vs code并选择打开目录 + +![start](/images/dev/vscode/start.png) + +- 选择打开项目目录 +![folder](/images/dev/vscode/folder.png) + +- 导入完成 +![import_s.png](/images/dev/vscode/import_s.png) + +## 依赖包安装 + +```powershell +npm install -g @angular/cli@13.3.0 + +npm install + +npm i --save-dev @angular-devkit/build-angular@13.3.0 + +yarn install +``` +## 统一认证前端 + +maxkey-web-frontend/maxkey-web-app +```powershell +yarn start +``` + +## 身份安全管理前端 + +maxkey-web-frontend/maxkey-web-mgt-app +```powershell +yarn start +``` + +## 问题及解决 + +问题1 +```powershell + yarn start + ``` + +``` +CategoryInfo : SecurityError: ,PSSecurityException +FullyQualifiedErrorId : UnauthorizedAccess +``` + +解决方案: +```powershell +Set-ExecutionPolicy RemoteSigned -Scope Process +``` diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/_category_.json new file mode 100644 index 000000000..83500ac2f --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "用户手册", + "position":12, + "link": { + "type": "generated-index", + "description": "手册." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/_category_.json new file mode 100644 index 000000000..8d0ab0834 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "管理端", + "position": 12, + "link": { + "type": "generated-index", + "description": "管理端." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/仪表盘.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/仪表盘.md new file mode 100644 index 000000000..fab73ad2a --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/仪表盘.md @@ -0,0 +1,38 @@ +# 管理员仪表盘 + +## 概述 +管理员仪表盘是系统管理的总控制台,提供系统运行状态的集中展示、关键数据统计分析和快速功能入口,帮助管理员全面掌握系统情况并高效完成日常管理工作。 + +## 访问路径 +1. 使用管理员账户登录系统 +2. 登录成功后自动进入仪表盘页面 +3. 或在左侧导航栏中点击 **仪表盘** 图标进入 + +## 界面说明 +仪表盘采用模块化布局,主要包含以下功能区域: +### 概览统计区 +以卡片形式展示关键系统指标,主要包括: +- **当前在线用户**:当前同时在线的管理员和普通用户数量 +- **今日访问量**:当天系统访问次数统计 +- **当月新增用户数**:当前月新增用户数量 +- **当月活跃用户数**:当前月活跃用户数量 +![4个卡片](../../../static/images/adminster/仪表盘/4个卡片.png) + +### 数据图表区 +通过可视化图表展示系统关键数据趋势,主要包括: +- **当日访问情况统计**:今日访问量统计 +- **30日访问量统计**:30天访问量统计 +- **30日应用访问排行**:30天应用系统的访问次数TOP10 +- **30日访问地域分布**:用户访问的地理区域分布热力图 +- **30日浏览器访问排行**:30天浏览器的访问次数TOP10 + + +## 功能操作 + +### 页面设置 +点击右上角的齿轮图标,可以选择使用RTL、全屏、清理本地缓存等功能 +![齿轮](../../../static/images/adminster/仪表盘/齿轮.png) +设置全屏: +![全屏模式](../../../static/images/adminster/仪表盘/全屏模式.png) +点击左侧树图,最下面图标,可以切换数据图的显示方式: +![切换树图](../../../static/images/adminster/仪表盘/切换树图.png) diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/应用管理.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/应用管理.md new file mode 100644 index 000000000..0a8dd3434 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/应用管理.md @@ -0,0 +1,69 @@ +# 应用管理 + +## 概述 +应用管理模块负责系统内所有集成应用的全生命周期管理,包括应用注册、配置、授权、监控和注销。通过统一的应用管理界面,管理员可以集中配置单点登录(SSO)参数、设置访问策略、分配用户权限,实现对企业各类应用的安全管控和便捷访问。 + +## 访问路径 +1. 登录系统管理端 +2. 在左侧导航栏中点击 **应用管理** + +## 功能操作 +### 应用协议认证管理 +#### 查询应用协议认证 +1. 进入应用管理主界面 +2. 在查询区可选择以下查询方式: + - **默认查询**:直接点击**查询**按钮,显示所有应用的协议认证信息 + - **条件查询**: + - 在**应用名称**输入框中输入关键词 + - 在**协议类型**下拉框中选择特定协议(如OAuth2.0、SAML2.0等) + - 点击**查询**按钮,显示匹配的应用协议认证信息 +3. 查询结果将显示在应用列表中,包含应用名称、协议类型、状态等信息 +![应用管理](../../../../maxkey-docs/static/images/adminster/应用管理/首页.png) +根据名称查询 +![应用管理](../../../../maxkey-docs/static/images/adminster/应用管理/根据名称查询.png) +根据协议查询 +![应用管理](../../../../maxkey-docs/static/images/adminster/应用管理/根据协议查询.png) + +#### 新增应用协议认证 +1. 在应用列表页面点击 **新增** 按钮,弹出协议类型选择框 +2. 分为两种类型: + - **基于标准协议认证**:如OAuth2.x、SAML2.0、CAS、JWT令牌、OpenID Connect +![应用管理](../../../../maxkey-docs/static/images/adminster/应用管理/新增-标准协议.png) + + - **基于定制协议认证**:如令牌认证、API扩展认证、表单认证基本登录 +![应用管理](../../../../maxkey-docs/static/images/adminster/应用管理/新增-定制协议.png) + +3. 选择协议后,系统跳转到对应协议的配置界面 +4. 根据界面提示填写协议认证要素信息(填写基本信息——配置信息——扩展信息): + - 以OAuth2.x为例(带*号的为必填项): + - 应用ID编码 + - 应用秘钥 + - 图标 + - 应用名称 + - 协议 + - 登录地址 + - 状态 +![应用管理](../../../../maxkey-docs/static/images/adminster/应用管理/新增表单.png) +![应用管理](../../../../maxkey-docs/static/images/adminster/应用管理/新增配置.png) +![应用管理](../../../../maxkey-docs/static/images/adminster/应用管理/新增扩展信息.png) +5. 填写完成后点击 **提交** 按钮 +6. 系统提示"保存成功"后,新应用将出现在应用列表中 + +#### 编辑应用协议认证 +1. 在应用列表中找到目标应用 +2. 点击操作列的 **编辑** 按钮,进入应用协议认证编辑界面 +3. 在编辑界面中可以修改以下信息: + - 基本信息(应用名称、描述等) + - 协议认证参数(根据所选协议类型不同而有所差异) + - 访问控制策略 +4. 修改完成后点击 **提交** 按钮 +5. 系统提示"提交成功"后,修改内容将生效 +![应用管理](../../../../maxkey-docs/static/images/adminster/应用管理/编辑信息.png) + + +#### 删除应用协议认证 +1. 在应用列表中勾选一个或多个需要删除的应用 +2. 点击页面上方的 **删除** 按钮 +3. 系统提示"删除成功",所选应用将从列表中移除 +> **注意**:删除应用协议认证信息前,请确保该应用已不再使用,删除后将无法恢复 + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/日志审计.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/日志审计.md new file mode 100644 index 000000000..bd3923374 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/日志审计.md @@ -0,0 +1,87 @@ +# 日志审计 + +## 概述 +日志审计模块是系统安全审计的核心组件,负责采集、存储、分析和展示系统内所有操作行为和安全事件日志。通过集中化的日志管理,管理员可以追溯用户操作、排查安全事件、满足合规要求(如等保2.0),并通过日志分析发现潜在的安全风险。 + +## 访问路径 +1. 登录系统管理端 +2. 在左侧导航栏中选择 **日志审计** 菜单,展开后显示五个二级子节点: + - 登录日志 + - 访问日志 + - 同步器日志 + - 连接器日志 + - 系统日志 + +## 核心日志类型与字段 +| 日志类型 | 核心字段 | +|----------------|--------------------------------------------------------------------------| +| 系统登录日志 | 会话、登录名、姓名、状态、登录方式、访问地址、浏览器、平台、登录时间、退出时间 | +| 应用访问日志 | 会话、登录名、姓名、应用名称、登录时间 | +| 同步器日志 | 同步器编号、同步器、对象编号、对象类型、对象名称、同步时间、结果 | +| 连接器日志 | 编号、连接器、类型、源编码、源名称、对象编号、对象名称、时间、结果 | +| 系统管理日志 | 主题、内容、操作、结果、操作人、执行时间 | + +## 功能操作 + +### 登录日志 +选中左侧导航栏中的 **登录日志** 二级菜单节点,进入系统登录日志界面。 + +#### 界面说明 +在登录日志界面,可以查看用户系统登录的详细信息,列表展示包括:会话、登录名、姓名、状态、登录方式、访问地址、浏览器、平台、登录时间、退出时间等信息。 +![登录日志](../../../static/images/adminster/日志管理/登录.png) + + +#### 查询操作 +1. 基础查询条件包括:登录账号、姓名 +2. 点击 **展开** 按钮,会显示更多查询条件:员工编号、开始时间、结束时间 +3. 可以组合以上条件进行精确查询 +4. 点击 **查询** 按钮获取匹配结果 + +### 访问日志 +选中左侧导航栏中的 **访问日志** 二级菜单节点,进入应用访问日志界面。 + +#### 界面说明 +在应用访问日志界面,可以查看用户访问应用的详细信息,列表展示包括:会话、登录名、姓名、应用名称、登录时间等信息。 +![访问日志](../../../static/images/adminster/日志管理/访问.png) +#### 查询操作 +1. 基础查询条件包括:登录账号、姓名 +2. 点击 **展开** 按钮,会显示更多查询条件:员工编号、开始时间、结束时间 +3. 可以组合以上条件进行精确查询 +4. 点击 **查询** 按钮获取匹配结果 + +### 同步器日志 +选中左侧导航栏中的 **同步器日志** 二级菜单节点,进入同步器日志界面。 +![同步器日志](../../../static/images/adminster/日志管理/同步器.png) +#### 界面说明 +在同步器日志界面,可以查看应用同步的详细信息,列表展示包括:同步器编号、同步器、对象编号、对象类型、对象名称、同步时间、结果等信息。 + +#### 查询操作 +1. 基础查询条件包括:登录账号、姓名 +2. 点击 **展开** 按钮,会显示更多查询条件:员工编号、开始时间、结束时间 +3. 可以组合以上条件进行精确查询 +4. 点击 **查询** 按钮获取匹配结果 + +### 连接器日志 +选中左侧导航栏中的 **连接器日志** 二级菜单节点,进入连接器日志界面。 +![连接器日志](../../../static/images/adminster/日志管理/连接器.png) +#### 界面说明 +在连接器日志界面,可以查看连接器的详细信息,列表展示包括:编号、连接器、类型、源编码、源名称、对象编号、对象名称、时间、结果等信息。 + +#### 查询操作 +1. 基础查询条件包括:登录账号、姓名 +2. 点击 **展开** 按钮,会显示更多查询条件:员工编号、开始时间、结束时间 +3. 可以组合以上条件进行精确查询 +4. 点击 **查询** 按钮获取匹配结果 + +### 系统日志 +选中左侧导航栏中的 **系统日志** 二级菜单节点,进入系统管理日志界面。 + +#### 界面说明 +在系统管理日志界面,可以查看用户的所有系统管理操作信息,列表展示包括:主题、内容、操作、结果、操作人、执行时间等信息。 +![系统日志](../../../static/images/adminster/日志管理/系统.png) +#### 查询操作 +1. 基础查询条件包括:登录账号、姓名 +2. 点击 **展开** 按钮,会显示更多查询条件:员工编号、开始时间、结束时间 +3. 可以组合以上条件进行精确查询 +4. 点击 **查询** 按钮获取匹配结果 + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/权限管理.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/权限管理.md new file mode 100644 index 000000000..e689a7655 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/权限管理.md @@ -0,0 +1,87 @@ +# 权限管理 + +## 概述 +权限管理模块用于配置和管理系统中的各种权限策略,包括角色定义、权限分配、资源控制等功能,帮助管理员实现精细化的访问控制。 + +## 访问路径 +1. 登录系统管理端 +2. 在左侧导航栏中选择 **权限管理** 菜单: +![权限管理](../../../static/images/adminster/权限管理/首页.png) + +## 权限管理操作 + +### 资源管理 +选中需要进行进行权限管理的系统 右侧对应的 **资源** 菜单节点,进入资源管理界面。 + + +#### 资源操作 +在资源管理界面,可以对资源做以下操作: + +##### 查询资源 +1. 在搜索框中输入资源名称 +2. 点击 **查询** 按钮获取匹配结果 +![权限管理](../../../static/images/adminster/权限管理/通过资源名称进行查询.png) + +##### 新增资源 +1. 点击 **新增** 按钮,弹出资源信息填写界面 +2. 根据界面提示填写资源信息要素: + - 资源名称(必填) + - 资源类型(必填) + - 父级编码(必填) +3. 填写完成后点击 **保存** 按钮 +![权限管理](../../../static/images/adminster/权限管理/新增资源.png) +##### 编辑资源 +1. 在资源列表中找到目标资源,点击 **编辑** 按钮 +2. 修改相关信息 +3. 点击 **保存** 完成修改 +![权限管理](../../../static/images/adminster/权限管理/编辑资源.png) + +##### 删除资源 +1. 在资源列表中找到目标资源,点击 **删除** 按钮 +2. 在确认对话框中点击 **确认** 完成删除 +![权限管理](../../../static/images/adminster/权限管理/删除资源.png) + + + + + + +### 角色管理 +### 角色管理 +选中对应应用右侧中的 **角色** 菜单节点,进入角色管理界面。 +![权限管理](../../../static/images/adminster/权限管理/角色管理.png) + + +#### 角色成员管理 +1. 点击**成员**查询后,界面会显示该角色下的成员信息列表 +![权限管理](../../../static/images/adminster/权限管理/点击成员.png) +2. 可以查看成员的基本信息和当前权限配置 + +#### 新增角色 +1. 点击 **新增角色** 按钮 +2. 填写角色信息 +![权限管理](../../../static/images/adminster/权限管理/新增角色.png) +3. 点击 **保存** 完成创建 + + +#### 编辑角色 +1. 在角色列表中找到目标角色,点击 **编辑** 按钮 +2. 修改相关信息 +![权限管理](../../../static/images/adminster/权限管理/编辑角色.png) +3. 点击 **保存** 完成修改 + +#### 删除角色 +1. 在角色列表中找到目标角色,点击 **删除** 按钮 +2. 在确认对话框中点击 **确认** +> **注意**:系统内置角色不允许删除 +![权限管理](../../../static/images/adminster/权限管理/删除角色.png) + + + +### 权限分配 +选中需要进行进行权限管理的系统 右侧对应的 **权限** 菜单节点,进入权限管理界面。 +![权限管理](../../../static/images/adminster/权限管理/查看权限.png) + + + + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/登录.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/登录.md new file mode 100644 index 000000000..056c08454 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/登录.md @@ -0,0 +1,95 @@ +--- +layout: zh/default +title: 管理系统登录 +sidebar_position: 1 +--- + +# 登录 + +## 概述 +管理员登录模块是系统安全访问的第一道防线,用于验证管理员身份并授予相应的系统管理权限。本文档详细介绍管理员登录系统的各种方式、操作步骤、安全策略及常见问题处理方法。 + +## 访问路径 +### 常规访问 +1. 打开浏览器,输入系统管理端URL:`http://mgt.maxkey.top/maxkey-mgt/` +2. 系统显示管理员登录界面 +![登录](../../../static/images/adminster/登录/登录.png) + + +### 备用访问 +当主登录页面无法访问时,可通过以下路径登录: +1. 访问用户端首页:` http://sso.maxkey.top/maxkey/` +2. 点击页面顶部的 **后台** 链接 +3. 跳转至管理员登录界面 + +## 登录界面说明 +管理员登录界面包含以下关键元素: +- **系统标识区**:显示系统名称及Logo +- **登录表单区**:根据选择的登录方式显示相应的输入表单 (仅支持用户名密码登录方式) +- **安全提示区**:显示当前登录环境安全状态及提示信息 +- **辅助功能区**:包含忘记密码、语言切换、帮助链接等功能 +- **版权信息区**:显示系统版本及版权声明 + +## 登录方式及操作步骤 + +### 1. 用户名密码登录 +这是系统默认的基础登录方式,适用于所有管理员账户。 + +#### 操作步骤: +1. 在登录方式切换区选择 **用户名密码登录** +2. 在登录表单中输入以下信息: + - **管理员账号**:输入管理员用户名或邮箱 + - **密码**:输入账户密码(区分大小写) + - **验证码**:输入页面显示的图形验证码 +3. 点击 **登录** 按钮 +4. 验证通过后,系统自动跳转至管理员控制台首页 +![登录成功](../../../static/images/adminster/登录/登录成功.png) + +### 退出登录 +退出登录时,请务必点击 **退出** 图标,以安全退出系统。 +![退出登录](../../../static/images/adminster/登录/退出登录.png) + + + +## 登录异常处理 + +### 登录页面无法访问 +1. 检查网络连接是否正常 +2. 确认服务器是否正常运行 +3. 检查访问端口是否正确 +4. 清除浏览器缓存后重试 +5. 尝试使用其他浏览器或设备 +6. 联系系统运维人员检查服务状态 + +## 常见问题解答 + +### Q1: 为什么输入正确的用户名密码却无法登录? +A1: 可能原因及解决方法: +1. 账户已被锁定:等待解锁或联系其他管理员解锁 +2. IP地址受限:使用允许的IP地址登录或联系管理员添加IP白名单 +3. 密码已过期:联系管理员重置密码 +4. 浏览器缓存问题:清除浏览器缓存或使用隐私模式尝试 +5. 账户已被禁用:联系超级管理员检查账户状态 + + +### Q2: 登录后系统提示"权限不足"是什么原因? +A3: 可能原因: +1. 账户权限已被修改或撤销 +2. 当前登录角色不具备管理端访问权限 +3. 会话已过期,需重新登录 +4. 账户处于待激活状态 +解决方法:联系超级管理员检查并调整账户权限 + +### Q4: 如何查看管理员登录日志? +A4: 系统记录所有管理员登录活动,可通过以下路径查看: +1. 使用超级管理员账户登录 +2. 进入 **审计** -> **系统登录日志** +3. 可查看登录时间、IP地址、设备信息、登录状态等详细记录 + +### Q5: 单点登录失败如何处理? +A5: 单点登录失败的排查步骤: +1. 确认企业单点登录系统是否正常运行 +2. 检查浏览器是否阻止了重定向 +3. 清除浏览器Cookie后重试 +4. 联系系统管理员检查单点登录配置 +5. 作为临时解决方案,可使用用户名密码方式登录 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/访问控制/会话管理.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/访问控制/会话管理.md new file mode 100644 index 000000000..f21cdb9a4 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/访问控制/会话管理.md @@ -0,0 +1,11 @@ + + +## 会话管理 +在会话管理界面,可以对用户做查询、终止操作。 +![应用管理](../../../../static/images/adminster/访问控制/会话管理/首页.png) +点击**查询**按钮,显示所有用户的会话信息 +点击展开,可以规定查询会话记录的时间范围 默认为1个月 可以自行设定,可以根据员工编号检索会话 +![应用管理](../../../../static/images/adminster/访问控制/会话管理/点击展开.png) +选中需要终止的会话,可以终止当前使用的登录会话。操作如下: +1. 在会话管理界面,选中需要终止的会话,点击 **终止** 按钮 +2. 系统提示"终止成功",所选会话将终止 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/访问控制/访问控制.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/访问控制/访问控制.md new file mode 100644 index 000000000..b076bd488 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/访问控制/访问控制.md @@ -0,0 +1,10 @@ +# 访问控制 + + + + + + + + + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/身份管理/用户.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/身份管理/用户.md new file mode 100644 index 000000000..b0b7da237 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/身份管理/用户.md @@ -0,0 +1,124 @@ +# 用户管理 + +## 概述 +用户管理模块用于维护系统用户信息,支持用户的全生命周期管理,包括查询、新增、编辑、删除及密码重置等功能,实现对系统用户的集中管控。 + +## 访问路径 +1. 登录系统管理端 +2. 在左侧导航栏中,依次展开 **身份管理** -> **用户** +3. 点击 **用户** 节点进入主界面 +![用户](../../../../static/images/adminster/身份管理/用户.png) + + +## 界面说明 +### 主要功能区 +- **组织机构树**:左侧树形结构,展示系统中的组织架构 +- **查询区**:包含用户登录账号输入框和**查询**按钮 +- **用户列表**:中部表格区域,显示符合条件的用户信息 +- **操作按钮**:列表上方包含**新增**、**密码修改**等功能按钮 +- **编辑下拉菜单**:每条用户记录操作列的**编辑**按钮包含更多操作选项 + + +## 功能操作 +### 查询用户 +#### 方式一:通过组织机构查询 +1. 在左侧**组织机构树**中点击目标组织节点 +2. 右侧用户列表将自动刷新为该组织下的所有用户 + +#### 方式二:通过账号查询 +1. 在查询框中输入**用户登录账号** +2. 点击**查询**按钮 +3. 用户列表将显示匹配的用户记录 +![用户查询](../../../../static/images/adminster/身份管理/用户/用户查询.png) + +### 新增用户 +1. 点击页面上方**新增**按钮,打开用户信息编辑弹窗 +2. 在各标签页中填写用户信息: + - **基本信息**(必填): + - 登录账号(字母/数字组合,唯一标识) + - 用户名(显示名称) + - 密码(需符合密码策略要求) + - 确认密码 + - **所属机构**:选择用户所属的组织机构 + - **个人信息**:姓名、性别、出生日期等 + - **机构扩展**:职位、工号等组织相关信息 + - **家庭信息**(选填):联系电话、家庭住址等 +3. 填写完成后点击**保存**按钮 +4. 系统自动校验必填项,全部通过后提示"保存成功" +5. 新用户将出现在用户列表中 + +![新增用户](../../../../static/images/adminster/身份管理/用户/新增用户.png) +![新增用户个人信息](../../../../static/images/adminster/身份管理/用户/新增用户个人信息.png) + +### 密码修改 +1. 在用户列表中勾选目标用户 +2. 点击页面上方**密码修改**按钮,打开密码修改弹窗 +3. 设置新密码(两种方式可选): + - **手动输入**:在密码框中自行输入符合规则的密码 + - **自动生成**:点击**生成**按钮,系统自动创建随机密码 + - 点击**查看**按钮可显示生成的密码明文 +4. 确认密码无误后点击**提交**按钮 +5. 系统提示"密码修改成功" +![密码修改](../../../../static/images/adminster/身份管理/用户/密码修改.png) +### 编辑用户 +#### 基本信息编辑 +1. 在用户列表中找到目标用户 +2. 点击操作列的**编辑**按钮,打开用户信息编辑弹窗 +3. 修改相应信息(与新增用户字段相同) +4. 点击**保存**按钮完成修改 + +![编辑用户](../../../../static/images/adminster/身份管理/用户/编辑用户.png) + +#### 高级操作(通过编辑下拉菜单) +1. 点击用户记录操作列**更多**按钮的下拉箭头 +2. 从菜单中选择需要的操作: + - **用户组**:配置用户所属的用户组 + - **密码修改**:同独立密码修改功能 + - **启用**:激活禁用状态的用户 + - **锁定**:临时锁定用户账号 + - **禁用**:停用用户账号 + - **删除**:移除用户记录 + +### 删除用户 +1. 在用户列表中勾选一个或多个用户 +2. 点击操作列**编辑**按钮下拉菜单中的**删除**选项 +3. 在确认对话框中点击**确定** +4. 系统提示"删除成功",用户记录从列表中移除 + +### 用户状态管理 +1. 已删除用户恢复: + - 通过查询找到已删除用户(需调整查询条件包含已删除状态) + - 点击**编辑**按钮打开用户信息弹窗 + - 在**基本信息**标签页中找到**状态**下拉框 + - 选择**正常**或**启用**状态 + - 点击**保存**按钮完成状态恢复 + +2. 状态说明: + - **正常**:可正常登录和使用系统 + - **锁定**:临时限制登录(通常因密码错误次数过多) + - **禁用**:管理员手动停用账号 + - **删除**:标记为删除状态(可恢复) + +![锁定用户](../../../../static/images/adminster/身份管理/用户/锁定用户.png) +![解锁成功](../../../../static/images/adminster/身份管理/用户/解锁成功.png) + +## 注意事项 +1. **必填项校验**: + - 新增/编辑用户时,带`*`标识的字段为必填项 + - 提交前系统会自动校验,未完善项会标红提示 + +2. **密码策略**: + - 密码长度至少8位 + - 需包含大小写字母、数字和特殊符号 + - 自动生成的密码默认符合复杂度要求 + +3. **用户关联**: + - 删除用户前请确保其已与所有角色、岗位解除关联 + - 禁用用户不会删除其历史数据和关联关系 + +## 常见问题 +**Q:如何批量修改用户密码?** +A:目前系统不支持批量密码修改,需逐个用户操作。 + +**Q:用户被锁定后如何处理?** +A:管理员可通过**更多**下拉菜单中的**启用**操作解除锁定。 diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/身份管理/用户组.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/身份管理/用户组.md new file mode 100644 index 000000000..0e80b5574 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/身份管理/用户组.md @@ -0,0 +1,60 @@ +# 用户组管理 + +## 概述 + +在身份管理模块中,用户组用于对用户进行分类和管理。通过用户组,可以方便地对不同类型的用户进行权限分配和管理。 + +## 用户组列表 +用户组列表页面用于查看、创建、编辑和删除用户组。 + +![用户](../../../../static/images/adminster/身份管理/用户组.png) + +### 操作说明 + +- **新增**:点击“新增”按钮,可以创建新的用户组。 + + 1. 可以新增静态板用户组: +![新增用户组](../../../../static/images/adminster/身份管理/用户组/新增用户组.png) + 2. 可以新增动态用户组: +![新增动态](../../../../static/images/adminster/身份管理/用户组/新增动态.png) +- **批量删除**:选择多个用户组后,点击“批量删除”按钮,可以一次性删除选中的用户组。 +- **查询**:在“用户组名称”输入框中输入关键词,点击“查询”按钮,可以快速查找特定的用户组。 +![查询](../../../../static/images/adminster/身份管理/用户组/查询.png) +- **编辑**:点击用户组对应的“编辑”按钮,可以修改该用户组的信息。 +- **更多**:点击用户组对应的“更多”按钮,可以展开更多操作选项,如查看该用户组的用户列表、查看该用户组所关联的权限、删除该用户组等。 + +## 使用步骤 + +1. **进入用户组页面**: + - 在导航栏中依次点击“home / 身份管理 / 用户组”,进入用户组管理页面。 + +2. **查询用户组**: + - 在“用户组名称”输入框中输入关键词,点击“查询”按钮,可以快速查找特定的用户组。 + + +![查询](../../../../static/images/adminster/身份管理/用户组/查询.png) + +3. **新增用户组**: + - 点击页面上方的“新增”按钮,打开新增用户组的对话框。 + - 填写用户组名称、类型和描述等信息,点击“保存”按钮完成新增。 + +4. **编辑用户组**: + - 在用户组列表中找到需要编辑的用户组,点击对应的“编辑”按钮。 + - 修改用户组的相关信息,点击“保存”按钮完成编辑。 +![编辑](../../../../static/images/adminster/身份管理/用户组/编辑.png) + +5. **批量删除用户组**: + - 在用户组列表中选择需要删除的用户组,点击页面上方的“批量删除”按钮。 + - 系统会弹出确认对话框,确认无误后点击“确定”按钮完成删除。 + +6. **其他操作**: + - 在用户组列表中找到需要操作的用户组,点击对应的“更多”按钮,选择相应的操作项进行操作。 +![用户组成员](../../../../static/images/adminster/身份管理/用户组/更多-成员.png) +![用户组成员](../../../../static/images/adminster/身份管理/用户组/用户组成员.png) +7. **用户组权限管理**: + - 在用户组列表中找到需要操作的用户组,点击“更多”按钮下拉菜单中的“权限”,进入权限管理页面。 + - 在权限管理页面中,可对用户组进行权限配置。 +![访问权限](../../../../static/images/adminster/身份管理/用户组/访问权限.png) + + +通过以上步骤,您可以方便地管理和维护用户组,确保系统的安全性和高效性。 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/身份管理/用户组成员.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/身份管理/用户组成员.md new file mode 100644 index 000000000..63144b364 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/身份管理/用户组成员.md @@ -0,0 +1,13 @@ +# 查询用户组成员 +1. 在**身份管理**目录下的**用户组成员**页面左上方的**用户组名称**对应的输入框中输入要查询的用户组名称,点击查询键,即可检索到对应的用户组全部成员 +![用户组成员](../../../../static/images/adminster/身份管理/用户组/用户组成员/查询用户组.png) +# 添加用户组成员 +在**身份管理**目录下的**用户组成员**页面左上上方的**添加**按钮,点击添加按钮,进入添加用户组成员页面 +![用户组成员](../../../../static/images/adminster/身份管理/用户组/用户组成员/新增用户组成员.png) +# 删除用户组成员 +## 单个用户删除 +在**身份管理**目录下的**用户组成员**页面中,找到要删除的用户,点击**删除**按钮,选择**确定**,即可删除该用户 +![用户组成员](../../../../static/images/adminster/身份管理/用户组/用户组成员/单个删除.png) +## 批量用户删除 +在**身份管理**目录下的**用户组成员**页面中,选中要删除的用户,点击**批量删除**按钮,选择**确定**,即可删除选中的用户 +![用户组成员](../../../../static/images/adminster/身份管理/用户组/用户组成员/批量删除.png) diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/身份管理/组织.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/身份管理/组织.md new file mode 100644 index 000000000..b1c125e75 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/身份管理/组织.md @@ -0,0 +1,104 @@ +--- +layout: zh/default +title: 组织管理 +sidebar_position: 1 +--- + +# 组织 + +## 概述 +组织管理模块用于维护企业组织结构信息,支持对组织的查询、新增、编辑和删除操作,帮助管理员构建清晰的组织架构体系。 + +## 访问路径 +1. 登录系统管理端 +2. 在左侧导航栏中,依次展开 **身份管理** -> **组织** +3. 点击 **组织** 节点进入主界面 + +## 界面说明 +### 主要功能区 +- **查询区**:位于页面顶部,包含组织名称输入框和**查询**按钮 +- **组织树图**:左侧树形结构,展示完整的组织架构层级关系 +- **组织列表**:右侧表格区域,显示当前选中组织下的所有子组织信息 +- **操作按钮**:列表上方包含**新增**、**批量删除**功能按钮 +![组织](../../../../static/images/adminster/身份管理/组织.png) + + +### 新增/编辑组织弹窗 +弹窗包含四个标签页: +- **基本信息**:组织名称、编码、负责人、排序号等核心信息 +- **扩展信息**:自定义字段和补充说明信息 +- **地址**:详细联系地址信息 +- **联系方式**:电话、邮箱等联系信息 +![新增组织](../../../../static/images/adminster/身份管理/新增组织.png) +![新增组织地址信息](../../../../static/images/adminster/身份管理/新增组织地址信息.png) +![新增组织扩展信息](../../../../static/images/adminster/身份管理/新增组织扩展信息.png) +![新增组织联系方式](../../../../static/images/adminster/身份管理/新增组织联系方式.png) + +## 功能操作 +### 查询组织 +#### 方式一:关键词查询 +1. 在查询区输入框中填写**组织名称** +2. 点击**查询**按钮 +3. 组织列表将显示匹配的组织信息 + +#### 方式二:组织树查询 +1. 在左侧组织树图中点击展开层级结构 +2. 直接点击目标组织节点 +3. 右侧列表将显示该组织及其下属子组织信息 +![检索组织](../../../../static/images/adminster/身份管理/检索组织.png) + +### 新增组织 +1. 点击页面上方**新增**按钮,打开新增组织弹窗 +2. 在各标签页中填写组织信息: + - **基本信息**(必填): + - 组织名称(不超过50字符) + - 组织编码(字母或数字,不超过20字符) + - 负责人(从用户列表选择) + - 排序号(数字,用于组织排序) + - **扩展信息**(选填):根据实际需求填写自定义字段 + - **地址**(选填):省/市/区、详细地址、邮政编码 + - **联系方式**(选填):固定电话、移动电话、邮箱地址 +3. 填写完成后点击**保存**按钮 +4. 系统提示"保存成功"后自动关闭弹窗 +5. 可通过查询功能验证新组织是否创建成功 + +### 编辑组织 +1. 在组织列表中勾选需要修改的组织 +2. 点击页面上方**编辑**按钮,打开编辑组织弹窗 +3. 在各标签页中修改相应信息: + - **基本信息**标签页中可修改组织状态: + - 勾选"启用"复选框:激活组织(默认状态) + - 取消勾选"启用"复选框:停用组织 +4. 修改完成后点击**提交**按钮 +5. 系统提示"提交成功"后自动关闭弹窗 +6. 可通过查询功能验证修改结果 +![编辑组织](../../../../static/images/adminster/身份管理/编辑组织.png) +### 删除组织 +1. 在组织列表中勾选需要删除的组织(可多选) +2. 点击页面上方**删除**按钮 +3. 在确认对话框中点击**确定** +4. 系统提示"删除成功",列表中将移除所选组织记录 +![删除组织](../../../../static/images/adminster/身份管理/删除组织.png) +## 注意事项 +1. **必填字段规则**: + - 组织名称和编码为必填项 + - 组织编码不可重复 + - 负责人必须是系统中已存在的用户 + +2. **状态管理**: + - 停用的组织仍会显示在列表中,但无法进行业务操作 + - 包含子组织的父组织不允许删除 + +3. **数据验证**: + - 提交时系统会自动验证数据格式 + - 不符合规则的字段会标红提示并阻止提交 + +## 常见问题 +**Q:为什么无法删除某个组织?** +A:可能原因有: +1. 该组织下仍包含子组织,请先删除所有子组织 +2. 该组织已关联用户或应用权限,请先解除关联关系 +3. 当前登录用户没有组织删除权限 + +**Q:组织编码可以修改吗?** +A:不可以,组织编码在创建后不可修改,如需变更请创建新组织并迁移相关数据。 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/LDAP配置.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/LDAP配置.md new file mode 100644 index 000000000..e832030ff --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/LDAP配置.md @@ -0,0 +1,9 @@ +--- +layout: zh/default +title: LDAP配置 +sidebar_position: 6 +--- + + 在LDAP配置管理界面,可以对配置相关要素根据需求调整。 +![LDAP配置](../../../../static/images/adminster/配置管理/LDAP配置.png) + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/同步器管理.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/同步器管理.md new file mode 100644 index 000000000..d55ef9991 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/同步器管理.md @@ -0,0 +1,82 @@ +--- +layout: zh/default +title: 同步器管理 +sidebar_position: 3 +--- + + +# 同步器管理 + +## 概述 +同步器管理模块用于配置和管理不同应用系统之间的数据同步策略,支持查询、新增、编辑、同步和删除操作,确保各应用系统间的数据一致性。 + +## 访问路径 +登录管理控制台 → 配置管理 → 同步器管理 + +## 界面说明 +同步器管理界面主要包含以下元素: +- **查询区**:包含策略名称搜索框和查询按钮 +- **策略列表**:展示已配置的同步策略,包含策略名称、应用名称、同步状态、创建时间等信息 +- **操作按钮**:包含新增、同步、编辑、删除等功能按钮 + +## 功能操作 + +### 查询策略 +1. 在查询框中输入策略名称(如"钉钉") +2. 点击**查询**按钮 +3. 系统将显示匹配的策略信息,包括策略名称、关联应用、同步状态等 +![同步器管理](../../../../static/images/adminster/配置管理/同步器管理-查询.png) +### 新增策略 +1. 点击**新增**按钮,打开新增策略对话框 +2. 填写以下信息: +![同步器管理](../../../../static/images/adminster/配置管理/同步器管理-新增.png) +3. 点击**保存**按钮,完成策略创建 +4. 系统提示"策略创建成功",返回策略列表 + +### 编辑策略 +1. 在策略列表中,勾选需要编辑的策略名称 +2. 点击**编辑**按钮,打开编辑策略对话框 +3. 修改需要更新的信息(如同步周期、同步字段等) +4. 点击**保存**按钮,完成策略更新 +5. 系统提示"策略更新成功",返回策略列表 +![同步器管理](../../../../static/images/adminster/配置管理/同步器管理-编辑策略.png) + + +### 同步策略 +1. 在策略列表中,勾选需要同步的策略名称 +2. 点击**同步**按钮 +3. 系统弹出确认对话框,提示"确定要同步选中的策略吗?" +4. 点击**确定**按钮,系统开始执行同步操作 +5. 同步过程中,状态列会显示"同步中" +6. 同步完成后,状态列更新为"同步成功",并提示"策略同步成功" +### 属性映射 +1. 可以进行属性映射,将源应用的字段映射到目标应用的字段。 +![同步器管理](../../../../static/images/adminster/配置管理/同步器管理-属性映射.png) +2. 可以编辑属性映射 +![同步器管理](../../../../static/images/adminster/配置管理/属性映射-编辑.png) + + +### 删除策略 +1. 在策略列表中,勾选需要删除的策略名称 +2. 点击**删除**按钮 +3. 系统弹出确认对话框,提示"确定要删除选中的策略吗?删除后不可恢复!" +4. 点击**确定**按钮,系统执行删除操作 +5. 系统提示"策略删除成功",策略从列表中移除 + +![同步器管理](../../../../static/images/adminster/配置管理/删除策略.png) +## 注意事项 +1. 同步操作可能会影响关联应用的数据,请谨慎执行 +2. 增量同步仅同步上次同步后变更的数据,全量同步会覆盖目标应用的对应数据 +3. 删除策略前,请确保该策略不再被其他功能依赖 +4. 同步周期设置过短可能会增加系统负担,建议根据实际业务需求合理设置 + +## 常见问题解答 +### Q1: 同步失败怎么办? +A1: 同步失败后,状态列会显示"同步失败",点击状态可查看失败原因。常见原因包括网络连接问题、目标应用权限不足或数据格式不匹配。解决问题后,可重新执行同步操作。 + +### Q2: 如何查看同步历史记录? +A2: 点击策略名称右侧的"历史"按钮,可查看该策略的同步历史记录,包括同步时间、同步状态、同步数据量等信息。 + +### Q3: 可以同时同步多个策略吗? +A3: 可以,在策略列表中勾选多个策略,然后点击**同步**按钮即可同时同步多个策略。 + \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/密码策略.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/密码策略.md new file mode 100644 index 000000000..9c3212c38 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/密码策略.md @@ -0,0 +1,11 @@ +--- +layout: zh/default +title: 密码策略 +sidebar_position: 9 +--- + +# 密码策略 + +## 概述 +密码策略是指对系统管理员账户密码的管理和控制机制,用于确保密码的强度、有效期和使用安全。 +![密码策略](../../../../static/images/adminster/配置管理/密码策略.png) diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/机构配置.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/机构配置.md new file mode 100644 index 000000000..f359303df --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/机构配置.md @@ -0,0 +1,8 @@ +--- +layout: zh/default +title: 机构配置 +sidebar_position: 1 +--- +管理员可以Maxkey单点登录认证系统的一些要素进行管理,具体如下: +![机构配置](../../../../static/images/adminster/配置管理/机构配置.png) + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/电子邮箱.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/电子邮箱.md new file mode 100644 index 000000000..4d843e1a7 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/电子邮箱.md @@ -0,0 +1,8 @@ +--- +layout: zh/default +title: 电子邮箱配置 +sidebar_position: 7 +--- + 在电子邮箱配置管理界面,可以对电子邮箱做相关账号修改、启用、地址、编码、端口等要素配置操作。 + +![电子邮箱配置](../../../../static/images/adminster/配置管理/电子邮箱.png) diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/短信服务.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/短信服务.md new file mode 100644 index 000000000..5f6970ce8 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/短信服务.md @@ -0,0 +1,25 @@ +--- +layout: zh/default +title: 短信服务 +sidebar_position: 8 +--- + +# 短信服务 + +## 概述 +短信服务是一种通过短信消息进行通信的服务,可用于验证用户身份、发送通知等场景。在MaxKey系统中,短信服务配置管理界面提供了对短信服务的相关配置操作。 +![短信服务配置](../../../../static/images/adminster/配置管理/短信服务.png) +## 配置说明 +短信服务配置管理界面提供了对短信服务的相关配置操作,包括: +- 短信服务名称 +- 短信服务类型 +- 短信服务账号 +- 短信服务密码 +- 短信服务端口 +- 短信服务编码 +- 短信服务地址 +- 短信服务协议 +- 短信服务状态 +- 短信服务创建时间 +- 短信服务更新时间 +- 短信服务备注 diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/社交服务.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/社交服务.md new file mode 100644 index 000000000..d1fc6c951 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/社交服务.md @@ -0,0 +1,20 @@ +--- +layout: zh/default +title: 社交服务 +sidebar_position: 5 +--- + +在账号策略管理界面,可以对策略做查询、新增、编辑、删除操作,一般情况只进行编辑操作,新增需要做响应的代码适配。 + +![社交服务](../../../../static/images/adminster/配置管理/社交服务.png) +点击“查询”按钮,输入“微信”,可查询如下信息: +![社交服务查询](../../../../static/images/adminster/配置管理/社交服务-查询.png) + +勾选一策略名称,点击“编辑”按钮,可编辑应用下对应的服务信息。具体操作如下: +![社交服务编辑](../../../../static/images/adminster/配置管理/社交服务-编辑.png) +点击“新增”按钮,新增一个社交服务,具体操作如下: +![社交服务新增](../../../../static/images/adminster/配置管理/社交服务-新增.png) + + + + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/账号管理.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/账号管理.md new file mode 100644 index 000000000..6e80b156e --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/账号管理.md @@ -0,0 +1,65 @@ +--- +layout: zh/default +title: 账号管理 +sidebar_position: 2 +--- + +# 账号管理 + +## 概述 +账号管理模块用于管理系统与各类应用之间的账号映射关系,支持账号的查询、新增和删除操作。通过该模块,管理员可以集中管理用户在不同应用系统中的账号信息,实现统一身份认证和授权。 + +## 访问路径 +1. 登录系统管理端 +2. 在左侧导航栏中依次点击 **配置管理** → **账号管理**,进入账号管理主界面 + +![账号管理](../../../../static/images/adminster/配置管理/账号管理.png) + +## 界面说明 +账号管理主界面主要包含以下功能区域: +- **应用选择区**:通过"选择"按钮选择关联的应用系统 +- **查询条件区**:包含应用名称输入框和账号查询输入框 +- **操作按钮区**:包含"查询"、"新增"等功能按钮 +- **账号列表区**:展示查询结果,支持批量选择和操作 + +## 功能操作 + +### 查询账号 +1. 在账号管理主界面点击 **选择** 按钮,弹出应用系统选择页面 +2. 在应用系统选择页面勾选需要查询的应用名称,点击 **确定** 按钮 +3. 应用名称会反显到应用名称输入框中 +4. 在查询输入框中输入需要查询的账号信息 +5. 点击 **查询** 按钮,系统会显示该应用下对应的账号信息 +根据用户名查询结果,可进行如下操作: +![账号管理查询](../../../../static/images/adminster/配置管理/账号管理-查询用户名.png) +根据应用名查询结果,可进行如下操作: +![账号管理查询](../../../../static/images/adminster/配置管理/账号管理-根据应用管理.png) + + + +### 新增账号 +1. 在账号管理主界面点击 **新增** 按钮,跳转弹出账号信息填写界面 +2. 填写账号基本信息: + - **应用名称**:已默认选中,无需修改 + - **登录账号**:点击"请选择",弹出用户信息选择框 + - 在用户信息选择框中勾选需要关联的用户 + - 点击 **确定** 后,登录账号和用户名将自动反显 + - **策略名称**:点击"请选择",弹出策略信息选择框 + - 在策略信息选择框中勾选需要应用的策略 + - 点击 **确定** 后,策略名称会自动反显 + - **应用账号**:手动输入应用系统中的账号 + - **应用密码**:点击 **生成** 按钮,系统会自动生成密码 +![账号管理新增](../../../../static/images/adminster/配置管理/账号管理-新增账号.png) +3. 确认所有信息填写完善后,点击 **提交保存** 按钮 +4. 系统提示"保存成功",完成账号添加 + + +### 删除账号 +1. 在账号管理主界面,通过查询功能找到需要删除的账号 +2. 在账号列表中勾选需要删除的账号(可多选) +3. 点击列表上方的 **删除** 按钮 +4. 在确认对话框中点击 **确定** 按钮 +5. 系统提示"删除成功",完成账号删除 +![账号管理删除](../../../../static/images/adminster/配置管理/账号管理-删除与批量删除.png) +> **注意**:删除账号操作不可逆,请确保删除前已确认账号信息不再需要 + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/连接器管理.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/连接器管理.md new file mode 100644 index 000000000..eb211de78 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/administer/配置管理/连接器管理.md @@ -0,0 +1,10 @@ +--- +layout: zh/default +title: 连接器管理 +sidebar_position: 4 +--- + +# 连接器管理 +对系统的连接器进行配置,包括了新增、修改和删除的基本操作。 + +![连接器管理新增](../../../../static/images/adminster/配置管理/连接器管理.png) diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/_category_.json new file mode 100644 index 000000000..06ccd0d68 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "认证端", + "position":1, + "link": { + "type": "generated-index", + "description": "认证端" + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/个人配置.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/个人配置.md new file mode 100644 index 000000000..f190b6407 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/个人配置.md @@ -0,0 +1,205 @@ +--- +layout: zh/default +title: 个人配置 +sidebar_position: 8 +--- + +# 个人配置 + +个人配置模块允许用户自定义个人信息、安全设置和偏好选项,打造个性化的使用体验。 + +## 访问个人中心 + +登录MaxKey系统后,通过以下方式进入个人配置页面: + +1. 点击页面右上角的头像图标 +2. 在下拉菜单中选择**个人中心** +3. 进入个人配置页面,包含以下功能标签页: + - 个人信息 + - 安全设置 + - 登录偏好 + - 通知设置 + - 应用管理 + + + +## 个人信息管理 + +### 基本资料维护 + +在**个人信息**标签页,您可以查看和修改个人基本信息: + +1. **基本信息**: + - 用户名(不可修改) + - 姓名、昵称 + - 电子邮箱 + - 联系电话 + - 所属部门 + +2. **个人头像**: + - 点击头像区域上传新头像 + - 支持JPG、PNG格式,建议尺寸200×200像素 + - 可拖动裁剪头像区域 + +3. **保存修改**: + - 点击**保存**按钮应用修改 + - 邮箱和手机号修改需要验证 + + + +### 个人资料隐私设置 + +控制个人信息的可见范围: + +- **公开信息**:所有用户可见(姓名、部门) +- **受限信息**:仅管理员和自己可见(联系方式) +- **私密信息**:仅自己可见(个人备注) + +配置路径:个人中心 → 个人信息 → 隐私设置 + +## 安全设置 + +### 密码修改 + +定期修改密码是保障账号安全的重要措施: + +1. 进入**安全设置**标签页 +2. 在**密码修改**区域: + - 输入当前密码 + - 设置并确认新密码 + - 新密码需满足系统密码策略要求 +3. 点击**保存**完成修改 +4. 系统会发送密码修改通知到您的邮箱 + +> **提示**:建议每90天更换一次密码,避免使用与其他网站相同的密码 + +### 双因素认证(2FA) + +启用双因素认证可大幅提高账号安全性: + +#### 绑定手机验证 +1. 在**安全设置** → **双因素认证**区域 +2. 点击**绑定手机**按钮 +3. 输入手机号并获取验证码 +4. 输入验证码完成绑定 +5. 启用**登录时需要手机验证**选项 + +#### 绑定认证器应用 +1. 选择**认证器应用**方式 +2. 使用Google Authenticator或企业微信扫码 +3. 扫描二维码或手动输入密钥 +4. 输入认证器生成的6位验证码 +5. 完成绑定并启用 + + + +### 登录设备管理 + +查看和管理所有登录过当前账号的设备: + +1. 进入**安全设置** → **登录设备** +2. 查看设备列表,包括: + - 设备名称、型号 + - 登录IP地址、地理位置 + - 最近登录时间 + - 客户端信息 +3. 对可疑设备点击**移除**按钮强制登出 +4. 可设置**常用设备**,减少验证频率 + +## 登录偏好设置 + +### 登录方式设置 + +自定义您偏好的登录方式: + +1. 进入**登录偏好**标签页 +2. 在**默认登录方式**中选择常用登录方式: + - 账号密码登录 + - 扫码登录 + - 手机验证码登录 +3. 设置**自动登录**选项(谨慎使用): + - 公共设备:不建议启用 + - 个人设备:可设置7天内自动登录 +4. 配置**语言偏好**: + - 界面语言:中文/英文 + - 日期格式:YYYY-MM-DD/MM/DD/YYYY + +### 个性化主题 + +自定义系统界面主题: + +1. 在**登录偏好** → **主题设置** +2. 选择预设主题: + - 浅色主题(默认) + - 深色主题 + - 蓝色主题 + - 绿色主题 +3. 自定义导航栏位置: + - 顶部导航(默认) + - 左侧导航 + + + +## 通知设置 + +配置您希望接收的系统通知类型和方式: + +### 通知方式 + +1. **通知渠道**: + - 系统内通知 + - 电子邮件通知 + - 手机短信通知(重要事项) + +2. **通知类型**: + - 账号安全通知(强制启用) + - 登录异常通知(强制启用) + - 密码过期提醒 + - 应用授权通知 + - 系统公告 + - 活动提醒 + +配置路径:个人中心 → 通知设置 → 通知订阅 + +## 个人应用管理 + +### 我的授权应用 + +查看和管理已授权访问的应用: + +1. 进入**应用管理**标签页 +2. 查看通过MaxKey单点登录的应用列表: + - 应用名称、图标 + - 授权时间 + - 最近访问时间 + - 授权状态 +3. 对不再需要的应用点击**取消授权** + +### 应用收藏 + +将常用应用添加到收藏夹,方便快速访问: +1. 在**应用管理** → **应用收藏** +2. 点击应用卡片上的**收藏**图标 +3. 收藏的应用会显示在个人中心首页 +4. 可拖动调整应用顺序 + + + +## 常见问题 + +### 如何找回个人中心密码? +个人中心密码与登录密码一致,如忘记密码,请通过登录页面的**忘记密码**功能重置 + +### 修改邮箱后收不到验证邮件怎么办? +1. 检查垃圾邮件文件夹 +2. 确认邮箱地址输入正确 +3. 点击**重新发送验证邮件** +4. 如仍无法接收,请联系管理员协助 + +### 如何取消双因素认证? +1. 进入**安全设置** → **双因素认证** +2. 点击已启用认证方式后的**关闭**按钮 +3. 验证当前身份(可能需要短信或邮箱验证) +4. 确认关闭双因素认证 + +> **安全提示**:关闭双因素认证会降低账号安全性,建议保持启用状态 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/忘记密码.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/忘记密码.md new file mode 100644 index 000000000..554deffbf --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/忘记密码.md @@ -0,0 +1,75 @@ +--- +layout: zh/default +title: 忘记密码 +sidebar_position: 6 +--- + +# 忘记密码 + +当您忘记MaxKey系统登录密码时,可以通过以下几种方式重置密码: + +## 自助密码重置 + +### 通过邮箱重置 + +1. 在登录页面点击**忘记密码**链接 +![忘记密码](../../../static/images/authentication/忘记密码/忘记密码.png) + +2. 在密码重置页面选择**邮箱验证**方式 +3. 输入您的用户名和注册邮箱 +4. 点击**发送验证码**按钮 +5. 查收来自系统的密码重置邮件(通常在5分钟内送达) +6. 点击邮件中的重置链接(24小时内有效) +7. 在密码重置页面设置新密码 + - 密码长度至少8位 + - 必须包含大小写字母、数字和特殊符号 + - 不能使用最近5次使用过的密码 +8. 确认新密码并提交 +9. 使用新密码登录系统 +![邮箱重置](../../../static/images/authentication/忘记密码/邮箱重置.png) + + +### 通过手机短信重置 + +1. 在登录页面点击**忘记密码**链接 +2. 选择**手机找回**方式 +3. 输入注册手机号 +4. 点击**获取验证码**按钮 +5. 输入收到的短信验证码 +6. 验证通过后设置新密码 +7. 确认新密码并完成重置 +![手机重置](../../../static/images/authentication/忘记密码/手机重置.png) + +> **注意**:手机短信验证码有效期为10分钟,每个手机号每天最多获取5次验证码 + + + + + +## 密码重置常见问题 + +### 未收到重置邮件怎么办? +1. 检查垃圾邮件/促销邮件文件夹 +2. 确认使用的邮箱是注册时填写的邮箱 +3. 联系管理员核实邮箱是否正确 +4. 尝试使用其他重置方式(如手机短信) + +### 重置链接无效或已过期? +1. 链接有效期为24小时,请重新申请密码重置 +2. 确保您使用的是最新收到的重置邮件 +3. 检查是否在多个设备上同时打开了重置链接 + +### 新密码设置提示不符合要求? +MaxKey密码策略要求: +- 长度至少8位,最长64位 +- 必须包含大写字母、小写字母、数字和特殊符号 +- 不能包含用户名或邮箱信息 +- 不能使用连续字符(如123456)或重复字符(如aaaaaa) + +### 重置后仍然无法登录? +1. 确认您输入的是新设置的密码 +2. 检查Caps Lock键是否开启 +3. 清除浏览器缓存后重试 +4. 确认账号未被锁定(连续失败5次登录会触发锁定) + + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/登录管理.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/登录管理.md new file mode 100644 index 000000000..607268812 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/登录管理.md @@ -0,0 +1,141 @@ +--- +layout: zh/default +title: 用户登录 +sidebar_position: 2 +--- + +# 用户登录 + +本文档介绍如何使用MaxKey系统的各种登录方式及常见问题处理。 + +## 登录入口 +(前提:已安装并启动MaxKey系统) +1. 通过浏览器访问系统登录页面:`https://your-maxkey-domain/login` +2. 或通过企业门户点击"单点登录"按钮进入 +![登录入口](../../../static/images/authentication/登录管理/登录入口.png) + +## 登录方式 + +### 账号密码登录 + +1. 在登录页面输入**用户名**、**密码**、**验证码** +2. (可选)勾选"记住我"可保持30天内免登录 +3. 点击**登录**按钮 + +> **安全提示**:公共设备请不要勾选"记住我" + +### 扫码登录 + +1. 点击登录页面的**扫码登录**选项卡 +2. 打开企业移动应用扫描页面二维码 +3. 在手机端确认登录 +![扫码登录](../../../static/images/authentication/登录管理/扫码登录.png) + + +### 其他方式登录 +为了方便用户的登录,可以通过第三方的账号(例如新浪微博、微信、钉钉等)登录MaxKey,简单配置即可实现用户登录。 + +1. 点击登录页面底部的社交账号图标(企业微信/钉钉/Microsoft/Facebook/飞书) +2. 在跳转页面完成账号授权 +3. 授权成功后自动登录系统 +![其他登录](../../../static/images/authentication/登录管理/其他登录.png) + +本文以新浪微博为例 + + + +

登录流程

+ +![authn_s](/images/authn/authn_s.png) + +## 第三方认证配置 +在新浪微博开放平台https://open.weibo.com/申请接入,新浪配置如下 + +![authn_s_2](/images/authn/authn_s_2.png) + +![authn_s_3](/images/authn/authn_s_3.png) + +## 认证配置 +文件启用第三方登录启用 +maxkey/application-https(http).properties + +

+#enable social sign on
+maxkey.login.socialsignon=true
+
+ +## 后台参数配置 + +后台管理 -> "配置管理" ->"社交服务" +![authn_sa_1](../../../static/images/adminster/配置管理/社交服务.png) + +选中 "微博" -> "编辑" ,微博的app key和app secret填入凭证和密钥 + +![authn_sa_2](../../../static/images/adminster/配置管理/社交服务-微博.png) + +## 账号绑定 +登录MaxKey,并绑定新浪微博账号 + +![authn_s_4](../../../static/images/adminster/配置管理/客户端绑定微博.png) + +## 登录测试 + +退出后,进入登录界面,点击新浪微博图标,跳转到新浪微博,输入用户名和密码后,直接登录MaxKey,即MaxKey信任了微博账号, +## 第三方支持 + +MaxKey使用JustAuth作为第三方OAuth2登录认证库,认证所支持的第三方,请见JustAuth官方说明 + + + + +## 登录设置 + +### 语言切换 +点击登录页面右上角语言选择器,可切换: +- 简体中文 +- 繁体中文 +- English +![语言切换](../../../static/images/authentication/登录管理/语言切换.png) + + +### 记住登录状态 +- 勾选"记住我"后,系统会在本地保存登录状态30天 +- 公共电脑建议不要使用此功能 +- 可在个人中心随时清除登录状态 +![记住登录](../../../static/images/authentication/登录管理/记住登录.png) + +## 登录完成 +登录成功后,系统会自动跳转到首页页面。 +![登录完成](../../../static/images/authentication/登录管理/登录完成.png) + +## 常见问题 + +### 忘记密码 +1. 在登录页面点击**忘记密码**链接 +2. 输入手机号/邮箱 +3. 选择验证方式(手机号/邮箱) +4. 接收验证码并设置新密码 +详见[忘记密码](../authentication/忘记密码.md) +### 账号被锁定 +- 连续登录失败6次将锁定30分钟. +- 可等待自动解锁或联系管理员手动解锁 + + +### 登录后自动退出 +可能原因及解决方法: +1. 会话超时:活动时间超过30分钟,请重新登录 +2. 账号在其他设备登录:系统默认允许3个并发会话 +3. 网络异常:检查网络连接稳定性 + +### 无法接收验证码 +1. 检查手机号/邮箱是否正确且已验证 +2. 检查垃圾邮件/短信文件夹 +3. 60秒后可重新获取验证码 +4. 联系管理员检查消息服务状态 + +## 安全提示 + +- 请勿向他人泄露账号密码 +- 定期更换密码(建议每90天) +- 登录异常时及时修改密码并联系管理员 +- 退出登录时使用页面**安全退出**按钮 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/页面配置.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/页面配置.md new file mode 100644 index 000000000..4f8c4b551 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/页面配置.md @@ -0,0 +1,85 @@ +--- +layout: zh/default +title: 页面配置指南 +sidebar_position: 8 +--- + +# 页面配置指南 + +系统右上角的齿轮图标提供了多种页面相关的配置功能,点击后将显示配置菜单。 +![页面](../../../static/images/authentication/页面配置/首页.png) + + +## 配置菜单功能说明 + +### 密码修改 +1. 在配置菜单中点击**密码修改**选项 +2. 输入当前密码 +3. 设置并确认新密码(需符合密码复杂度要求) +4. 点击**保存**完成修改 + +> **注意**:密码修改后需重新登录系统 + +### RTL布局切换 +RTL(Right-to-Left)布局功能可将界面切换为从右到左的显示模式,适用于阿拉伯语、希伯来语等语言环境: + +1. 在配置菜单中点击**RTL**选项 +2. 系统界面将立即切换为从右到左布局 +3. 再次点击可恢复默认的从左到右布局 + +#### 切换效果对比 + +| 从左到右布局(默认) | 从右到左布局(RTL) | +|---------------------|---------------------| +| 菜单在左侧,内容在右侧 | 菜单在右侧,内容在左侧 | +| 文字从左到右排列 | 文字从右到左排列 | +| 按钮在右侧 | 按钮在左侧 | + + + +![左右屏切换](../../../static/images/authentication/页面配置/左右屏切换.png) + + +### 全屏模式 +1. 在配置菜单中点击**全屏**选项 +2. 系统将切换至全屏显示模式 +3. 退出全屏可按键盘**ESC**键,或再次点击配置菜单中的**退出全屏**选项 +> **提示**:部分浏览器可能需要授权全屏显示权限 +![全屏模式](../../../static/images/authentication/页面配置/全屏模式.png) + +### 清理本地缓存 +清理本地缓存将删除浏览器中存储的临时数据,包括: +- 登录状态信息 +- 表单自动填充数据 +- 页面缓存资源 + +操作步骤: +1. 在配置菜单中点击**清理本地缓存**选项 +2. 在确认对话框中点击**确定** +3. 系统清理完成后将自动刷新页面 + +> **注意**:清理缓存后需重新登录系统 + +### 语言设置 +1. 在配置菜单中点击**语言**选项 +2. 从下拉列表中选择所需语言 +3. 页面将立即切换为所选语言 + +#### 支持的语言 +- 简体中文 +- 繁体中文 +- English + + + + +## 常见问题 + +### Q: RTL切换后部分界面显示异常怎么办? +A: 可尝试刷新页面(F5)或切换回默认布局后重新切换 + +### Q: 清理缓存后无法登录怎么办? +A: 请确认使用正确的账号密码,或通过"忘记密码"功能重置密码 + +### Q: 全屏模式下看不到配置菜单怎么办? +A: 将鼠标移动到屏幕顶部,菜单栏会自动显示 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/首页功能介绍/会话.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/首页功能介绍/会话.md new file mode 100644 index 000000000..435caec4a --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/首页功能介绍/会话.md @@ -0,0 +1,71 @@ +--- +layout: zh/default +title: 会话管理 +sidebar_position: 2 +--- +# 会话 + +## 功能概述 +会话管理模块允许用户查看和管理当前活跃的登录会话,包括查询会话信息和终止特定会话。通过此功能,用户可以监控账户的登录状态,及时发现异常访问并采取安全措施。 + +## 访问路径 +登录MaxKey系统后,点击顶部导航栏的**会话** + + +## 界面说明 +会话管理界面主要包含以下元素: +- **查询区域**:提供多种筛选条件 +- **会话列表**:展示符合条件的会话信息 +- **操作按钮**:对选中的会话执行终止操作 +![会话管理](../../../../static/images/authentication/会话管理.png) + +## 会话查询 +### 基本查询 +用户可以直接查看当前所有活跃会话,列表默认显示以下信息: +- **会话ID**:系统分配的唯一会话标识 +- **登录名**:用户登录账号 +- **用户名称**:用户姓名全称 +- **访问地址**:登录IP地址 +- **归属地**:IP地址对应的地理位置 +- **浏览器**:登录使用的浏览器及版本 +- **平台**:登录设备的操作系统 +- **登录时间**:会话创建的时间 +- **会话状态**:当前会话状态(活跃/即将过期/已过期) +- **最后活动时间**:会话最近一次交互的时间 + +#### 会话列表示例 + +| 会话ID | 登录名 | 用户名称 | 访问地址 | 归属地 | 浏览器 | 平台 | 登录时间 | 会话状态 | 最后活动时间 | +|--------|--------|----------|----------|--------|--------|------|----------|----------|--------------| +| 1144374097015209984 | admin | 系统管理员 | 0:0:0:0:0:0:0:1 | local | Firefox/140 | Windows NT 10.0 | 2025-07-20 18:15:11 | 活跃 | 2025-07-20 18:30:25 | + + + +## 终止会话 +### 单个会话终止 +1. 在会话列表中,找到需要终止的会话 +2. 点击对应行操作列的**终止**按钮 +3. 在确认弹窗中点击**确定**完成操作 + +### 批量终止会话 +1. 勾选多个需要终止的会话前的复选框 +2. 点击列表上方的**批量终止**按钮 +3. 在确认弹窗中点击**确定**完成操作 + +> **注意**:终止当前正在使用的会话将导致立即退出登录,请谨慎操作。 + +## 常见问题 +### Q: 为什么有些会话显示异常登录地点? +A: 这可能是由于IP地址定位不准确导致的,建议重点关注登录时间和设备信息是否异常。 + +### Q: 终止会话后,被终止的设备还能访问系统吗? +A: 不能,终止会话后,对应的设备将失去访问权限,需要重新登录。 + +### Q: 会话列表中没有显示我当前的登录会话? +A: 请尝试点击**刷新**按钮更新会话列表,或检查筛选条件是否过滤了当前会话。 + +### Q: 最多可以同时查看多少条会话记录? +A: 系统默认显示最近100条会话记录,如需查看更早的记录,请使用时间范围筛选。 + +### Q: 会话ID有什么作用? +A: 会话ID是系统识别会话的唯一标识,联系管理员排查登录问题时,提供会话ID可以快速定位问题。 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/首页功能介绍/审计.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/首页功能介绍/审计.md new file mode 100644 index 000000000..d36ce3f06 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/首页功能介绍/审计.md @@ -0,0 +1,78 @@ +--- +layout: zh/default +title: 审计日志查询 +sidebar_position: 4 +--- + +# 审计 + +审计模块提供系统操作记录的查询功能,帮助用户追踪账号活动和系统访问情况。 + +## 系统登录日志 + +系统登录日志记录所有用户的登录活动,提供全面的安全审计依据。 + +### 访问入口 +点击顶部导航栏的**审计** → **系统登录日志** + +### 日志信息说明 +登录日志表格展示以下信息: + +| 字段名称 | 说明 | 示例 | +|---------|------|------| +| 会话ID | 系统生成的唯一会话标识 | SID-20230915-123456 | +| 登录名 | 用户登录账号 | user001 | +| 用户名称 | 用户真实姓名 | 张三 | +| 登录状态 | 成功/失败 | 成功 | +| 登录方式 | 账号密码/扫码/短信/社交账号等 | 账号密码 | +| 访问地址 | 用户IP地址 | 192.168.1.100 | +| 归属地 | 访问IP地址对应的位置 | local | +| 浏览器 | 用户使用的浏览器及版本 | Chrome 116.0.5845.180 | +| 平台 | 操作系统及设备类型 | Windows 10 / PC | +| 登录时间 | 登录成功的时间 | 2023-09-15 08:30:25 | +| 退出时间 | 主动退出或超时退出时间 | 2023-09-15 12:05:10 | + +![登录](../../../../static/images/authentication/功能使用说明/配置/审计/登录.png) + + +### 日志筛选 + + **时间范围筛选**: + - 点击页面顶部的**开始时间**和**结束时间**选择框 + - 选择需要查询的时间范围(支持精确到分钟) + - 点击**查询**按钮应用筛选 + + +## 访问日志 + +应用访问日志记录用户通过单点登录访问各应用系统的详细信息。 + +### 访问入口 +点击顶部导航栏的**审计** → **应用访问日志** + +### 日志信息说明 +访问日志表格展示以下信息: + +| 字段名称 | 说明 | 示例 | +|---------|------|------| +| 会话ID | 与登录日志关联的会话标识 | SID-20230915-123456 | +| 登录名 | 用户登录账号 | user001 | +| 用户名称 | 用户真实姓名 | 张三 | +| 应用名称 | 应用系统名称 | 企业资源计划系统 | +| 登录时间 | 访问应用的时间 | 2023-09-15 09:15:30 | + +### 日志筛选 + +1. **基础筛选**: + - 开始时间/结束时间:选择查询的时间范围 + - 应用名称:下拉选择特定应用(默认全部) + + + +## 常见问题 + +### Q: 为什么某些日志记录没有退出时间? +A: 可能原因包括:用户直接关闭浏览器、网络异常断开连接、系统崩溃等。系统会在会话超时后自动标记为"超时退出" + +### Q: 导出日志时提示权限不足怎么办? +A: 日志导出功能需要"审计日志导出"权限,请联系管理员为您的账号分配相应权限 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/首页功能介绍/应用.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/首页功能介绍/应用.md new file mode 100644 index 000000000..fba32c828 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/首页功能介绍/应用.md @@ -0,0 +1,60 @@ +--- +layout: zh/default +title: 应用访问中心 +sidebar_position: 1 +--- + + +# 应用访问中心 + +## 功能概述 +应用访问中心是用户获取和访问所有已授权应用系统的统一入口。通过单点登录(SSO)技术,用户只需一次身份验证,即可无缝访问多个授权应用,无需重复登录,提升工作效率与用户体验。 + +## 访问路径 +1. 成功登录MaxKey系统后,系统默认展示应用访问中心界面 +2. 或点击顶部导航栏的**应用**图标进入 +![应用访问中心](../../../../static/images/authentication/应用访问中心.png) + + +## 界面说明 +应用访问中心主要包含以下功能区域: + +### 1. 页面导航区 +- **搜索框**:支持按应用名称**所在标签**搜索 +- **分类标签**:按应用类型进行分类筛选(如企业服务、团队协作、人力资源、考试培训、财务管理、表单流程、供应链、客户关系等) +- **刷新按钮**:手动刷新应用列表 + +### 2. 应用展示区 +- **应用卡片**:显示应用图标、名称及简要描述 + + +## 应用访问操作 + +### 1. 基本访问流程 +1. 在应用展示区找到目标应用 +2. 点击应用图标或名称 +3. 系统将自动完成单点登录并跳转至应用系统 + +### 2. 搜索与筛选 +- **快速搜索**:在顶部搜索框输入应用名称关键词标签,系统实时筛选结果 +- **分类筛选**:点击分类标签,只显示该分类下的应用 + + + +## 常见问题 + +### Q: 点击应用图标后没有反应怎么办? +A: 请尝试以下解决方案: +1. 检查浏览器地址栏是否有弹出窗口阻止提示,允许弹出窗口 +2. 清除浏览器缓存后重试 +3. 确认应用状态是否为"正常" +4. 联系管理员检查应用配置和用户权限 + +### Q: 为什么有些我有权限的应用没有显示在列表中? +A: 可能原因及解决方法: +1. 应用可能被归类到其他分类标签下,尝试切换分类查看 +2. 使用搜索功能直接搜索应用名称 +3. 新授权的应用可能需要刷新页面才能显示 +4. 联系管理员确认应用是否已发布到用户可见范围 + + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/首页功能介绍/配置.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/首页功能介绍/配置.md new file mode 100644 index 000000000..c110303e7 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/handbook/authentication/首页功能介绍/配置.md @@ -0,0 +1,145 @@ +--- +layout: zh/default +title: 个人配置管理 +sidebar_position: 3 +--- + +# 配置 + +## 3.7.1 我的资料 + +点击顶部导航栏的**配置**,进入**我的资料**界面。系统采用多标签页形式展示不同类别的个人信息,用户可根据需要查看或修改对应内容。 +![我的资料](../../../../static/images/authentication/功能使用说明/配置/我的资料.png) +### 基本信息标签页 +展示用户核心身份信息,包括: +- 用户ID(系统生成,不可修改) +- 用户名(登录账号,不可修改) +- 姓名(可修改) +- 邮箱(可修改,需验证) +- 手机号码(可修改,需验证) +- 头像(支持上传/拍摄更换) +- 性别(男/女/保密) +- 出生日期(日期选择器) +![基本信息](../../../../static/images/authentication/功能使用说明/配置/基本信息.png) + + +### 个人信息标签页 +补充个人详细信息: +- 学历(下拉选择:小学/初中/高中/专科/本科/硕士/博士) +- 专业(文本输入) +- 毕业院校(文本输入) +- 入职日期(系统自动记录,不可修改) +- 岗位名称(文本输入) +- 工号(系统生成,不可修改) +- 联系地址(文本输入) +- 紧急联系人(姓名+电话) +![个人信息](../../../../static/images/authentication/功能使用说明/配置/个人信息.png) +### 机构信息标签页 +显示用户所属组织架构信息: +- 所属单位(下拉选择,仅管理员可修改) +- 部门(下拉选择,仅管理员可修改) +- 科室/团队(文本输入) +- 职级(下拉选择:普通员工/主管/经理/总监/高管) +- 角色(系统分配,不可修改) +- 权限范围(只读展示) +![机构信息](../../../../static/images/authentication/功能使用说明/配置/机构信息.png) +### 机构扩展标签页 +扩展机构相关信息: +- 员工类型(正式/实习/外包/顾问) +- 政治面貌(群众/共青团员/中共党员/其他) +- 婚姻状况(未婚/已婚/离异/丧偶) +- 健康状况(良好/一般/较差) +- 合同期限(开始日期-结束日期) +- 社保公积金所在地(省市选择) +![机构扩展](../../../../static/images/authentication/功能使用说明/配置/机构扩展.png) + + +### 家庭信息标签页 +记录家庭成员信息: +- 配偶信息(姓名、关系、工作单位、联系电话) +- 子女信息(姓名、性别、出生日期、学校/工作单位) +- 父母信息(姓名、年龄、工作单位/退休状态、联系电话) +![家庭信息](../../../../static/images/authentication/功能使用说明/配置/家庭信息.png) +> **注意**:所有修改需点击各标签页底部的**保存**按钮生效,带*号的为必填项 + +## 3.7.2 密码修改 + +系统提供两种密码修改入口,用户可根据习惯选择: + +### 入口一:通过配置菜单 +1. 点击顶部导航栏的**配置** +2. 在下拉菜单中选择**密码修改** + +### 入口二:通过右上角快捷菜单 +1. 点击页面右上角的**齿轮图标** +2. 在弹出菜单中选择**密码修改** +![密码修改](../../../../static/images/authentication/功能使用说明/配置/密码修改.png) +### 修改步骤 +1. 在密码修改界面,输入**当前密码** +2. 设置**新密码**,需满足以下要求: + - 长度8-64位 + - 包含大小写字母、数字和特殊符号 + - 不能与最近5次使用过的密码相同 +3. 再次输入**确认新密码** +4. (可选)点击**自动生成**获取系统推荐的强密码 +5. 点击**保存**完成修改 + +> **安全提示**:密码修改成功后,所有已登录设备将被强制登出,需使用新密码重新登录 + +## 3.7.3 社交关联 + +通过社交关联功能,用户可将当前账号与第三方社交账号绑定,实现社交账号快捷登录。 + +### 操作入口 +点击顶部导航栏的**配置** → **社交关联** + +### 支持的社交平台 +![社交关联1](../../../../static/images/authentication/功能使用说明/配置/社交关联1.png) +![社交关联2](../../../../static/images/authentication/功能使用说明/配置/社交关联2.png) + +### 绑定账号流程 +1. 在社交关联页面,找到需要绑定的平台图标 +2. 点击**绑定账号**按钮 +3. 在跳转的第三方授权页面完成登录授权 +4. 授权成功后自动返回系统,显示"绑定成功" +![解绑社交](../../../../static/images/authentication/功能使用说明/配置/解绑社交.png) + +### 解除绑定流程 +1. 在社交关联页面,找到已绑定的平台 +2. 点击**解除绑定**按钮 +3. 在确认对话框中输入**当前密码**进行身份验证 +4. 点击**确认**完成解除绑定 + +> **提示**:至少保留一种可用的登录方式,避免所有登录方式均被解除绑定 + +## 3.7.4 时间令牌 + +时间令牌是一种基于TOTP/HOTP算法的双因素认证方式,提高账号登录安全性。 + +### 操作入口 +点击顶部导航栏的**配置** → **时间令牌** +![时间令牌](../../../../static/images/authentication/功能使用说明/配置/时间令牌.png) +### 生成与绑定步骤 +1. 在时间令牌页面,点击**生成**按钮 +2. 系统显示令牌参数配置: + - 算法:SHA1(默认) + - 位数:6位(默认) + - 周期:30秒(默认) + - 类型:TOTP(默认) +3. 点击**生成**后生成二维码和密钥 +4. 使用认证软件扫描二维码(支持Google Authenticator、Microsoft Authenticator、FreeOTP等) +5. 在手机认证软件中确认添加 +6. 在系统页面输入手机上显示的6位数字令牌 +7. 点击**验证**完成绑定 + +### 使用方法 +1. 在登录页面输入账号密码后,选择**安全认证** → **时间令牌** +2. 打开手机认证软件,获取当前6位数字令牌 +3. 输入令牌后完成登录 +![生成令牌](../../../../static/images/authentication/功能使用说明/配置/生成令牌.png) +### 注意事项 +- 令牌每30秒更新一次,过期后需使用新令牌 +- 建议同时保存备用密钥,以便手机丢失时恢复 +- 可点击**重新生成**更换令牌(原令牌将失效) + +> **安全建议**:启用时间令牌后,即使账号密码泄露,他人仍无法登录您的账号 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/im/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/im/_category_.json new file mode 100644 index 000000000..b55f98552 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/im/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "身份管理", + "position": 6, + "link": { + "type": "generated-index", + "description": "身份管理." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/im/connectors.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/im/connectors.md new file mode 100644 index 000000000..a927f208b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/im/connectors.md @@ -0,0 +1,96 @@ +--- +title: 身份连接器 +sidebar_position: 3 +--- +# 身份连接器 + +连接器把MaxKey的机构和账号同步到下游系统 + +## 连接器Connector + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
类型连接器官方地址
LDAPMicrosoft Active Directory
LDAPOpenLDAP
LDAPStandard LDAP Server
Instant Messenger企业微信
Instant Messenger钉钉
Instant Messenger飞书
Instant Messenger华为WeLink
SCIMSCIM 2
JDBClengleng/pig访问
JDBC若依/RuoYi访问
JDBC芋道源码/ruoyi-vue-pro访问
JDBC江离/Cloud-Platform访问
JDBCstylefeng/Guns访问
JDBCJEECG官方/jeecg-boot访问
JDBC小诺/Snowy访问
\ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/im/im.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/im/im.md new file mode 100644 index 000000000..6cd0d21a8 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/im/im.md @@ -0,0 +1,30 @@ +--- +title: 身份管理 +sidebar_position: 2 +--- +# 身份管理 + +## 身份管理是什么 +**帐户** + +计算机处理有关人的数据记录。此类记录包含为其创建和管理帐户的系统所需的技术信息。 + +**数字身份** + +由一个数字主体对其自身提出的一组主张的表现。 确认是你! + +您是否曾经被公司雇用,进入组织或刚刚创建了新的OA帐户?公司,组织和云实体使用需要您的数据才能正常运行的应用程序:用户名,密码,电子邮件,名字,姓氏等。 + +这些信息从哪里来?当需要启用更多应用程序时会发生什么?而且,如果您获得晋升并获得了已经可以访问的应用程序的更多权利该怎么办?最重要的是,当您退出或他们轻轻放开您时会发生什么? + +简而言之,身份管理在整个“ 身份生命周期”中负责管理身份数据 。 + + +![用户生命周期管理](/images/im/identityLifecycle.png) + +## 身份管理架构 + +基于**MQ(Message Queue消息中间件)**和MaxKey身份连接器(**Connector**)的管理架构 + +![身份管理架构](/images/im/maxkey_im.png) + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/im/mgt_ui.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/im/mgt_ui.md new file mode 100644 index 000000000..b35dc796f --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/im/mgt_ui.md @@ -0,0 +1,19 @@ +--- +title: 身份管理UI +sidebar_position: 1 +--- + +# 管理界面 + +## 实时报表 + + +![实时报表](/images/maxkey_mgt_rpt.png) + +## 用户管理 + +![用户管理](/images/maxkey_mgt_users.png) + +## 应用管理 + +![用户管理](/images/maxkey_mgt_apps.png) diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/_category_.json new file mode 100644 index 000000000..8d31fd889 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "安装部署", + "position": 4, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/deploy_baota.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/deploy_baota.md new file mode 100644 index 000000000..63082d3d7 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/deploy_baota.md @@ -0,0 +1,70 @@ +--- +title: 宝塔面板部署 +sidebar_position: 7 +--- + +## 宝塔简介 + +[宝塔服务器面板,一键全能部署及管理]( https://www.bt.cn/u/AjsXmi) 安全高效的服务器运维面板 + +![baota-docker](/images/install/baota/baota.png) + +## 前提 + +安装宝塔面板,前往[宝塔面板](https://www.bt.cn/u/AjsXmi)官网,选择对应的脚本下载安装。 + +宝塔版本 9.2.0+ + +## 宝塔面板一键部署MaxKey + +1. 登录宝塔面板,在菜单栏中点击 Docker,根据提示安装 Docker 和 Docker Compose 服务。 + +![baota-docker](/images/install/baota/baota-0.png) + +在宝塔面板安装 Docker 服务,若已有则跳过。 + +2. 在Docker-应用商店查询到 MaxKey,点击安装 + +![baota-maxkey-1](/images/install/baota/baota-1.png) + +3. 设置域名等基本信息,点击确定 + +![baota-maxkey-2](/images/install/baota/baota-2.png) + +名称:应用名称,默认maxkey-随机字符 + +版本选择:默认latest + +域名:如需通过域名直接访问,请在此配置域名并将域名解析到服务器 + +允许外部访问:如您需通过IP+Port直接访问,请勾选,如您已经设置了域名,请不要勾选此处 + +端口:默认 8088,可自行修改 + +提交后面板会自动进行应用初始化,大概需要1-5分钟,初始化完成后即可访问。 + +4. 安装过程中无法拉取镜像解决方案 + +配置docker加速 + +![baota-maxkey-docker](/images/install/baota/baota-docker.png) + + +## 访问 MaxKey + +如您设置了域名,请直接在浏览器地址栏中输入域名访问,如```http://demo.maxkey.top:8088/maxkey/#/passport/login``` ,即可访问 MaxKey 控制台。 + +如您选择了通过IP+Port访问,请在浏览器地址栏中输入域名访问 ```http://<宝塔面板IP>:8088/maxkey/#/passport/login```,即可访问 MaxKey 控制台。 + +![baota-maxkey-login](/images/install/baota/baota-maxkey.png) + +默认账号 admin + +默认密码 maxkey + +## 宝塔官方安装帮助 + +[【教程贴】Docker应用-MaxKey 安装帮助](https://www.bt.cn/bbs/forum.php?mod=viewthread&tid=139535) + + + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/deploy_docker.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/deploy_docker.md new file mode 100644 index 000000000..accccd594 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/deploy_docker.md @@ -0,0 +1,60 @@ +--- +title: Docker部署 +sidebar_position: 4 +--- +## 介绍 +Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。 + +本教程介绍在Docker中如何快速配置和部署MaxKey,在此之前请提前安装Docker + +MaxKey官方镜像仓库:访问 + +## Docker快速部署 +LINUX 7 基于Docker快速部署 + +1、上传Docker配置文件及相关脚本 + +把目录 + +https://gitee.com/dromara/MaxKey/tree/main/docker + +或者 + +https://github.com/dromara/MaxKey/tree/main/docker + +上传到/root目录下 + + +2、拉取docker镜像 + +```bash +./maxkey_docker_install.sh +``` + +3、启动maxkey docker + +```bash +./maxkey_docker_start.sh +``` + +## 应用访问 +应用访问 + +## Docker其他版本 + + + + + + + + + + + + + + + + +
环境贡献者地址
armzhaokait docker地址
\ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/deploy_docker_compose.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/deploy_docker_compose.md new file mode 100644 index 000000000..43bedeb1f --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/deploy_docker_compose.md @@ -0,0 +1,35 @@ +--- +title: Docker Compose部署 +sidebar_position: 3 +--- +## 介绍 +Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。 + +本教程介绍在Docker中如何快速配置和部署MaxKey,在此之前请提前安装Docker + +MaxKey官方镜像仓库:访问 + +## Docker Compose快速部署 +LINUX 7 基于Docker Compose快速部署 + +### 1、上传Docker配置文件 + +把目录 + +https://gitee.com/dromara/MaxKey/tree/main/docker + +或者 + +https://github.com/dromara/MaxKey/tree/main/docker + +上传到/root目录下 + + +### 2、启动MaxKey服务 + +```bash +docker-compose up --build -d +``` + +## 应用访问 +应用访问 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/deploy_linux.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/deploy_linux.md new file mode 100644 index 000000000..792c913db --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/deploy_linux.md @@ -0,0 +1,223 @@ +--- +title: LINUX部署 +sidebar_position: 2 +--- + +# LINUX 7 版本 + + +## JDK 安装 + +### 下载地址 + +Eclipse Temurin 8 x64 RPM Package + +假设当前安装目录/root + +```bash +curl -L "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.8.1%2B1/OpenJDK17U-jdk_x64_linux_hotspot_17.0.8.1_1.tar.gz" -H "Cookie: oraclelicense=accept-securebackup-cookie" -H "Connection: keep-alive" -O +``` + +### 解压缩及安装 + +```bash +tar -zxf OpenJDK17U-jdk_x64_linux_hotspot_17.0.8.1_1.tar.gz +``` + +完成后本地目录 + +``` +jdk-17.0.8.1+1 +``` + +## 安装配置MySQL 8.0 + +### 安装MySQL 8.0 +假如本地安装过mariadb,请先卸载 + +#### 安装MySQL官方的yum repository + +```bash +curl -L "https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm" -O +``` + +#### 下载rpm包: + +```bash +yum -y install mysql80-community-release-el7-3.noarch.rpm +``` + +#### 安装MySQL服务 + +```bash +yum -y install mysql-community-server +``` + +#### 安装MySQL问题 + +``` +Failing package is: mysql-community-libs-compat-8.0.28-1.el7.x86_64 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql +``` + +解决方案 + +```bash +rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 +``` + +### 调整配置 + +编辑 /etc/my.cnf 文件 + +```ini +character-set-server=utf8 +lower_case_table_names=1 +``` + +### 启动mysql服务 +```bash + systemctl start mysqld + + --停止 + + systemctl stop mysqld --无需执行 +``` + +### 登录MySQL + + 第一次启动MySQL后,就会有临时密码,这个默认的初始密码在/var/log/mysqld.log文件中,我们可以用这个命令来查看: + +```bash + grep "password" /var/log/mysqld.log +``` + +### 设置访问权限及密码 +```bash + +mysql -u root -p; + +输入密码 + +``` + +```sql +--以下步骤可能要求先修改初始化密码为复杂密码 SET PASSWORD = 'UDF(ez/8Lufi'; + +set global validate_password.policy=0; --改变密码等级 + +set global validate_password.length=4; --改变密码最小长度 + +SET PASSWORD = 'maxkey'; + +use mysql; + +alter user 'root'@'localhost' identified with mysql_native_password by 'maxkey'; + +flush privileges ; + +---修改root用户的访问权限为‘%’ + +update user set host='%' where user='root'; + +flush privileges ; + +``` + +### 设置开机启动 + +``` +chkconfig --add mysqld +chkconfig mysqld on +``` + +查看开机启动设置是否成功 + +``` + chkconfig --list | grep mysql* + + # mysqld 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭停止 +``` + + +## MaxKey安装 + +### 把MaxKey上传到Linux服务器 + +### 数据导入 + +MaxKey对应的版本SQL文件,参见 + +https://gitee.com/dromara/MaxKey/tree/main/sql + +登陆LINUX MYSQL并创建schema maxkey,字符集utf8,数据文件导入到maxkey schema中, + +```bash + +mysql -u root -p; + +输入密码 +``` + +```sql +CREATE DATABASE IF NOT EXISTS `maxkey` /*!40100 DEFAULT CHARACTER SET utf8 */ /*!80016 DEFAULT ENCRYPTION='N' */; + +USE `maxkey`; + +-- 使用source命令,后面参数为脚本文件(如这里用到的.sql),其中v4.0.5.ga是对应的版本号 + +source your sql path/maxkey.sql; + +source your sql path/maxkey_data.sql + +``` + + +### 配置hosts + +hosts配置文件目录 + +``` +vi /etc/hosts +``` + +新增如下内容 + +``` +127.0.0.1 sso.maxkey.top +127.0.0.1 mgt.maxkey.top +127.0.0.1 tokenbased.demo.maxkey.top +127.0.0.1 cas.demo.maxkey.top +127.0.0.1 oauth.demo.maxkey.top +``` + +### 启动 + +修改set_maxkey_env.sh以下参数,/root/为安装路径 + +```bash +JAVA_HOME=/root/jdk-17.0.8.1+1 + +export JAVA_HOME=/root/jdk-17.0.8.1+1 +``` + + +```bash + ./start_maxkey_db.sh & #自行编写 + + ./start_maxkey.sh & + + ./start_maxkey_mgt.sh & + + ./start_maxkey_demo.sh & +``` + +## 前端服务部署 + +安装nginx,参考windows版本配置,再把windows版本前端文件放入对应的nginx目录下 + +## 代理服务部署 + +安装nginx,参考windows版本的代理配置 + +## 应用访问 +应用访问 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/deploy_rainbond.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/deploy_rainbond.md new file mode 100644 index 000000000..796a6ce51 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/deploy_rainbond.md @@ -0,0 +1,72 @@ +--- +title: Rainbond部署 +sidebar_position: 6 +--- + +## Rainbond简介 + +[Rainbond](https://github.com/goodrain/rainbond) 是云原生且易用的云原生应用管理平台。云原生应用交付的最佳实践,简单易用。专注于以应用为中心的理念。赋能企业搭建云原生开发云、云原生交付云。 + +**对于企业:** Rainbond 是开箱即用的云原生平台,借助 Rainbond 可以快速完成企业研发和交付体系的云原生转型。 + +**对于开发者:** 基于 Rainbond 开发、测试和运维企业业务应用,开箱即用的获得全方位的云原生技术能力。包括但不仅限于持续集成、服务治理、架构支撑、多维度应用观测、流量管理。 + +**对于项目交付:** 基于 Rainbond 搭建产品版本化管理体系,搭建标准化客户交付环境,使传统的交付流程可以自动化、简单化和可管理。 + +Rainbond 帮助企业解决如下四类应用管理场景: + +**云原生应用研发与组装** —〉**应用模型分发** —〉**应用模型安装/升级** —〉**应用智能运维** + +> 它非常适合 2B 软件厂商和行业集成商使用,也适合中小型 2C 软件厂商。 + +## 通过Rainbond应用商店快速安装MaxKey + +* 在开源应用商店中搜索 `MaxKey`,点击安装 + +![image-20210924143027246](https://i.loli.net/2021/09/24/oi8G2eVf1B97UDP.png) + +* 部署完成后的拓扑图 + +* maxkey-web-maxkey 是认证服务 + +* maxkey-web-mgt 是管理服务 + + > 账号密码均是:admin maxkey + +![image-20210924143842909](https://i.loli.net/2021/09/24/xbdDGjAIvuVMXOf.png) + +## MaxKey能做什么 + +* MaxKey是认证平台,可将公司内部的服务平台对接至MaxKey,进行统一登录。比如可以将公司内部的 `GitLab` `禅道` `Jenkins` 等支持单点登录协议的服务平台。 +* 本文将通过对接 `禅道` 实现统一登录。 + +### 通过Rainbond应用商店快速安装禅道 + +* 在开源应用商店中搜索 `禅道`,点击进行安装。 + +![image-20210924145650319](https://i.loli.net/2021/09/24/3VeDYIg6nm5lGrx.png) + +* 安装完成后,访问 [禅道 ](https://www.zentao.net/book)进行初始化设置。 + + > Mysql密码在组件的依赖中获取。 + +* 进入禅道后,点击 后台 > 二次开发 > 应用 > 添加应用。 + * 名称:自定义 + * 代号:maxkey + * 免密登录:开启 + * IP:无限制 + +### 配置MaxKey实现统一登录 + +* 进入MaxKey管理服务中,进入应用管理页,编辑 `禅道项目管理`,进入编辑页面。 +* 需修改: + * 登录地址:禅道登录地址 + * 秘钥:填写上一步在禅道中添加应用时的秘钥 + + + +![image-20210924151018815](https://i.loli.net/2021/09/24/EfArgPO168YmMzS.png) + +* 进入 MaxKey认证服务中,点击`禅道项目管理`,即可跳转至禅道页面并自动登录。 + +![maxkey-zentao](https://static.goodrain.com/images/maxkey-zentao.gif) diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/tutorial.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/tutorial.md new file mode 100644 index 000000000..677af4a13 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/install/tutorial.md @@ -0,0 +1,188 @@ +--- +title: Windows部署-快速使用 +sidebar_position: 1 +--- +# 介绍 +为了你更好的使用MaxKey,本教程介绍在Windows中如何快速配置和使用MaxKey。 + +## 软件下载 +访问下载MaxKey并解压到C:盘。 + +## 目录结构 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号目录/文件备注
1MaxKey单点登陆认证系统介绍-CE-***.pdf系统介绍
2getting-started.html快速使用文档
3LICENSE许可证
4NOTICE许可证NOTICE
5jdk/jre运行时JDK
6lib公共包
7maxkey认证服务,端口9527
8maxkey_frontend认证前端服务,端口8527/管理前端服务,端口8526
9maxkey_mgt管理服务,端口9526
10nginx-1.20.1-proxynginx反向代理服务,端口80
11mysql_***MySQL数据库,端口3306
12maxkey_demo样例,端口9521
13start_maxkey.bat启动认证服务器
14start_maxkey_frontend.bat启动认证前端服务器
15start_maxkey_mgt.bat启动管理服务器
16start_maxkey_mgt_frontend.bat启动管理前端服务器
17start_maxkey_db.bat启动数据库
18start_maxkey_proxy.bat启动代理服务器
19start_maxkey_demo.bat启动样例
20set_maxkey_env.bat环境设置脚本
+ +## 配置hosts + +hosts配置文件目录 + +``` +C:\Windows\System32\drivers\etc +``` + +新增如下内容 + +``` +127.0.0.1 sso.maxkey.top +127.0.0.1 mgt.maxkey.top +127.0.0.1 tokenbased.demo.maxkey.top +127.0.0.1 cas.demo.maxkey.top +127.0.0.1 oauth.demo.maxkey.top +``` + +## 服务启动 +1)启动数据库 + +``` +start_maxkey_db.bat +``` + +2)启动认证服务 + +``` +start_maxkey.bat +``` + +3)启动管理服务 + +``` +start_maxkey_mgt.bat +``` + +4)启动认证前端服务 + +``` +start_maxkey_frontend.bat +``` + +5)启动管理前端服务 + +``` +start_maxkey_mgt_frontend.bat +``` + +6)启动代理 + +``` +start_maxkey_proxy.bat +``` + +7)启动样例 + +``` +start_maxkey_demo.bat +``` +## 应用访问 +应用访问 + + +## 推荐Docker Compose部署 + +Docker Compose部署 diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/overview/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/overview/_category_.json new file mode 100644 index 000000000..01a13a092 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/overview/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "概述", + "position": 1, + "link": { + "type": "generated-index", + "description": "概述." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/overview/glossary.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/overview/glossary.md new file mode 100644 index 000000000..861d330f9 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/overview/glossary.md @@ -0,0 +1,331 @@ +--- +sidebar_position: 4 +--- +# 术语表 + +专业术语词汇表Glossary + +解释本文档所用到的专业术语。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
简称(ShortName)en(英文)zh(中文名称)
SSOSingle sign-on单点登录
IAMIdentity and Access Management身份识别与访问管理
IdMIdentity management身份管理
AMAccess Management访问管理
ACAccess control访问控制
FIdIdentity Federation联邦身份
FIdMFederated Identity Management联邦身份管理
AuthzAuthorization 授权
AuthnAuthentication认证
IDaasIdentity Management as a Service身份管理即服务
SAMLSecurity Assertion Markup Language安全断言标记语言
OAuthOAuth为用户资源的授权提供了一个安全的、开放而又简易的标准
OAuth 2.0OAuth 2.0OAuth1a的升级
OpenID Connect(OIDC)OpenID ConnectOpenID 的升级,基于OAuth 2.0
OpenIDOpenID 以用户为中心的数字身份识别框架,它具有开放、分散、自由等特性
CASCentral Authentication Service 中央认证服务,Yale 大学发起的一个开源项目
SCIMSystem for Cross-Domain Identity Management跨域系统身份管理
SPMLService Provisioning Markup Language服务供应标记语言
STSSecurity Token Service安全令牌服务
WS-SecurityWeb Services SecurityWeb服务安全
WS-FederationWeb Services Federation基于Web服务的联邦身份验证规范
TokenToken令牌
KerberosKerberos一种网络认证协议
CAPTCHACAPTCHA验证字/验证码
X.509X.509数字证书的格式
PKIPublic Key Infrastructure公钥基础设施
PMIPrivilege Management Infrastructure授权管理基础设施
RBACRole-Based Access Control基于角色的访问控制
ABACAttribute-Based Access Control基于属性的访问控制
PBACPolicy-Based Access Control基于策略的访问控制
XACMLXtensible Access Control Markup Language可扩展的访问控制标记语言
IdPIdentity Provider身份提供者
SPService Provider服务提供者
CPClaims Provider声明提供者/IdP
RPRelying Party依赖提供者/SP
Account ProvisioningAccount Provisioning账号供应
OTPOne Time Password一次性密码
TFATwo-Factor Authentication双因素认证
LDAPLightweight Directory Access Protocol轻量级目录访问协议
Directory ServiceDirectory Service目录服务
ADActive Directory微软活动目录
ADFSActive Directory Federation Services基于微软活动目录的联邦服务
XMPPExtensible Messaging and Presence Protocol可扩展消息处理现场协议
XKMSXML Key Management ServiceXML密钥管理服务
XDASDistributed Audit Service分布式审计服务
JDBCJava Database ConnectivityJava数据库连接
JNDIJava Naming and Directory InterfaceJava命名和目录接口
APIApplication Programming Interface应用程序编程接口
Web ServicesWeb ServicesWeb服务
SOAPSimple Object Access Protocol简单对象访问协议
WSDLWeb Services Description LanguageWeb服务描述语言
RESTRepresentational state transfer表征状态转移
RESTfulRESTful Web API一个使用HTTP并遵循REST原则的Web服务
HTTPHypertext Transfer Protocol超文本传输协议
HTTPSHypertext Transfer Protocol Secure安全HTTP
SMTPSimple Mail Transfer Protocol简单邮件传输协议
SDKSoftware Development Kit软件开发包
IDEIntegrated Development Environment集成开发环境
AdapterAdapter适配器,用于增强服务的功能,提供额外的服务
ConnectorConnector连接器,用于本地连接/同步数据到其他服务
HTTPHeaderHTTPHeaderHTTP请求头
JITJust-in-Time实时/即时
\ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/overview/history.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/overview/history.md new file mode 100644 index 000000000..d0e70b6a7 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/overview/history.md @@ -0,0 +1,45 @@ +--- +title: 发展历史 +sidebar_position: 2 +--- + +## 历史版本 + +- 2016年,MaxKey项目名称诞生,并研发企业版1.0产品。 + +- 2019年,产品重构,发布开源1.0社区版产品。 + +- 2020年07月,发布2.0版本,及2.x相关版本。 + +- 2021年 + * 03月,加入Dromara开源组织。 + * 06月,国产数据库瀚高DB的适配 + * 11月,Gitee最有价值开源项目GVP + * 12月,好雨科技Rainbond适配 + * 全年,发布2.6.0版本,更新版本到3.2.0。 + +- 2022年 + * 01月,腾讯iOA零信任产品适配 + * 03月,前端基于FreeMarker最终版本更新到3.3.2。 + * 06月,经过3个月的研发,基于Angular前端,前后端分离的版本3.5.0发布。 + * 12月,支持docker-compose部署 + +- 2023年 + * 01月,在飞腾信息技术有限公司的飞腾腾云S2500处理器平台上顺利安装,运行稳定。 + * 02月,银河麒麟高级服务器操作系统(飞腾版)V10银河麒麟高级服务器操作系统(鲲鹏版)V10完成兼容 + * 02月,金仓数据库管理系统 KingbaseES V7、V8完全兼容 + * 03月,与达梦数据库管理系统V8能够相互兼容,系统运行稳定。 + * 03月,与中国长城科技集团股份有限公司的产品擎天EF8系列(腾云S2500 +银河麒麟服务器操作系统V10)可兼容 + * 08月,发布3.5.19,JDK 1.8最后一个版本 + * 09月,发布4.0.0,基于JDK17,后端升级到SpringBoot3。 + +- 2024年 + * 03月,发布4.0.3版本,前端界面优化和管理端功能的优化 + * 06月,发布4.0.5版本,window发行版mysql-8.4.0&jdk 21 + * 07月,发布4.1.0版本,后端升级到SpringBoot3.3.3,权限管理优化,增强权限管理 + * 08月,GitCode G-Star + * 10月,宝塔面板部署 + + +## 项目版本路线图 +![项目版本路线图](/images/roadmap.jpg) \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/overview/intro.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/overview/intro.md new file mode 100644 index 000000000..6e079f318 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/overview/intro.md @@ -0,0 +1,163 @@ +--- +title: MaxKey概述 +sidebar_position: 1 +--- + + +## MaxKey概述 +MaxKey单点登录认证系统是业界领先的IAM-IDaas身份管理和认证产品,谐音为马克思的钥匙,寓意它能够像一把万能钥匙(最大钥匙)一样,解锁复杂的企业安全需求,提供简洁而高效的解决方案。产品支持OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM等标准协议,提供安全、标准和开放的用户身份管理(IDM)、身份认证(AM)、单点登录(SSO)、RBAC权限管理和资源管理等。 + + + +官方QQ:**1054466084** + + +邮箱EMAIL: support@maxsso.net + + +代码托管 GitHub | 码云(Gitee) + +### 什么是单点登录 + +>**单点登录(Single Sign On)**简称为**SSO** +> +>用户只需要登录认证中心一次就可以访问所有相互信任的应用系统,无需再次登录,主要功能: +> +>1.所有应用系统共享一个身份认证系统 +> +>2.所有应用系统能够识别和提取ticket信息 + + + +## 标准协议 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号协议支持
1 OAuth 2.x/OpenID Connect
2 SAML 2.0
3 JWT
4 CAS
5 FormBased
6 TokenBased(Post/Cookie)
7 ExtendApi
8 EXT
+ +![单点登录](/images/authz.png) + +## 登录支持 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号登录方式类型
1 图片验证码字母/数字/算术
2 双因素认证 短信或者邮件动态验证码
3 短信认证腾讯云短信/阿里云短信/网易云信
4 TOTP或者HOTP动态口令Google/Microsoft Authenticator/FreeOTP/支持TOTP或者HOTP
5 Windows域认证Kerberos/SPNEGO/AD域
6 LDAP认证OpenLDAP/ActiveDirectory/标准LDAP服务器
7 社交账号微信/QQ/微博/钉钉/Google/Facebook/其他
8 扫码登录企业微信/钉钉/飞书扫码登录
+ +![认证模型](/images/authn.png) + +## 产品优势 + +1. 提供标准的认证接口以便于其他应用集成SSO,安全的移动接入,安全的API、第三方认证和互联网认证的整合。 + +2. 提供用户生命周期管理,支持SCIM 2协议;开箱即用的连接器(Connector)实现身份供给同步。 + +3. 简化微软Active Directory域控、标准LDAP服务器机构和账号管理,密码自助服务重置密码。 + +4. 认证多租户功能,支持集团下多企业独立管理或企业下不同部门数据隔离的,降低运维成本。 + +5. 认证中心具有平台无关性、环境多样性,支持Web、手机、移动设备等, 如Apple iOS,Andriod等,将认证能力从B/S到移动应用全面覆盖。 + +6. 基于Java EE平台,微服务架构,采用Spring、MySQL、Tomcat、Redis、MQ等开源技术,扩展性强。 + +7. 开源、安全、合规、自主可控,许可证 Apache 2.0 License 。 + + +## Gitee-最有价值开源项目 +Gitee-最有价值开源项目 + +![Gitee-最有价值开源项目](/images/gitee_mvp.png) + +## GitCode G-Star +![G-Star](/images/gitcode_gstar.jpg) \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/overview/users.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/overview/users.md new file mode 100644 index 000000000..9f3bb6b01 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/overview/users.md @@ -0,0 +1,163 @@ +--- +title: 当前用户 +sidebar_position: 3 +--- + + +## MaxKey用户 + +| No. | 单位 | +| -------- | :----- | +| 1 | 中国人民警察大学 | +| 2 | 福耀科技大学 | +| 3 | 兰州现代职业学院 | +| 4 | 长春职业技术学院 | +| 5 | 云南师范大学 | +| 6 | 云南农业职业技术学院 | +| 7 | 惠州卫生职业技术学院 | +| 8 | 厦门软件职业技术学院 | +| 9 | 宜昌市三峡中等专业学校 | +| 10 | 上海图书馆 | +| 11 | 重庆市北碚图书馆 | +| 12 | 天津市劳动保障技师学院 | +| 13 | 南京财经高等职业技术学校 | +| 14 | 泸州市教育和体育局 | +| 15 | 余姚市教育局 | +| 16 | 中国金融认证中心 | +| 17 | 国家高端智能化家用电器创新中心 | +| 18 | 国家中小企业数字化转型促进中心 | +| 19 | 国元证券 | +| 20 | 华夏金融租赁有限公司 | +| 21 | 国宝人寿保险股份有限公司 | +| 22 | 瀚华金控股份有限公司 | +| 23 | 紫金财产保险股份有限公司 | +| 24 | 路特斯中国 | +| 25 | 奇瑞汽车股份有限公司 | +| 26 | 宇通客车股份有限公司 | +| 27 | 国家能源局 | +| 28 | 国务院港澳事务办公室 | +| 29 | 百度智能云身份管理服务 | +| 30 | 360公司 | +| 31 | 三一华兴 | +| 32 | 云小厨CloudKitchens | +| 33 | 西藏阜康医院 | +| 34 | 海阳市人民医院 | +| 35 | 上海逸广信息科技有限公司 | +| 36 | 联鹏应用软件(上海)有限公司 | +| 37 | 上海万序健康科技有限公司 | +| 38 | 上海中商网络股份有限公司 | +| 39 | 上海半天妖餐饮管理有限公司 | +| 40 | 上海杨国福企业管理(集团)有限公司 | +| 41 | 上海契胜科技有限公司 | +| 42 | 纯米科技(上海)股份有限公司 | +| 43 | 中腾信金融信息服务(上海)有限公司 | +| 44 | GAP盖璞(上海)商业有限公司 | +| 45 | 汤臣倍健股份有限公司 | +| 46 | 跳羚科技(厦门)有限公司 | +| 47 | 飞天诚信科技股份有限公司 | +| 48 | 浪潮工业互联网股份有限公司 | +| 49 | 唐颐控股有限公司 | +| 50 | 中创智维科技有限公司 | +| 51 | 中航金网(北京)电子商务有限公司 | +| 52 | 中国航空制造技术研究院 | +| 53 | 中建国际投资集团有限公司 | +| 54 | 同方节能工程技术有限公司 | +| 55 | 云南航天工程物探检测股份有限公司 | +| 56 | 山东港口陆海国际物流集团有限公司 | +| 57 | 山东埃德森石油工程技术有限公司 | +| 58 | 山东第一医科大学第一附属医院 | +| 59 | 广州无线电集团 | +| 60 | 广东小天才科技有限公司 | +| 61 | 广州携旅信息科技有限公司 | +| 62 | 广州蓝深科技有限公司 | +| 63 | 广州广汽商贸物流有限公司 | +| 64 | 广州思迈特软件有限公司 | +| 65 | 广州新一代人工智能产业园管理有限公司 | +| 66 | 广东鸿正软件技术有限公司 | +| 67 | 广东汇天航空航天科技有限公司 | +| 68 | 广东漫云物联科技有限公司 | +| 69 | 深圳市金溢科技股份有限公司 | +| 70 | 深圳市中悦科技有限公司 | +| 71 | 深圳能源集团股份有限公司 | +| 72 | 深圳市东阳光实业发展有限公司 | +| 73 | 深圳云天励飞技术股份有限公司 | +| 74 | 深圳市维玛科技有限公司 | +| 75 | 深圳市观塘银河电讯科技有限公司 | +| 76 | 金龙机电股份有限公司 | +| 77 | 佛山众陶联供应链服务有限公司 | +| 78 | 河南新辰环保科技有限公司 | +| 79 | 河南豫光金铅股份有限公司 | +| 80 | 黄河科技集团有限公司 | +| 81 | 豫信电子科技集团有限公司 | +| 82 | 双汇物流投资有限公司 | +| 83 | 北京外交人员服务局 | +| 84 | 北京博亚思科技有限公司 | +| 85 | 北京银泰置业有限公司 | +| 86 | 北京和融通支付科技有限公司 | +| 87 | 北京微通新成网络科技有限公司 | +| 88 | 北京柏橡科技有限公司 | +| 89 | Best Lawyers Corporation(佳律) | +| 90 | 浙江领湾网络有限公司 | +| 91 | 浙江申跃信息科技有限公司 | +| 92 | 浙江一舟电子科技股份有限公司 | +| 93 | 浙江正元智慧科技有限公司 | +| 94 | 浙江宇视科技有限公司 | +| 95 | 杭州市能源集团有限公司 | +| 96 | 杭州润为数据科技有限公司 | +| 97 | 杭州马上自动化科技有限公司 | +| 98 | 景德镇黑猫集团有限责任公司 | +| 99 | 得力集实有限公司 | +| 100 | 海力控股集团有限公司 | +| 101 | 之江实验室 | +| 102 | 丽水市中医医院 | +| 103 | 宁波金融资产交易中心 | +| 104 | 德清智慧教育平台 | +| 105 | 江苏创致信息科技有限公司 | +| 106 | 无锡市陶都巨龙软件有限责任公司 | +| 107 | 苏州二叶制药有限公司 | +| 108 | 武汉良之隆食材股份有限公司 | +| 109 | 民生实业(集团)有限公司 | +| 110 | TCL华星光电技术有限公司 | +| 111 | 万宝盛华集团 | +| 112 | 妙盈科技 | +| 113 | 尚企云链 | +| 114 | 华奕四库 | +| 115 | 海力控股集团 | +| 116 | 中国融通教育集团 | +| 117 | 新疆天衡信息系统咨询管理有限公司 | +| 118 | 新开普电子股份有限公司 | +| 119 | 广西数字浪潮数据服务有限公司 | +| 120 | 百安居中国 | +| 121 | 重庆两江协同创新区 | +| 122 | 重庆征信有限责任公司 | +| 123 | 万宝盛华大中华有限公司 | +| 124 | 哈尔滨途图科技有限公司 | +| 125 | 哈尔滨逐浪文化传媒有限公司 | +| 126 | 大连电瓷集团股份有限公司 | +| 127 | 锦州港股份有限公司 | +| 128 | 古汉中药有限公司 | +| 129 | 湖南数通信息技术服务有限公司 | +| 130 | 湖南湘邮科技股份有限公司 | +| 131 | 湖南省公共资源交易平台市场主体注册系统 | +| 132 | 湘潭智慧教育云统一认证平台 | +| 133 | 南京市智慧医疗投资运营服务有限公司 | +| 134 | 南京领行科技股份有限公司 | +| 135 | 南凌科技股份有限公司 | +| 136 | 福建引迈信息技术有限公司 | +| 137 | 漳州信息产业集团有限公司 | +| 138 | 厦门茂商科技有限公司 | +| 139 | 惠州中京电子科技股份有限公司 | +| 140 | 武汉英特沃科技有限公司 | +| 141 | 武汉博特睿达智能科技有限公司 | +| 142 | 江西云车科技有限公司 | +| 143 | 天津汉通教育科技有限公司 | +| 144 | 天津市达恩华天智能科技有限公司 | +| 145 | 企思(天津)科技有限公司 | +| 146 | 凯盛工业互联网平台 | +| 147 | 吕梁市医改监测平台 | +| 148 | 遂宁市经济大数据平台 | +| 149 | 临沂市城市大脑物联网统一认证平台 | +| 150 | 广州佳医科科技 | +| 151 | 中科华通科技有限公司 | +| 152 | 浙江迈德斯特医疗器械科技有限公司 | + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/requirements.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/requirements.md new file mode 100644 index 000000000..7da102278 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/requirements.md @@ -0,0 +1,141 @@ +--- +title: 前置条件 +sidebar_position: 3 +--- + +## 系统配置 +MaxKey几乎可以在任何支持**Java**的系统上运行。这意味着可以在**Linux、macOS、Windows**以及**Docker/Kubernetes**等容器解决方案上运行。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号参数推荐配置
1CPU在单个CPU内核上运行良好。但是,建议使用2个或更多核心,以充分利用后台资源。
2内存(RAM)Linux系统应该至少有2GB的RAM来运行。Windows和macOS系统通常需要更多的RAM。
3存储(Storage)建议至少50GB的存储空间。
4网络(Internet Access)建议您的环境与互联网连接。
5浏览器(Browsers)Google Chrome
+ Mozilla Firefox
+ Microsoft Edge
+ Apple Safari
+ +## 应用访问 +在完成安装部署后,完成相应的域名映射,打开浏览器,访问以下地址 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号名称访问地址
1认证平台http://sso.maxkey.top/maxkey/
2管理平台http://mgt.maxkey.top/maxkey-mgt/
3账户admin
4密码maxkey
+ + +## JAVA + + +Java™ 是世界领先的编程语言和平台。 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
推荐版本更新至地址
Eclipse Temurin 17October 2029访问
Eclipse Temurin 21October 2031访问
OracleJDK 17October 2029访问
+ +Oracle Java SE 支持路线图 + +## MySQL + + +MySQL是一个关系型数据库管理系统,属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件之一。 + + + + + + + + + + + + + + + + + + + + + +
推荐版本更新至地址
MySQL 8.0.X访问
MySQL 8.4.XLTS访问
\ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/safety/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/safety/_category_.json new file mode 100644 index 000000000..e453307de --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/safety/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "系统安全性", + "position": 9, + "link": { + "type": "generated-index", + "description": "系统安全性." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/safety/sso_safety.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/safety/sso_safety.md new file mode 100644 index 000000000..55c0f5231 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/safety/sso_safety.md @@ -0,0 +1,130 @@ +--- +title: 系统安全性 +sidebar_position: 1 +--- + +# 系统安全性 + +![安全性](/images/authn/safety.png) + +## 二次密码登录 + +单点登录使用户能在一个入口完成登录后,一般情况下用户在点击应用图标时,直接通过相应的协议,登录到应用系统;但是有时要针对特定的用户、特定的应用进行二次密码校验的功能,防止关键系统的登录,导致的信息敏感泄露,比如财务系统或者个人工资账单,在实际工作中经常出现工作代理的情况,即使出现单点登录的密码泄露,二次密码也很好地保护敏感应用系统; + +## 单点退出 + +单点退出是指用户在一个系统退出后,其所能单点登录访问的所有系统都同时退出。单点退出主要是为提高安全性,避免用户忘记退出所有应用而造成信息的泄密。 +其实现方式也非常简单,由于SSO和单点登录的应用都是分开的,使用不同的域名,只是通过认证协议帮助用户在多个应用系统中传递身份和登录系统。因此,首先注销单点登录应用,然后修改每个应用系统都使用MaxKey的单点退出页面,单点登录的退出页面会将用户登录的Session注销掉。 + +## 会话超时设计 + +为节约服务端资源,并基于安全性考虑,对于长时间没有活动的客户端其会话将被自动终结。同时,为保证用户的单点登录不受影响,其所有超时都在MaxKey端集中控制,即MaxKey的会话超时时间比集成的应用系统会话超时时间略长。例如希望实现用户不活动30分钟就终止会话,则将MaxKey的不活动超时时间设置成30分钟,集成应用的不活动超时时间设置成40分钟。 +如果用户登录后打开多个应用,并一直只访问某个应用,而其他应用长时间没有被访问导致应用会话超时,用户再次点击该已超时的应用时,用户会被应用要求重新登录。为避免这种情况,应用检测到用户会话超时后需将用户重定向到登录页面,MaxKey此时再次实现单点登录,登录成功后应用可重新将用户定向到期之前访问的URL或者该应用的首页。 + +## 防暴力破解 + +由于认证系统需对互联网提供服务,为避免互联网中恶意的暴力破解,系统需提供防暴力破解能力。防暴力破解的关键是提供一种机制,能阻止计算机用穷举法试探用户口令。 +目前一种广泛使用的防暴力破解技术是CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart),即在登录界面除用户名+口令之外再增加一个扭曲的数字或字母字段,让用户输入,这种字段人很容易看懂,但是计算机却很难识别,从而避免计算机用穷举法猜测用户密码,这种技术的应用在互联网应用上经常可以看到。 + +## 连续登陆次失败策 + +使用连续多次登录失败即锁定帐号一定时间的设置,例如如果某个帐号连续6次登录失败就锁定该帐号两小时,这种方式也可以避免暴力破解。 + +## 静态密码策略 + +对密码进行限制无非是为了强制用户设置一个更加安全的密码,密码策略主要有以下几种: + +(1)密码必须符合复杂性要求 + +(2)密码长度最小值 + +(3)密码最长使用期限 + +(4)密码最短使用期限 + +(5)强制密码历史 + +(6)使用可还原的加密存储密码 + +## 双因素身份认证 + +双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统。双因素认证是一种采用时间同步技术的系统,采用了基于时间、事件和密钥三变量而产生的一次性密码来代替传统的静态密码。每个动态密码卡都有一个唯一的密钥,该密钥同时存放在服务器端,每次认证时动态密码卡与服务器分别根据同样的密钥,同样的随机参数(时间、事件)和同样的算法计算了认证的动态密码,从而确保密码的一致性,从而实现了用户的认证。就像我们去银行办卡送的口令牌. +多因素认证(MFA),是一种计算机访问控制的方法,用户要通过两种以上的认证机制之后,才能得到授权,使用计算机资源。MFA的目的是建立一个多层次的防御,使未经授权的人访问计算机系统或网络更加困难,从而提高安全性。 + +## 密码存储 + +基于Spring Security实现密码加密和验证,规则是通过对密码明文添加```{noop}```前缀 + +MaxKey默认密码加密策略BCrypt,用户表(userinfo)->密码字段(password),存储方式```{类型}密文``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
类型密码
plain 明文
bcrypt默认
pbkdf2PBKDF2
md4MD4
md5MD5
sha1SHA-1
sha256SHA-256
sha384SHA-384
sha512SHA-512
sm3国产哈希算法GM/T 0004-2012
ldapLDAP
+ +### bcrypt 编码算法 +bcrypt使用的是布鲁斯·施内尔在1993年发布的 Blowfish 加密算法。bcrypt 算法将salt随机并混入最终加密后的密码,验证时也无需单独提供之前的salt,从而无需单独处理salt问题。加密后的格式一般为: + +``` +$2a$10$/bTVvqqlH9UiE0ZJZ7N2Me3RIgUCdgMheyTgV0B4cMCSokPa.6oCa +``` +其中:$是分割符,无意义;2abcrypt加密版本号;10cost的值;而后的前22位是salt值;再然后的字符串就是密码的密文了。 + +### bcrypt 特点 +bcrypt有个特点就是非常慢。这大大提高了使用彩虹表进行破解的难度。也就是说该类型的密码暗文拥有让破解者无法忍受的时间成本。同时对于开发者来说也需要注意该时长是否能超出系统忍受范围内。通常是MD5的数千倍。 +同样的密码每次使用bcrypt编码,密码暗文都是不一样的。 也就是说你有两个网站如果都使用了bcrypt 它们的暗文是不一样的,这不会因为一个网站泄露密码暗文而使另一个网站也泄露密码暗文。 +所以从bcrypt的特点上来看,其安全强度还是非常有保证的。 + + +### 不推荐使用md5 +首先md5 不是加密算法,是哈希摘要。以前通常使用其作为密码哈希来保护密码。由于彩虹表的出现,md5 和sha1之类的摘要算法都已经不安全了。如果有不相信的同学 可以到一些解密网站 如 cmd5 网站尝试解密 你会发现 md5 和 sha1 是真的非常容易被破解。 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/safety/sso_slo.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/safety/sso_slo.md new file mode 100644 index 000000000..b2e60f409 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docs/safety/sso_slo.md @@ -0,0 +1,109 @@ +--- +title: 单点注销 +sidebar_position: 2 +--- +## 单点注销 + +单点注销(Single Logout)是指用户在一个系统退出后,其所能单点登录访问的所有系统都同时退出。单点注销主要是为提高安全性,避免用户忘记退出所有应用而造成信息的泄密。 + + +IDP支持单点注销(SLO),即用户不仅仅从认证中心注销,同时也注销从认证中心访问的应用系统。 + + +其实现方式也非常简单,由于SSO和单点登录的应用都是分开的,使用不同的域名,只是通过认证中心在多个应用系统中传递身份和登录系统。因此,首先注销单点登录应用,然后修改每个应用系统都使用SSO的单点注销页面,SSO的退出页面会将用户登录的Session注销掉。 + +## 单点注销过程 + +1,应用系统先完成本系统注销,注销完成后调用认证中心的单点注销地址。 + + +2,修改应用单点注销完成后的地址 +```http +https://sso.maxkey.top/sign/force/logout?redirect_uri=注销完成后访问地址 +``` + + + +## 单点注销机制 +MaxKey在登录完成后,会生成在线令牌,该令牌存储在Cookie和服务器中,当单点登录是会向应用传递在线令牌,应用通过判断令牌的状态检查当前用户是否在线,如果令牌失效,则应用自动注销,达到单点注销的功能。 + + +### IDP主动注销 +MaxKey注销时向SP发送注销请求,请求包含注销的令牌,SP获取注销的令牌,通知客户端进行注销 + +基于CAS的单点登录,在单点登录时SP记住MaxKey的ticket,当MaxKey单点注销时向SP发送参数为logoutRequest,请求内容入下 + +```xml + + %s + %s + +``` + +基于MaxKey在线token注销机制,在单点登录时MaxKey会把在线token发送给SP,SP需要存储该令牌,当MaxKey单点注销时向SP发送请求 + + + + + + + + + + + + + + + + + + + + + + + +
序号参数备注
1requestlogoutRequest
2id随机id
3principal登录用户名
4issueInstant登出时间
5ticket当前在线ticket
+ + +### SP接口注销 +SP向MaxKey的接口定时发送请求,检查令牌的有效性,如果令牌失效,则应用退出登录,验证在线token地址sign/onlineticket/validate,参数为ticket为令牌id + +### Cookie有效性注销 +登录完成后在线令牌存储在.maxkey.top的域名下,Cookie名称为online_ticket,SP应用和MaxKey使用**子域名.maxkey.top**,应用根据令牌有效性判断是否注销。 + + +### 关闭浏览器注销 +MaxKey注销,然后在注销的界面使用javascript关闭浏览器。 + + +## 实现机制比较 + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号机制适应场景
1IDP主动注销SP实现接口用于MaxKey调用
2SP接口注销对MaxKey请求频繁有一定压力
3Cookie有效性注销同域,实现简单
4注销MaxKey并关闭浏览器关闭整个浏览器
+ \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docusaurus.config.js b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docusaurus.config.js new file mode 100644 index 000000000..832cd8b5b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/docusaurus.config.js @@ -0,0 +1,207 @@ +// @ts-check +// `@type` JSDoc annotations allow editor autocompletion and type checking +// (when paired with `@ts-check`). +// There are various equivalent ways to declare your Docusaurus config. +// See: https://docusaurus.io/docs/api/docusaurus-config + +import {themes as prismThemes} from 'prism-react-renderer'; + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: 'MaxKey单点登录认证系统', + tagline: '业界领先的IAM身份管理和认证产品', + favicon: 'img/favicon.ico', + + // Set the production url of your site here + url: 'https://www.maxkey.top', + // Set the // pathname under which your site is served + // For GitHub pages deployment, it is often '//' + baseUrl: '/doc', + staticDirectories: ['static'], + + // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. + organizationName: 'Dromara', // Usually your GitHub org/user name. + projectName: 'MaxKey', // Usually your repo name. + + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'warn', + + // Even if you don't use internationalization, you can use this field to set + // useful metadata like html lang. For example, if your site is Chinese, you + // may want to replace "en" with "zh-Hans". + i18n: { + defaultLocale: 'zh', + locales: ['en','zh'], + localeConfigs: { + en: { + htmlLang: 'en', + }, + // You can omit a locale (e.g. fr) if you don't need to override the defaults + zh: { + htmlLang: 'zh', + }, + }, + }, + + presets: [ + [ + 'classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + sidebarPath: './sidebars.js', + lastVersion: 'current', + versions: { + current: { + label: '4.1.x', + path: '', + }, + }, + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: + 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', + }, + blog: { + showReadingTime: true, + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: + 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', + }, + theme: { + //customCss: './src/css/custom.css','./static/font-awesome-4.7.0/css/font-awesome.min.css', + customCss: [require.resolve('./src/css/custom.css'),require.resolve('./static/font-awesome-4.7.0/css/font-awesome.min.css')], + }, + }), + ], + ], + scripts: [ + { + src: 'https://www.maxkey.top/doc/jquery.min.js' + }], + plugins: [ + [ + '@docusaurus/plugin-content-docs', + { + id: 'about', + path: 'about', + //editUrl: `https://github.com/${organizationName}/${projectName}/edit/${branch}/website/`, + routeBasePath: 'about', + sidebarPath: require.resolve('./sidebars.js'), + + }, + ], + ], + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + // Replace with your project's social card + image: 'img/docusaurus-social-card.jpg', + navbar: { + //title: 'MaxKey', + logo: { + alt: 'MaxKey Logo', + src: 'images/logo_maxkey.png', + }, + items: [ + { + + to: 'http://www.maxkey.top/', + position: 'right', + label: '首页', + }, + { + type: 'docsVersionDropdown', + position: 'right', + //dropdownItemsBefore: [{to: '/docs', label: '当前版本'}], + dropdownActiveClassDisabled: true, + }, + { + + to: 'https://www.maxkey.top/zh/about/cevsenterprise.html', + position: 'right', + label: '企业版', + }, + /*{ + to: 'https://www.maxkey.top/zh/about/cevscas.html', + label: '同类对比', + + items: [ + {to: '/about/welcome', label: '概述'}, + {to: '/about/news', label: '新闻动态'}, + {to: '/about/team', label: '项目团队'}, + {to: '/about/licenses', label: '项目许可证'}, + {to: '/about/dependency', label: '项目依赖'}, + {to: '/about/cevsenterprise', label: '企业版'}, + {to: '/about/cevscas', label: '同类对比'}, + {to: '/about/roadmap', label: '开发路线图'}, + ], + position: 'right' + },*/ + { + type: 'localeDropdown', + position: 'right', + }, + ], + }, + /* + footer: { + style: 'dark', + links: [ + { + title: 'Docs', + items: [ + { + label: 'Tutorial', + to: '/docs/intro', + }, + ], + }, + { + title: 'Community', + items: [ + { + label: 'Stack Overflow', + href: 'https://stackoverflow.com/questions/tagged/docusaurus', + }, + { + label: 'Discord', + href: 'https://discordapp.com/invite/docusaurus', + }, + { + label: 'Twitter', + href: 'https://twitter.com/docusaurus', + }, + ], + }, + { + title: 'More', + items: [ + { + label: 'Blog', + to: '/blog', + }, + { + label: 'GitHub', + href: 'https://github.com/facebook/docusaurus', + }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} My Project, Inc. Built with Docusaurus.`, + },*/ + footer: { + style: 'dark', + copyright: `
Copyright © ${new Date().getFullYear()} maxkey.top of Dromara . All rights reserved . Built with Docusaurus.`, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + additionalLanguages: ['powershell','java','php','python'] + }, + }), +}; + +export default config; diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/package.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/package.json new file mode 100644 index 000000000..35345840c --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/package.json @@ -0,0 +1,45 @@ +{ + "name": "maxkey-docs-v2", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids" + }, + "dependencies": { + "@docusaurus/core": "^3.6.3", + "@docusaurus/preset-classic": "^3.6.3", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "my-website-1": "file:", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "^3.6.3", + "@docusaurus/types": "^3.6.3" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] + }, + "engines": { + "node": ">=18.0" + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/sidebars.js b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/sidebars.js new file mode 100644 index 000000000..659d2f562 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/sidebars.js @@ -0,0 +1,35 @@ +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ + +// @ts-check + +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebars = { + // By default, Docusaurus generates a sidebar from the docs folder structure + tutorialSidebar: [ + {type: 'html',value: ''}, + {type: 'autogenerated', dirName: '.'}], + + // But you can create a sidebar manually + /* + tutorialSidebar: [ + 'intro', + 'hello', + { + type: 'category', + label: 'Tutorial', + items: ['tutorial-basics/create-a-document'], + }, + ], + */ +}; + +export default sidebars; diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/components/HomepageFeatures/index.js b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/components/HomepageFeatures/index.js new file mode 100644 index 000000000..acc762199 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/components/HomepageFeatures/index.js @@ -0,0 +1,64 @@ +import clsx from 'clsx'; +import Heading from '@theme/Heading'; +import styles from './styles.module.css'; + +const FeatureList = [ + { + title: 'Easy to Use', + Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, + description: ( + <> + Docusaurus was designed from the ground up to be easily installed and + used to get your website up and running quickly. + + ), + }, + { + title: 'Focus on What Matters', + Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, + description: ( + <> + Docusaurus lets you focus on your docs, and we'll do the chores. Go + ahead and move your docs into the docs directory. + + ), + }, + { + title: 'Powered by React', + Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, + description: ( + <> + Extend or customize your website layout by reusing React. Docusaurus can + be extended while reusing the same header and footer. + + ), + }, +]; + +function Feature({Svg, title, description}) { + return ( +
+
+ +
+
+ {title} +

{description}

+
+
+ ); +} + +export default function HomepageFeatures() { + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/components/HomepageFeatures/styles.module.css b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/components/HomepageFeatures/styles.module.css new file mode 100644 index 000000000..b248eb2e5 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/components/HomepageFeatures/styles.module.css @@ -0,0 +1,11 @@ +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureSvg { + height: 200px; + width: 200px; +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/css/custom.css b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/css/custom.css new file mode 100644 index 000000000..037f0f064 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/css/custom.css @@ -0,0 +1,810 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --ifm-color-primary: #2e8555; + --ifm-color-primary-dark: #29784c; + --ifm-color-primary-darker: #277148; + --ifm-color-primary-darkest: #205d3b; + --ifm-color-primary-light: #33925d; + --ifm-color-primary-lighter: #359962; + --ifm-color-primary-lightest: #3cad6e; + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + --ifm-color-primary: #25c2a0; + --ifm-color-primary-dark: #21af90; + --ifm-color-primary-darker: #1fa588; + --ifm-color-primary-darkest: #1a8870; + --ifm-color-primary-light: #29d5b0; + --ifm-color-primary-lighter: #32d8b4; + --ifm-color-primary-lightest: #4fddbf; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); +} + +/* add by maxkey project */ + + +.purple-text { + color: rebeccapurple; +} + +.navbar__brand { + flex-basis: 152px; + flex-shrink: 1; + margin-left: 48px; + max-width: 152px; +} +.navbar { + /*box-shadow: none;*/ + height: 80px; + background: rgba(255, 255, 255, 0.9); + box-shadow: 0px 2px 18px rgba(0, 0, 0, 0.06); + backdrop-filter: blur(18px); + /*--bs-bg-opacity: 1; + background-color: rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important; + */ +} + +.navbar__inner{ + height: 60px; +} +.navbar__logo img{ + height: 48px; + margin-top: -8px; +} + +.navbar__items { + height: 60px; +} + +.table{ + display: table; + width: 100%; +} + +.Line_Right{ + margin-top: -120px; + float: right; + +} + +.Line_Right img { + height: 400px; +} + + +.container_V0OF { + flex: 1; + margin: auto; + max-width: 1200px; + +} + +.container_V0OF, +.heroBanner_gpiR { + display: flex; + flex-direction: column; + justify-content: flex-end +} + +.heroBanner_gpiR { + margin-top: 100px; + padding: 0 2rem !important +} + +.heroBanner_gpiR .container_V0OF, +.mdxPageWrapper_j9I6 { + justify-content: center +} + +.Title_Zu3Z { + align-items: center; + /*display: flex;*/ + flex-wrap: wrap; + font-size: 40px; + letter-spacing: 5px; + line-height: 50px; + text-align: left +} + +.Title_Zu3Z .fullsize_TlGw, +.Title_y2Fe .fullsize_zk1x { + flex: 1; + text-align: left +} + +.Line_JXL7 { + align-items: center; + display: flex; + flex: 1; + flex-wrap: nowrap; + justify-content: flex-start +} + +.Tagline_SzT4 { + font-family: Sohne Mono; + font-size: 20px; + /*font-weight: 400;*/ + letter-spacing: .005em; + line-height: 35px; + margin: 50px 20px 20px 0; + max-width: 500px; + text-align: left +} + +.SecondLine_cr31 .Line_JXL7 { + align-self: flex-start; + float:left; +} + +.ButtonsContainer_Sl7u { + display: flex; + flex-wrap: wrap; + margin-top: -80px; + width: 200px; +} + +.ButtonsContainer_Sl7u>* { + margin-top: 20px +} + +.ButtonsContainer_Sl7u a svg{ + float: left; + margin-left: -15px; +} + + +.button { + background-color: var(--ifm-button-background-color); + border: var(--ifm-button-border-width) solid var(--ifm-button-border-color); + border-radius: var(--ifm-button-border-radius); + cursor: pointer; + font-size: calc(.875rem*var(--ifm-button-size-multiplier)); + font-weight: var(--ifm-button-font-weight); + line-height: 1.5; + padding: calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier)); + transition-duration: var(--ifm-button-transition-duration); + transition-property: color, background, border-color; + -webkit-user-select: none; + user-select: none; + white-space: nowrap +} + +.button, +.button:hover { + color: var(--ifm-button-color) +} + +.button--outline { + --ifm-button-color: var(--ifm-button-border-color) +} + +.button--outline:hover { + --ifm-button-background-color: var(--ifm-button-border-color) +} + +.button--link { + --ifm-button-border-color: transparent; + color: var(--ifm-link-color); + text-decoration: var(--ifm-link-decoration) +} + +.button--link.button--active, +.button--link:active, +.button--link:hover { + color: var(--ifm-link-hover-color); + text-decoration: var(--ifm-link-hover-decoration) +} + +.button.disabled, +.button:disabled, +.button[disabled] { + opacity: .65; + pointer-events: none +} + +.button--sm { + --ifm-button-size-multiplier: 0.8 +} + +.button--lg { + --ifm-button-size-multiplier: 1.35 +} + +.button--block { + display: block; + width: 100% +} + +.button.button--secondary { + color: var(--ifm-color-gray-900) +} + +:where(.button--primary) { + --ifm-button-background-color: var(--ifm-color-primary); + --ifm-button-border-color: var(--ifm-color-primary) +} + +:where(.button--primary):not(.button--outline):hover { + --ifm-button-background-color: var(--ifm-color-primary-dark); + --ifm-button-border-color: var(--ifm-color-primary-dark) +} + +.button--primary.button--active, +.button--primary:active { + --ifm-button-background-color: var(--ifm-color-primary-darker); + --ifm-button-border-color: var(--ifm-color-primary-darker) +} + +:where(.button--secondary) { + --ifm-button-background-color: var(--ifm-color-secondary); + --ifm-button-border-color: var(--ifm-color-secondary) +} + +:where(.button--secondary):not(.button--outline):hover { + --ifm-button-background-color: var(--ifm-color-secondary-dark); + --ifm-button-border-color: var(--ifm-color-secondary-dark) +} + +.button--secondary.button--active, +.button--secondary:active { + --ifm-button-background-color: var(--ifm-color-secondary-darker); + --ifm-button-border-color: var(--ifm-color-secondary-darker) +} + +:where(.button--success) { + --ifm-button-background-color: var(--ifm-color-success); + --ifm-button-border-color: var(--ifm-color-success) +} + +:where(.button--success):not(.button--outline):hover { + --ifm-button-background-color: var(--ifm-color-success-dark); + --ifm-button-border-color: var(--ifm-color-success-dark) +} + +.button--success.button--active, +.button--success:active { + --ifm-button-background-color: var(--ifm-color-success-darker); + --ifm-button-border-color: var(--ifm-color-success-darker) +} + +:where(.button--info) { + --ifm-button-background-color: var(--ifm-color-info); + --ifm-button-border-color: var(--ifm-color-info) +} + +:where(.button--info):not(.button--outline):hover { + --ifm-button-background-color: var(--ifm-color-info-dark); + --ifm-button-border-color: var(--ifm-color-info-dark) +} + +.button--info.button--active, +.button--info:active { + --ifm-button-background-color: var(--ifm-color-info-darker); + --ifm-button-border-color: var(--ifm-color-info-darker) +} + +:where(.button--warning) { + --ifm-button-background-color: var(--ifm-color-warning); + --ifm-button-border-color: var(--ifm-color-warning) +} + +:where(.button--warning):not(.button--outline):hover { + --ifm-button-background-color: var(--ifm-color-warning-dark); + --ifm-button-border-color: var(--ifm-color-warning-dark) +} + +.button--warning.button--active, +.button--warning:active { + --ifm-button-background-color: var(--ifm-color-warning-darker); + --ifm-button-border-color: var(--ifm-color-warning-darker) +} + +:where(.button--danger) { + --ifm-button-background-color: var(--ifm-color-danger); + --ifm-button-border-color: var(--ifm-color-danger) +} + +:where(.button--danger):not(.button--outline):hover { + --ifm-button-background-color: var(--ifm-color-danger-dark); + --ifm-button-border-color: var(--ifm-color-danger-dark) +} + +.button--danger.button--active, +.button--danger:active { + --ifm-button-background-color: var(--ifm-color-danger-darker); + --ifm-button-border-color: var(--ifm-color-danger-darker) +} + +.button-group { + display: inline-flex; + gap: var(--ifm-button-group-spacing) +} + + +.button-group>.button:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0 +} + +.button-group>.button:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0 +} + +.button-group--block { + display: flex; + justify-content: stretch +} + +.button-group--block>.button { + flex-grow: 1 +} + +.button { + font-size: calc(10px*var(--ifm-button-size-multiplier)); + letter-spacing: .13em; + line-height: calc(11px*var(--ifm-button-size-multiplier)); + margin-right: 13px +} + +.btn-icon-text>svg { + margin-right: 8px; +} + +.VtuNT { + display: inline-block; + vertical-align: middle; + overflow: hidden; +} + +.Feature_Mi5F:hover .Title_ybT8:after, +.Feature_vTnw:hover .FeatureTitle_ab4E:after, +.Title_Zu3Z .important_yemX, +.Title_rvKm .important_Mk1X, +.Title_y2Fe .important_bBhM, +.Title_y7cx strong, +.text--primary, +.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma { + color: #FFD700 +} + +.Row_t0gZ { + flex-wrap: wrap; + margin-bottom: 20px; + overflow: hidden +} + +.Buttons_zeDM, +.Row_t0gZ, +.buttons_U0sb, +.docsWrapper_BCFX, +.navbar, +.navbar>.container, +.navbar>.container-fluid { + display: flex +} + +.Feature_Mi5F,.Feature_vTnw { + align-items: stretch; + border: 1px solid var(--ifm-light-border-color); + box-sizing: border-box; + cursor: pointer; + display: flex; + flex: 1 1 400px; + flex-direction: column; + justify-content: flex-start; + max-width: 100%; + min-width: 40%; + padding: 47px 45px 35px 85px; + transition: background-color .3s ease-in-out; + will-change: background-color +} + +.Feature_vTnw ul{ + list-style: none; + padding: 0; +} +.Feature_vTnw ul li i { + font-size: 20px; + padding-right: 4px; + color: #FFD700; +} + +.VideoContainer_TaxJ { + border-radius: 0; + border-width: 1px; + margin: 20px 0 10px; +} + +.FeatureTitle_ab4E, +.Title_ybT8 { + -webkit-text-decoration-color: transparent; + text-decoration-color: transparent; + will-change: color, text-decoration-color +} + +.Feature_Mi5F:hover, +.Feature_vTnw:hover { + background-color: var(--ifm-background-color-hover) +} + + +.FeatureTitle_ab4E { + font-family: Sohne Mono; + font-size: 22px; + letter-spacing: .02em; + line-height: 26px; + margin: 16px 0; + text-align: left; + transition: color .3s ease-in-out, text-decoration-color .3s ease-in-out, -webkit-text-decoration-color .3s ease-in-out +} + +.FeatureTitle_ab4E:after { + color: transparent; + transition: color .3s ease-in-out; + will-change: color +} + +.Title_ybT8 { + font-family: Sohne Mono; + font-size: 22px; + letter-spacing: .02em; + line-height: 26px; + margin: 16px 0; + text-align: left; + text-decoration: underline; + transition: color .3s ease-in-out, text-decoration-color .3s ease-in-out, -webkit-text-decoration-color .3s ease-in-out +} + +.Title_ybT8:after { + color: transparent; + content: " >"; + transition: color .3s ease-in-out; + will-change: color +} + +.Description_LNA6, +.FeatureDescription_Wc4F { + font-size: 15px; + letter-spacing: .035em; + line-height: 24px; + max-width: 436px; + text-align: left +} + + +.quoteSection_jN4m { + display: flex; + flex-direction: row; + justify-content: center; + +} + + +.BigTitle_a80P { + padding: 20px 30px 10px; +} + + +.quoteCard_krye { + border: 1px solid #d4dae5; + box-shadow: 0 10px 10px rgba(0,0,0,.2); + border: 1px solid var(--ifm-light-border-color); + margin: 30px; + padding: 30px; + position: relative; + width: 350px; + text-align: center; +} + +.quoteCard_krye::before { + background-color: var(--ifm-color-primary-light); + content: ""; + height: 5px; + left: 0; + position: absolute; + right: 0; + top: 0; +} + +.contact-info i { + font-size: 48px; + display: inline-block; + margin-bottom: 10px; + text-align: center; + color: #FFD700; +} + +.quoteCard_krye h3 { + font-size: 18px; + margin-bottom: 15px; + font-weight: bold; + text-transform: uppercase; + color: #999; +} + +.Row_t0gZ, .Section_PKs5 { + border-bottom: 1px solid var(--ifm-light-border-color); +} + + +.Section_PKs5 { + align-items: center; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-evenly; + margin: 100px 0 0; + padding-bottom: 100px +} + +.Section_PKs5.Reverse_P0Za { + flex-direction: row-reverse +} + +.Section_PKs5.Green_U5a0 { + --ifm-color-primary: #16d18e; + --ifm-color-primary-dark: #16d18e; + --ifm-color-primary-darker: #16d08d; + --ifm-color-primary-darkest: #16d08d; + --ifm-color-primary-light: #16d18e; + --ifm-color-primary-lighter: #16d28f; + --ifm-color-primary-lightest: #16d28f +} + +.Section_PKs5.Blue_dVCZ { + --ifm-color-primary: #164ad1; + --ifm-color-primary-dark: #164ad1; + --ifm-color-primary-darker: #164ad0; + --ifm-color-primary-darkest: #164ad0; + --ifm-color-primary-light: #164ad1; + --ifm-color-primary-lighter: #164ad2; + --ifm-color-primary-lightest: #164ad2 +} + +.Content_esP7, +.Figure_W11r { + flex: 0 1 550px; + min-width: 350px; +} + +.Figure_W11r img{ + height: 400px; +} + +.Content_esP7 { + padding: 0 20px +} + + +.downloadredflag { + color: red; +} + +.mainfeatures .col .icon i{ + color: #444; + font-size: 64px; + transition: 0.5s; + line-height: 0; + margin-top: 34px; +} + +.mainfeatures .col .icon i:before { + background: #0c2e8a; + background: linear-gradient(45deg, #ffd700 0%, #a3ebd5 100%); + background-clip: border-box; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.partners { + width: 140px; + min-height: 1px; + float: left; +} + +.partners a img { + max-width: 120px; + transition: 0.3s; + padding: 15px 0; + height: 60px; +} + +.friendly_links { + text-align: center; + width: 20%; +} + +.friendly_links img { + height: 60px; + max-width: 120px; +} + +.friendly_links a { + color: #337ab7; +} + +@media screen and (max-width:900px) { + .Title_s2wP { + font-size: 33px; + line-height: 39px; + padding: 20px + } + + .SecondLine_cr31, + .SecondLine_wYvF { + align-items: stretch; + flex-direction: column-reverse + } + + .SecondLine_cr31 .Line_JXL7, + .SecondLine_wYvF .Line_hKFJ { + justify-content: flex-end + } + + .SecondLine_cr31 .Tagline_SzT4, + .SecondLine_wYvF .Tagline_f1ph { + margin-right: 0; + max-width: none + } + + .Title_Zu3Z { + font-size: 96px; + line-height: 103.5px + } + + .Section_PKs5 { + margin: 50px 0 0 + } + + .Content_esP7 { + padding: 50px 20px + } + + .Feature_vTnw { + padding: 15px 30px 20px 40px + } + + .MainContainer_dA5o { + flex-wrap: wrap; + margin: 45px + } +} + +@media screen and (max-width:600px) { + .FooterMainNav_pCrv { + flex: 0 1 100% + } + + .ContactFormLabel_F3Be { + font-size: 40px + } + + .ContactForm_IS7n { + padding: 45px 45px 80px + } + + .Line_Right{ + margin-top: -10px; + } + .Title_s2wP { + font-size: 26.4px; + line-height: 31.2px + } + + .Title_Zu3Z { + font-size: 70.4px; + line-height: 75.9px + } + + .Tagline_SzT4 { + font-size: 18px; + margin-right: 8px; + max-width: 200px + } + + .Buttons_zeDM { + flex-wrap: wrap + } + + .ButtonsContainer_Sl7u, + .ButtonsContainer_Sl7u>* { + width: 100% + } + + .quoteSection_jN4m { + display: grid; + } + + .quoteCard_krye { + width: 300px; + } + + .quoteCard_krye p { + block-size: 300px + } + + .MainContainer_dA5o { + margin: 15px 5px + } + + .Title_SFdm { + font-size: 45px; + line-height: 60px + } +} + +@media screen and (max-width:400px) { + .Title_Zu3Z { + font-size: 18px; + line-height: 48.3px + } + + .Tagline_SzT4 { + font-size: 14px; + line-height: 25px; + margin-right: 2px; + max-width: 150px + } + + .ButtonsContainer_Sl7u { + margin-top: -10px; + } + + .MainContainer_dA5o { + margin: 0 0 20px + } +} + +a .avatar-user { + border-radius: 50% !important; + border: var(--primer-borderWidth-thin, 1px) solid var(--color-border-default) !important; +} + +a .avatar { + background-color: var(--color-avatar-bg); + border-radius: var(--primer-borderRadius-medium, 6px); + box-shadow: 0 0 0 1px var(--color-avatar-border); + display: inline-block; + flex-shrink: 0; + line-height: 1; + overflow: hidden; +} + +.footer--dark { + --ifm-footer-background-color: #212121;; +} + +.roadmap .table-col1{ + width: 20%; +} + +.roadmap .table-col2{ + width: 60%; +} + +.roadmap .table-col3{ + width: 20%; +} + +.mysql_logo{ + width: 100px +} + +.java_logo{ + width: 100px; + background-color:#3a75b0; +} + +.java_logo a{ + width: 100px +} \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/backup/index.js b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/backup/index.js new file mode 100644 index 000000000..b5bd05c11 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/backup/index.js @@ -0,0 +1,41 @@ +import React from 'react'; +import clsx from 'clsx'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Layout from '@theme/Layout'; +import HomepageFeatures from '@site/src/components/HomepageFeatures'; + +import styles from './index.module.css'; + +function HomepageHeader() { + const {siteConfig} = useDocusaurusContext(); + return ( +
+
+

{siteConfig.title}

+

{siteConfig.tagline}

+
+ + 快速开始- 5分钟 ⏱️ + +
+
+
+ ); +} + +export default function Home() { + const {siteConfig} = useDocusaurusContext(); + return ( + + +
+ +
+
+ ); +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/backup/index.module.css b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/backup/index.module.css new file mode 100644 index 000000000..9f71a5da7 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/backup/index.module.css @@ -0,0 +1,23 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 996px) { + .heroBanner { + padding: 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/download.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/download.md new file mode 100644 index 000000000..5cce795da --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/download.md @@ -0,0 +1,233 @@ +--- +title: 下载 +--- + +

下载

+ +百度网盘下载,提取码全部都是mxk9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
版本发布日期支持到日期下载地址
v 3.5.9 2022/10/252023/10 链接下载
v 3.5.8 2022/10/112023/10 链接下载
v 3.5.7 GA 2022/09/232023/09 链接下载
v 3.5.6 GA 2022/09/072023/09 链接下载
v 3.5.5 GA 2022/08/232023/08 链接下载
v 3.5.4 GA 2022/08/052023/08 链接下载
v 3.5.3 GA 2022/07/232023/07 链接下载
v 3.5.2 GA 2022/07/142023/07 链接下载
v 3.5.1 GA 2022/06/092023/06 链接下载
v 3.5.0 GA 2022/05/102023/05 链接下载
v 3.3.3 GA 2022/03/032023/12 链接下载
v 3.3.2 GA 2022/02/17 End Of Life (EOL)
v 3.3.1 GA 2022/02/10 End Of Life (EOL)
v 3.3.0 GA 2022/01/21 End Of Life (EOL)
v 3.2.0 GA 2021/12/21 End Of Life (EOL)
v 3.1.1 GA 2021/11/30 End Of Life (EOL)
v 3.1.0 GA 2021/11/03 End Of Life (EOL)
v 3.0.0 GA 2021/09/29 End Of Life (EOL)
v 2.9.0 GA 2021/08/24 End Of Life (EOL)
v 2.9.0 RC1 2021/08/10 End Of Life (EOL)
v 2.8.1 GA 2021/06/25 End Of Life (EOL)
v 2.8.0 GA 2021/06/01 End Of Life (EOL)
v 2.7.0 GA 2021/04/15 End Of Life (EOL)
v 2.6.0 GA 2021/03/05 End Of Life (EOL)
v 2.5.0 GA 2021/02/06 End Of Life (EOL)
v 2.4.0 GA 2021/01/01 End Of Life (EOL)
v 2.3.0 GA 2020/11/11 End Of Life (EOL)
v 2.2.0 GA 2020/09/24 End Of Life (EOL)
v 2.1.0 GA 2020/08/01 End Of Life (EOL)
v 2.0.0 GA 2020/07/13 End Of Life (EOL)
v 1.4.0 GA 2020/05/01 End Of Life (EOL)
v 1.3.0 GA 2020/04/04 End Of Life (EOL)
v 1.2.1 GA 2020/02/29End Of Life (EOL)
v 1.2.0 GA 2020/01/18 End Of Life (EOL)
v 1.0.0 GA 2019/12/06 End Of Life (EOL)
+ +

Rainbond应用商店快速安装

+ +[Rainbond](https://github.com/goodrain/rainbond) 是云原生且易用的云原生应用管理平台。通过Rainbond快速安装 diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/10_welcome.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/10_welcome.md new file mode 100644 index 000000000..cedc0b369 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/10_welcome.md @@ -0,0 +1,164 @@ +--- +sidebar_position: 1 +title: 概述 +--- + + +## MaxKey概述 +MaxKey单点登录认证系统,谐音为马克思的钥匙寓意是最大钥匙,是业界领先的IAM身份管理和认证产品;支持OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM等标准协议;提供安全、标准和开放的用户身份管理(IDM)、身份认证(AM)、单点登录(SSO)、资源管理和权限管理等。 + + +官方QQ:**1054466084** + + +邮箱EMAIL: support@maxsso.net + + +代码托管 GitHub | 码云(Gitee) + +### 什么是单点登录 + +>**单点登录(Single Sign On)**简称为**SSO** +> +>用户只需要登录认证中心一次就可以访问所有相互信任的应用系统,无需再次登录,主要功能: +> +>1.所有应用系统共享一个身份认证系统 +> +>2.所有应用系统能够识别和提取ticket信息 + + + +## 标准协议 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号协议支持
1 OAuth 2.x/OpenID Connect
2 SAML 2.0
3 JWT
4 CAS
5 FormBased
6 TokenBased(Post/Cookie)
7 ExtendApi
8 EXT
+ +![单点登录](/images/authz.png) + +## 登录支持 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号登录方式类型
1 图片验证码字母/数字/算术
2 双因素认证 短信或者邮件动态验证码
3 短信认证腾讯云短信/阿里云短信/网易云信
4 TOTP或者HOTP动态口令Google/Microsoft Authenticator/FreeOTP/支持TOTP或者HOTP
5 Windows域认证Kerberos/SPNEGO/AD域
6 LDAP认证OpenLDAP/ActiveDirectory/标准LDAP服务器
7 社交账号微信/QQ/微博/钉钉/Google/Facebook/其他
8 扫码登录企业微信/钉钉/飞书扫码登录
+ +![认证模型](/images/authn.png) + +## 产品优势 + +1. 提供标准的认证接口以便于其他应用集成SSO,安全的移动接入,安全的API、第三方认证和互联网认证的整合。 + +2. 提供用户生命周期管理,支持SCIM 2协议;开箱即用的连接器(Connector)实现身份供给同步。 + +3. 简化微软Active Directory域控、标准LDAP服务器机构和账号管理,密码自助服务重置密码。 + +4. 认证多租户功能,支持集团下多企业独立管理或企业下不同部门数据隔离的,降低运维成本。 + +5. 认证中心具有平台无关性、环境多样性,支持Web、手机、移动设备等, 如Apple iOS,Andriod等,将认证能力从B/S到移动应用全面覆盖。 + +6. 基于Java EE平台,微服务架构,采用Spring、MySQL、Tomcat、Redis、MQ等开源技术,扩展性强。 + +7. 开源、安全、自主可控,许可证 Apache 2.0 License & MaxKey版权声明。 + + +## 项目版本路线图 + +![项目版本路线图](/images/roadmap.jpg) + +## 最有价值开源项目 +Gitee-最有价值开源项目 + +![Gitee-最有价值开源项目](/images/gitee_mvp.png) \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/11_news.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/11_news.md new file mode 100644 index 000000000..e2feb2612 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/11_news.md @@ -0,0 +1,66 @@ +--- +title: 新闻动态 +--- +# 新闻动态 + +关于Authing.cn在百度搜索关键字“MaxKey单点登录认证系统”侵权的进展通告-[2022/07/16] 查看 + +MaxKey 单点登录认证系统前后端分离 v3.5.1GA 发布[2022/06/01] 查看 + +MaxKey 单点登录认证系统前后端分离 v3.5.0GA 发布[2022/05/11] 查看 + +MaxKey 单点登录认证系统 v3.5.0 RC 发布[2022/05/01] 查看 + +MaxKey 单点登录认证系统 v3.3.0 GA 发布[2022/03/03] 查看 + +MaxKey 单点登录认证系统 v3.2.0 GA 发布[2022/02/17] 查看 + +关于Authing.cn在百度搜索关键字“MaxKey单点登录认证系统”侵权的通告-[2021/12/15] 查看 + +MaxKey 单点登录认证系统 v3.1.0 GA 发布[2021/11/03] 查看 + +MaxKey 单点登录认证系统微服务架构 v3.0.0GA 发布[2021/09/29] 查看 + +MaxKey 单点登录认证系统 v2.9.0 GA 发布[2021/08/24] 查看 + +MaxKey 单点登录认证系统 v 2.8.1GA 发布 [2021/06/25] 查看 + +MaxKey 单点登录认证系统 v2.7.0GA 发布 [2021/04/15] 查看 + +Dromara 开源社区再次新增两个 GVP 项目 [2021/03/16] 查看 + +MaxKey单点登录认证系统 v 2.6.0GA 发布 [2021/03/05] 查看 + +MaxKey单点登录认证系统 v2.5.0GA 发布 [2021/02/06] 查看 + +MaxKey单点登录认证系统 v2.4.0GA 发布 [2021/01/01] 查看 + +单点登录认证系统 MaxKey v2.3.0GA 发布 [2020/11/11] 查看 + +单点登录认证系统 MaxKey v2.2.0GA 发布 [2020/09/24] 查看 + +单点登录认证系统 MaxKey v2.2.0RC 发布 [2020/09/04] 查看 + +六个高Star开源项目,让你更懂OAuth和单点登录 [2020/08/17] 查看 + +MaxKey官方网站全新改版 [2020/08/06] MaxKey.top + +单点登录认证系统 MaxKey v2.1.0GA 发布 [2020/08/01] 查看 + +单点登录认证系统 MaxKey v2.0.0GA 发布 [2020/07/13] 查看 + +单点登录认证系统 MaxKey v2.0.0RC1 发布 [2020/06/01] 查看 + +开源sso单点登陆系统推荐,MaxKey社区努力进步中 [2020/05/20]查看 + +单点登录认证系统 MaxKey v1.4.0GA 发布 [2020/05/01] 查看 + +还得看 Java!Gitee 4月最火 Java 项目大盘点 [2020/04/07]查看 + +单点登录认证系统 MaxKey v1.3.0GA 发布 [2020/04/04] 查看 + +单点登录认证系统 MaxKey v1.2.0GA 发布 [2020/02/18] 查看 + +MaxKey单点登录认证系统 oschina收录时间 [2019-12-09]查看 + +MaxKey单点登录认证系统开源重构 [2019-02-07] \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/12_team.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/12_team.md new file mode 100644 index 000000000..12ff0f4ef --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/12_team.md @@ -0,0 +1,140 @@ +--- +title: 项目团队 +--- +## 项目团队 + +一个成功的项目需要许多人扮演许多角色。有些成员编写代码或文档,而另一些成员作为测试人员有价值,可以提交补丁和建议。 + +项目团队由成员和贡献者组成。成员可以直接访问项目的源代码并积极发展代码库。贡献者通过向成员提交补丁和建议来改善项目。该项目的贡献者数量是无限的。今天就参与。非常感谢该项目的所有贡献。 + +## 团队成员 + +以下是具有提交特权的开发者列表,这些开发者以一种或另一种方式直接对项目做出了贡献。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
名称头像CodeID组织角色时区
apacheBrighthttps://github.com/apacheBrightMaxKeyTopPMC MemberAsia/北京
fucan1017https://github.com/fucan1017MaxKeyTopcontributorAsia/北京
FranisiLhttps://github.com/FranisiLMaxKeyTopPMC MemberAsia/北京
Garrett.Xiahttps://github.com/randomNamingMaxKeyTopPMC MemberAsia/北京
shimingxyhttps://github.com/shimingxyMaxKeyTopPMC ChairAsia/北京
+ + +## 贡献者 + +以下其他人员通过建议,补丁或文档的方式为该项目做出了贡献。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
名称头像CodeID组织角色时区问题
stdnt-xiaohttps://github.com/stdnt-xiaocontributorAsia/北京Docker和docker-compose部署的优化
QQ793732900(恍然如梦)contributorAsia/北京解决Maxkey在Chrome “您的连接不是私密连接” 问题
xiazhenyouhttps://github.com/xiazhenyoucontributorAsia/北京MaxKey-SpringBoot4CAS-demo
pcorehttps://gitee.com/pcorecontributorAsia/北京一键登录
yutelhttps://gitee.com/yutelcontributorAsia/北京退出功能优化
alanlandhttps://gitee.com/alanlandcontributorAsia/北京Docker支持
MemoryFhttps://github.com/MemoryFcontributorAsia/北京前后端分离注销问题
+ +## 其他贡献者 + +https://github.com/shimingxy/MaxKey/graphs/contributors diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/13_licenses.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/13_licenses.md new file mode 100644 index 000000000..230b0afc8 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/13_licenses.md @@ -0,0 +1,101 @@ +--- +title: 项目许可证 +--- + +## 概况 +

通常,为项目列出的许可证是项目本身的许可证,而不是依赖项。

+ +## 项目许可证 +

Apache License, Version 2.0

+ + +http://www.apache.org/licenses/LICENSE-2.0 + + +``` +Copyright [2023] [MaxKey of copyright http://www.maxkey.top] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +``` + +## Apache-2.0中文解释 + +Apache License Version 2.0 鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。Apache Licence 也是对商业应用友好的许可,使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。 + + +协议中明确写出,只要遵守该许可的条款和条件的前提下,每位贡献者将被授予永久的、全球性的、非排他性的、免费的、免版税的、不可撤销的版权许可,以复制、准备衍生作品、公开展示、公开使用、再许可、分发本作品和其衍生作品(无论是以“源码”还是“目标”形式)。 + + +也就是不仅可以用,还可以对基于 Apache License Version 2.0 的作品或衍生作品进行修改或增补,并应用到商业项目。但前提是满足以下几个条件: + +1、需要给代码的用户一份 Apache Licence; + +2、如果你修改了代码,需要在被修改的文件中说明; + +3、在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明; + +4、如果再发布的产品中包含一个 Notice 文件,则在 Notice 文件中需要带有 Apache Licence。你可以在 Notice 中增加自己的许可,但不可以表现为对 Apache Licence 构成更改。 + + + +总结下来,就是需要在相关产品的 发行版本,Notice 文件、源码或文档里,添加归属声明的可读拷贝,并给接收者提供开源项目中提供的 Apache License Version 2.0 许可证的拷贝,在分发的衍生作品的源代码中,必须保留本作品源码中的所有版权、专利、商标和归属声明。 + + + +公司在使用 Apache License Version 2.0 授权的开源软件,进行分发的过程中,不应隐瞒或故意忽略提及对此软件的使用。 + +## 版权声明 +必须保留本作品及源码中的所有版权、专利、商标和归属声明,请遵守开源许可证,合规使用开源产品,避免法律纠纷。 + + +仅使用java程序情况,必须在软件前端页脚中添加此声明 + +## 第三方依赖声明 + +参见项目依赖 + + +## 违反开源协议新闻 + +关于Authing.cn在百度搜索关键字“MaxKey单点登录认证系统”侵权的进展通告-2022年07月16日 +
+ +开源项目维权成功案例: spug 开源运维平台成功维权-2022年06月28日 +
+ +删库跑路、“投毒”、改协议,开源有哪几大红线千万不能踩?-2022年06月24日 +
+ +GPL 法律之战:它是自由软件许可证,更具合同效力-2022年05月18日 +
+ +违规再分发 SkyWalking,火山引擎回应并道歉-2022年01月29日 +
+ +关于Authing.cn在百度搜索关键字“MaxKey单点登录认证系统”侵权的通告-2021年12月15日 +
+ +首例!违反 GPL 协议致侵权,被判赔偿 50 万元-2021年09月09日 +
+ +Apache Doris 声明 | 你们想知道的一切,都在这里了-2021年09月09日 +
+ +致老男孩教育的维权声明 - Spug 运维-2021年03月31日 +
+ +博云违反 Apache 2.0 开源协议被要求整改,开源协议到底应该如何遵守?-2020年06月19日 +
+ +开源作者痛斥京东重量级项目抄袭-2018年09月30日 diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/14_cevsenterprise.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/14_cevsenterprise.md new file mode 100644 index 000000000..f647369eb --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/14_cevsenterprise.md @@ -0,0 +1,631 @@ +--- +title: 企业版 +--- + +

企业版和社区版对比

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
模块
Category
功能
Features
社区版
Community
企业版
Enterprise
标准协议OpenID Connect 1.0
标准协议OAuth v2.0/2.1
标准协议SAML V2.0
标准协议CAS 1.0/2.0/3.0
标准协议JWT
标准协议TOKEN令牌支持
标准协议密码代填(FORMBASED)支持
标准协议API扩展支持
标准协议扩展定制支持
认证服务用户登录
认证服务用户登录-图片验证码
认证服务用户登录-短信验证码
认证服务用户登录-TOTP动态令牌
认证服务用户登录-邮件验证码
认证服务用户登录-社交账号登陆
认证服务用户登录-企业微信、钉钉、飞书扫码登陆
认证服务用户登录-双因素认证
认证服务用户登录-Active Directory用户登录
认证服务用户登录-OpenLDAP用户登录
认证服务用户登录-Windows域认证
认证服务HMAC_SHA256信任登录
认证服务IP地址转换行政区域
认证服务登录注销
认证服务 应用访问权限控制
认证服务密码修改
认证服务密码过期修改
认证服务首次登陆密码修改
认证服务找回密码
认证服务安全配置
认证服务用户信息修改
认证服务社交账号绑定
认证服务主题切换
认证服务时间令牌
认证服务 应用账号管理
认证服务 多种设备支持
认证服务 系统登录日志
认证服务 应用访问日志
认证服务Redis集群支持
管理服务机构管理
管理服务用户管理
管理服务账号管理简单映射
管理服务应用管理
管理服务访问控制-会话管理
管理服务访问控制-角色管理
管理服务访问控制-角色成员管理
管理服务访问控制-访问权限管理
管理服务权限管理-资源管理
管理服务权限管理-权限管理
管理服务角色权限管理-细粒度权限
管理服务分级授权-组织授权
管理服务分级授权-应用授权
管理服务分级授权-角色授权
管理服务配置管理-岗位管理
管理服务配置管理-账号策略
管理服务配置管理-同步器管理
管理服务配置管理-适配器管理
管理服务配置管理-密码策略
管理服务管理端单点登录
生命周期管理REST接口机构和用户同步
生命周期管理SCIM2接口机构和用户同步
生命周期管理MQ(RocketMQ/KAFKA)同步支持
生命周期管理同步器把存在上游系统的机构和账号同步到MaxKey
生命周期管理Active Directory同步器
生命周期管理标准LDAP同步器
生命周期管理企业微信同步器
生命周期管理钉钉同步器
生命周期管理飞书同步器
生命周期管理北森HR同步器
生命周期管理连接器把MaxKey的机构和账号同步到下游系统
生命周期管理Active Directory连接器
生命周期管理标准LDAP连接器
生命周期管理企业微信连接器
生命周期管理钉钉连接器
生命周期管理飞书连接器
生命周期管理华为WeLink连接器
日志审计仪表盘报表
日志审计系统管理日志
日志审计系统登录日志
日志审计应用登录日志
日志审计同步器日志
日志审计连接器日志
其他Maven版本
其他JAVA SDK
.NET SDK
其他支持多平台
Windows
LINUX
UNIX
其他支持主流浏览器:
Google Chrome
Mozilla Firefox
Internet Explorer 10
Microsoft Edge
其他支持PC、平板PAD、手机Moblie
其他开发集成指南
客户服务产品文档及安装配置(集群)
开源社区
客户服务版本升级及BUG修复开源社区
客户服务官方QQ支持
客户服务专属微信群/QQ群在线支持
客户服务集成解决方案咨询
客户服务技术培训
客户服务定制开发支持
客户服务客户化界面定制
客户服务紧急故障修复
团队研发团队支持
授权标识许可证声明
必须保留
✅友好
\ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/15_cevscas.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/15_cevscas.md new file mode 100644 index 000000000..209668fc7 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/15_cevscas.md @@ -0,0 +1,621 @@ +--- +title: 开源产品对比 +--- + +

MaxKey和Keycloak/CAS对比

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
模块功能MaxKeyKeycloakApereo CAS
标准协议OpenID Connect 1.0插件
标准协议OAuth v2.0/2.1插件
标准协议SAML V2.0插件
标准协议CAS 1.0/2.0/3.0
标准协议JWT定制定制
标准协议TOKEN令牌支持
标准协议密码代填(FORMBASED)支持
标准协议API扩展支持
标准协议扩展定制支持定制定制
认证服务用户登录
认证服务用户登录-图片验证码定制
认证服务用户登录-短信验证码
认证服务用户登录-TOTP动态令牌定制
认证服务用户登录-邮件验证码
认证服务用户登录-社交账号登陆
认证服务用户登录-企业微信、钉钉扫码登陆
认证服务用户登录-双因素认证定制
认证服务用户登录-Active Directory用户登录
认证服务用户登录-OpenLDAP用户登录
认证服务用户登录-Windows域认证企业版
认证服务登录注销
认证服务 应用访问权限控制定制
认证服务密码修改
认证服务密码过期修改
认证服务首次登陆密码修改
认证服务找回密码
认证服务安全配置
认证服务用户信息修改
认证服务社交账号绑定
认证服务主题切换
认证服务时间令牌插件
认证服务 应用账号管理
认证服务 多种设备支持
认证服务 用户登录日志
认证服务 应用访问日志
认证服务 管理日志
管理服务机构管理
管理服务用户管理
管理服务账号管理
管理服务应用管理
管理服务访问控制-角色管理
管理服务访问控制-角色成员管理
管理服务访问控制-访问控制管理
管理服务权限管理-资源管理
管理服务权限管理-权限管理
管理服务配置管理-同步器管理
管理服务配置管理-适配器管理
管理服务配置管理-密码策略
管理服务管理端单点登录
生命周期管理REST接口机构和用户同步
生命周期管理SCIM2接口机构和用户同步
生命周期管理消息同步支持企业版
生命周期管理同步器把存在上游系统的机构和账号同步到MaxKey
生命周期管理Active Directory同步器
生命周期管理标准LDAP同步器
生命周期管理企业微信同步器
生命周期管理钉钉同步器
生命周期管理连接器把MaxKey的机构和账号同步到下游系统
生命周期管理Active Directory连接器企业版
生命周期管理标准LDAP连接器企业版
生命周期管理企业微信连接器企业版
生命周期管理钉钉连接器企业版
生命周期管理飞书连接器企业版
生命周期管理华为WeLink连接器企业版
日志审计统计报表
日志审计管理日志审计
日志审计登录日志审计
日志审计应用访问日志审计
日志审计连接器日志审计
日志审计同步器日志审计
其他JAVA SDK
.NET SDK
其他支持多平台
Windows
LINUX
UNIX
其他支持主流浏览器:
Google Chrome
Mozilla Firefox
Internet Explorer 10
Microsoft Edge
其他支持PC、平板PAD、手机Moblie
其他开发集成指南
客户服务产品文档及安装配置(集群)
开源社区
开源社区
开源社区
客户服务版本升级及BUG修复开源社区开源社区开源社区
客户服务在线技术支持官方QQ
客户服务集成解决方案咨询企业版
客户服务技术培训企业版
客户服务定制开发支持企业版
客户服务客户化界面定制企业版
客户服务紧急故障修复企业版
团队研发团队国内✅国外国外
授权标识许可证声明不可忽略不可忽略不可忽略
diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/16_dependency.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/16_dependency.md new file mode 100644 index 000000000..3255bf8dc --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/16_dependency.md @@ -0,0 +1,3 @@ +--- +title: 项目依赖 +--- \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/17_roadmap.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/17_roadmap.md new file mode 100644 index 000000000..84c5783fd --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/17_roadmap.md @@ -0,0 +1,270 @@ +--- +title: 开发路线图 +--- + +## Roadmap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
时间计划状态
2023Q3Java 17+
2023Q3Jakarta EE 10+
2023Q3Spring Framework 6
2023Q3Spring Boot 3
+ +## Roadmap-2022 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
时间计划状态
2022Q4docker-compose部署优化
2022Q3Spring Boot 2.7.x
2022Q2前后端分离
2022Q2会话管理
2022Q2二级缓存优化
2022Q2Ant Design of Angular
2022Q2OpenID Connect optimize
2022Q1JWT optimize
2022Q1OAuth 2.1
+ +## Roadmap-2021 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
时间计划状态
2021Q4Zero trust scenario integration
2021Q4腾讯iOA零信任产品适配
2021Q4Bootstrap 5.x
2021Q4SpringBoot 2.6.x
2021Q4docker-compose支持
2021Q3好雨科技Rainbond适配
2021Q3Nacos支持
2021Q3Maxkey-Cloud (micro service support)
2021Q3Multi-Tenancy
2021Q2国产数据库瀚高DB的适配
2021Q2Microsoft Active Directory支持
2021Q2SpringBoot 2.5.x
2021Q1Swagger文档支持
+ +## Roadmap-2020 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
时间计划状态
2020Q4Docker部署支持
2020Q3SAML 2.0优化
2020Q3SCIM 2支持
2020Q3SpringBoot 2.4.x
2020Q2企业微信、钉钉、飞书扫码登录
2020Q2RBAC 基于角色的访问控制
2020Q2短信验证码支持
2020Q1CAS 1.0,2.0,3.0支持
2020Q1Bootstrap 4.x
2020Q1密码策略支持
+ +## Roadmap-2019 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
时间计划状态
2019Q4SpringBoot 2.2.x
2019Q4OAuth 2.0支持
2019Q4SAML 2.0支持
2019Q4JWT支持
\ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/18_links.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/18_links.md new file mode 100644 index 000000000..a07c12956 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/18_links.md @@ -0,0 +1,216 @@ +--- +title: 友情链接 +--- +# 友情链接 + +## Dromara成员 + +Dromara 致力于微服务云原生解决方案的组织。 + +
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+ +
+ +## 友情链接 + +为 MaxKey 提供各种帮助和支持的朋友们,我们一起共奋进 + +
+ + + + + +
+ + + +
+ + + + + +
\ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/_category_.json.bak b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/_category_.json.bak new file mode 100644 index 000000000..080aa9506 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/_category_.json.bak @@ -0,0 +1,8 @@ +{ + "label": "关于", + "position": 1, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important Docusaurus concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/news/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/news/_category_.json new file mode 100644 index 000000000..5ca1af63e --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/news/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "侵权通告", + "link": { + "type": "generated-index", + "description": "侵权通告." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/news/licenses_zqjy.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/news/licenses_zqjy.md new file mode 100644 index 000000000..2bbd2b711 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/news/licenses_zqjy.md @@ -0,0 +1,37 @@ +--- +title: 关于Authing.cn在百度搜索关键字侵权的通告 +--- + +## 版权归属 + +MaxKey单点登录认证系统,谐音马克思的钥匙寓意是最大钥匙,是业界领先的企业级IAM身份管理和认证产品,支持OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM等标准协议,提供简单、标准、安全和开放的用户身份管理(IDM)、身份认证(AM)、单点登录(SSO)、RBAC权限管理和资源管理等。 + +MaxKey单点登录认证系统是Dromara开源组织旗下的产品,并在中国版权保护中心申请软件著作权,软件著作权软件名称为MaxKey单点登录认证系统,简称MaxKey单点登录。 + +## 侵权情况 + +**2021年11月20日**在百度搜索“**MaxKey单点登录认证系统**”关键字,发现以下的搜索结果: + +结果1 + + +结果2 + + +结果3 + + + +Authing(北京蒸汽记忆科技有限公司)旗下有产品和Dromara开源组织的MaxKey单点登录认证系统属于竞争关系,Authing明知故犯,误导了MaxKey单点登录认证系统的客户,侵害了Dromara开源组织的权益,触犯了《**中华人民共和国著作权法**》。 + +## 进展情况 + +2021年11月21日,联系Authing的负责人通知其进行整改 + + + +**2021年11月28日**问题并未得到解决。 + +**2021年11月29日**,通过邮件《10910-关于maxkey单点登录认证系统关键字搜索的问题》告知百度公司存在的问题,同时按照百度要求提交软件著作权并申请百度品牌保护,保护的品牌为**MaxKey单点登录认证系统(MaxKey单点登录)**。 + +**截至2021年12月15日问题还未得到解决,特发此通告。** \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/news/licenses_zqjy_2207.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/news/licenses_zqjy_2207.md new file mode 100644 index 000000000..65ba3f123 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/about/news/licenses_zqjy_2207.md @@ -0,0 +1,33 @@ +--- +title: 关于Authing.cn在百度搜索关键字侵权的进展通告-202207 +--- + +## 版权归属 + +MaxKey单点登录认证系统,谐音马克思的钥匙寓意是最大钥匙,是业界领先的IAM身份管理和认证产品,支持OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM等标准协议,提供安全、标准和开放的用户身份管理(IDM)、身份认证(AM)、单点登录(SSO)、RBAC权限管理和资源管理等。 + +MaxKey单点登录认证系统是Dromara开源组织旗下的产品,并在中国版权保护中心申请软件著作权,软件著作权软件名称为MaxKey单点登录认证系统,简称MaxKey单点登录。 + +## 侵权情况 + +**2022年07月16日**在百度搜索“**MaxKey单点登录认证系统**”关键字,发现以下的搜索结果: + +结果1 + + + +结果2 + + + +结果3 + + + +Authing(北京蒸汽记忆科技有限公司)旗下有产品和Dromara开源组织的MaxKey单点登录认证系统属于竞争关系,Authing明知故犯,误导了MaxKey单点登录认证系统的客户,侵害了Dromara开源组织的权益,触犯了《**中华人民共和国著作权法**》。 + +## 进展情况 + +**2021年11月29日**,通过邮件《10910-关于maxkey单点登录认证系统关键字搜索的问题》告知百度公司存在的问题,同时按照百度要求提交软件著作权并申请百度品牌保护,保护的品牌为**MaxKey单点登录认证系统(MaxKey单点登录)**。 + +**截至2022年07月16日问题任未得到解决,特发此通告。** \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/index.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/index.md new file mode 100644 index 000000000..8a491d438 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/en/index.md @@ -0,0 +1,273 @@ +--- +title: MaxKey-业界领先的身份管理和认证产品 +hide_table_of_contents: true +--- +
+

+
+ 业界领先的身份管理和认证产品. +
+
+

+
+ 安全 连接 .  + 传递 信任 +
+
+
+

+ +
+
+
+
+

统一认证

+
    +
  • 统一企业内部的登录入口,无需记住多个应用地址,简化账号登录过程,保护账号和密码安全。
  • +
  • 内置LDAP或Active Directory支持;提供自定义Provider接口,轻松集成现有存储第三方用户数据。
  • +
  • 支持企业微信、钉钉、飞书扫码登录,微信、QQ、钉钉、微博、微软、Google、Facebook等社交账号登录信任。
  • +
+
+
+

单点登录

+
    +
  • 用户只需要登录一次就可以访问所有相互信任的应用系统,支持用户映射到不同应用账号的机制。
  • +
  • 用户在认证门户中点击应用图标轻松访问应用系统,提供自助服务功能。
  • +
  • 用户退出时单点注销,所有登录统一退出,保证系统的安全行。
  • +
+
+
+

标准服务

+
    +
  • 提供简单、标准、安全和开放的用户身份管理(IDM)、身份认证(AM)、单点登录(SSO)、资源管理和权限管理等
  • +
  • 标准协议支持OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS等。
  • +
  • 基于同步器和连接器(Connector)的管理架构实现用户生命周期管理,便捷同步上游用户数据至下游应用,降低手动维护账号的成本。
  • +
+
+
+

安全审计

+
    +
  • 标准安全策略包括密码策略,访问策略。
  • +
  • 安全日志记录,包括登录日志、访问日志、密码修改日志、变更日志等。
  • +
  • 事后安全审计,对用户全生命周期审计、访问行为记录追溯审计、安全合规审计、安全风险预警。
  • +
+
+
+
+
+

业界标准协议

+

支持OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM2.0等业界标准协议;

+

简化微软Active Directory域控、标准LDAP服务器机构和账号管理,密码自助服务重置密码;

+

提供用户生命周期管理,支持SCIM 2协议;开箱即用的连接器(Connector)实现身份供给同步;

+

基于用户角色访问权限控制(RBAC),方便权限管理控制;

+ 查看详情 +
+
+
+
+
+

+ 社交账号 + 集成 +

+

企业微信、钉钉、飞书扫码登录,微信、QQ、钉钉、微博、微软、Google、Facebook等社交账号登陆信任。

+

开箱即用连接器,轻松打通社交账号,包括企业微信,钉钉,飞书,华为WeLink等。

+

界面化的配置,管理员通过管理界面即可完成社交账号登录配置。

+ 查看详情 +
+
+
+
+
+

优雅界面设计 UI

+

采用Ant Design企业级产品的设计体系,基于「自然」、「确定性」、「意义感」、「生长性」四大设计价值观,通过模块化解决方案,降低冗余的生产成本,提高用户体验。

+

管理员通过管理界面简单操作即可完成组织、用户、应用、权限的管理。

+

管理员通过管理界面可进行账号管理,会话查询和终止,进行历史日志的审计和统计。

+ 查看详情 +
+
+
+
+

产品特性

+

MaxKey可以快速的进行企业的用户和机构统一管理和同步,实现用户生命周期的管理;通过标准的协议快捷完成应用认证的集成,支持PC、平板、手机多种设备的接入。

+
+
+
+
+
+

构建企业目录服务

+

统一企业机构和用户主数据,构建企业目录服务。

+
+
+
+

单点登录

+

一次登录,访问所有授权应用。

+
+
+
+

标准协议

+

OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM2.0标准协议。

+
+
+
+

社交账号集成

+

企业微信、钉钉、飞书扫码登录,微信、钉钉、微软、Google、Facebook等社交账号登陆信任。

+
+
+
+
+
+

多因素认证

+

支持图片动态验证码、短信验证码、Google Authenticator等TOTP或者HOTP。

+
+
+
+

用户生命周期管理

+

提供标准REST和SCIM2.0接口轻松完成机构和用户同步,基于队列和连接器(Connector)的管理架构。

+
+
+
+

开箱即用连接器

+

企业微信,钉钉,飞书,华为WeLink,SCIM 2,ActiveDirectory ,LDAP ,JDBC等开箱即用连接器。

+
+
+
+

账号同步器

+

企业微信,钉钉,北森HR,ActiveDirectory ,LDAP同步器,快速集成已有账号体系。

+
+
+
+
+
+

零信任

+

以数字身份为基石,全面支持零信任。

+
+
+
+

安全策略及审计

+

配置化的密码策略,访问策略;强大安全审计,对用户全生命周期审计、访问行为记录追溯审计、安全合规审计、安全风险预警。

+
+
+
+

企业版

+

企业版提高客户体验和降低企业内部的自开发成本。

+
+
+
+

云服务

+

提供IDaas云服务,快速完成服务的部署。

+
+
+
+
+
+

顶尖研发团队

+

资深专家团队成员,具有多年IAM研发和咨询经验。

+
+
+
+

最有价值开源项目

+

国内开源IAM第一品牌,Gitee官方最有价值开源项目(GVP)。

+
+
+
+

完善的社区

+

社区提供全方位咨询和技术支持,同时提供企业版服务。

+
+
+
+

开源可控

+

基于Apache License 2.0,开源、安全、自主可控。

+
+
+
+
+

社区

+

社区帮助您获取最新的版本,提供交流的场所,讨论产品的发展方向及技术方案,解决您在开发部署中遇到的问题,加入我们,共建社区!

+
+
+
+
+

最新版本

+
+ 发布日期: 2022-10-25| 版本: v3.5.9 +
+
+
+

官方QQ

+
+ 1054466084 +
+
+
+

电子邮件

+
+ + support@maxsso.net + +
+
+
+

合作伙伴

+

+ +
diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/index.js.bak b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/index.js.bak new file mode 100644 index 000000000..99cb362a5 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/index.js.bak @@ -0,0 +1,39 @@ +import clsx from 'clsx'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Layout from '@theme/Layout'; +import HomepageFeatures from '@site/src/components/HomepageFeatures'; + +import Heading from '@theme/Heading'; +import styles from './index.module.css'; + +function HomepageHeader() { + const {siteConfig} = useDocusaurusContext(); + return ( +
+
+ + {siteConfig.title} + +

{siteConfig.tagline}

+
+ +
+
+
+ ); +} + +export default function Home() { + const {siteConfig} = useDocusaurusContext(); + return ( + + +
+ +
+
+ ); +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/index.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/index.md new file mode 100644 index 000000000..a8aaeedcc --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/index.md @@ -0,0 +1,32 @@ +--- +title: MaxKey-业界领先的身份管理和认证产品 +hide_table_of_contents: true +--- +
+

+
+ 业界领先的身份管理和认证产品. +
+
+

+
+ 安全 连接 .  + 传递 信任 +
+
+
+

+ +
+
+ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/index.module.css b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/index.module.css new file mode 100644 index 000000000..9f71a5da7 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/index.module.css @@ -0,0 +1,23 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 996px) { + .heroBanner { + padding: 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/markdown-page.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/markdown-page.md new file mode 100644 index 000000000..9756c5b66 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/markdown-page.md @@ -0,0 +1,7 @@ +--- +title: Markdown page example +--- + +# Markdown page example + +You don't need React to write simple standalone pages. diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/ppts.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/ppts.md new file mode 100644 index 000000000..1707a1841 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/src/pages/ppts.md @@ -0,0 +1,42 @@ +--- +layout: zh/default +--- + +

MaxKey方案介绍

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/.nojekyll b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/HELP-US-OUT.txt b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/HELP-US-OUT.txt new file mode 100644 index 000000000..83d083dd7 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/HELP-US-OUT.txt @@ -0,0 +1,7 @@ +I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, +Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, +comprehensive icon sets or copy and paste your own. + +Please. Check it out. + +-Dave Gandy diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/css/font-awesome.css b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/css/font-awesome.css new file mode 100644 index 000000000..ee906a819 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/css/font-awesome.css @@ -0,0 +1,2337 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.7.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.fa-pull-left { + float: left; +} +.fa-pull-right { + float: right; +} +.fa.fa-pull-left { + margin-right: .3em; +} +.fa.fa-pull-right { + margin-left: .3em; +} +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook-f:before, +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before, +.fa-gratipay:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper-pp:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-intersex:before, +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} +.fa-yc:before, +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: "\f240"; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-sticky-note:before { + content: "\f249"; +} +.fa-sticky-note-o:before { + content: "\f24a"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-balance-scale:before { + content: "\f24e"; +} +.fa-hourglass-o:before { + content: "\f250"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-hourglass:before { + content: "\f254"; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: "\f255"; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: "\f256"; +} +.fa-hand-scissors-o:before { + content: "\f257"; +} +.fa-hand-lizard-o:before { + content: "\f258"; +} +.fa-hand-spock-o:before { + content: "\f259"; +} +.fa-hand-pointer-o:before { + content: "\f25a"; +} +.fa-hand-peace-o:before { + content: "\f25b"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-tripadvisor:before { + content: "\f262"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-odnoklassniki-square:before { + content: "\f264"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-tv:before, +.fa-television:before { + content: "\f26c"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-calendar-plus-o:before { + content: "\f271"; +} +.fa-calendar-minus-o:before { + content: "\f272"; +} +.fa-calendar-times-o:before { + content: "\f273"; +} +.fa-calendar-check-o:before { + content: "\f274"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-map-signs:before { + content: "\f277"; +} +.fa-map-o:before { + content: "\f278"; +} +.fa-map:before { + content: "\f279"; +} +.fa-commenting:before { + content: "\f27a"; +} +.fa-commenting-o:before { + content: "\f27b"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-vimeo:before { + content: "\f27d"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-credit-card-alt:before { + content: "\f283"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-pause-circle-o:before { + content: "\f28c"; +} +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-stop-circle-o:before { + content: "\f28e"; +} +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-hashtag:before { + content: "\f292"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-percent:before { + content: "\f295"; +} +.fa-gitlab:before { + content: "\f296"; +} +.fa-wpbeginner:before { + content: "\f297"; +} +.fa-wpforms:before { + content: "\f298"; +} +.fa-envira:before { + content: "\f299"; +} +.fa-universal-access:before { + content: "\f29a"; +} +.fa-wheelchair-alt:before { + content: "\f29b"; +} +.fa-question-circle-o:before { + content: "\f29c"; +} +.fa-blind:before { + content: "\f29d"; +} +.fa-audio-description:before { + content: "\f29e"; +} +.fa-volume-control-phone:before { + content: "\f2a0"; +} +.fa-braille:before { + content: "\f2a1"; +} +.fa-assistive-listening-systems:before { + content: "\f2a2"; +} +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; +} +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: "\f2a4"; +} +.fa-glide:before { + content: "\f2a5"; +} +.fa-glide-g:before { + content: "\f2a6"; +} +.fa-signing:before, +.fa-sign-language:before { + content: "\f2a7"; +} +.fa-low-vision:before { + content: "\f2a8"; +} +.fa-viadeo:before { + content: "\f2a9"; +} +.fa-viadeo-square:before { + content: "\f2aa"; +} +.fa-snapchat:before { + content: "\f2ab"; +} +.fa-snapchat-ghost:before { + content: "\f2ac"; +} +.fa-snapchat-square:before { + content: "\f2ad"; +} +.fa-pied-piper:before { + content: "\f2ae"; +} +.fa-first-order:before { + content: "\f2b0"; +} +.fa-yoast:before { + content: "\f2b1"; +} +.fa-themeisle:before { + content: "\f2b2"; +} +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: "\f2b3"; +} +.fa-fa:before, +.fa-font-awesome:before { + content: "\f2b4"; +} +.fa-handshake-o:before { + content: "\f2b5"; +} +.fa-envelope-open:before { + content: "\f2b6"; +} +.fa-envelope-open-o:before { + content: "\f2b7"; +} +.fa-linode:before { + content: "\f2b8"; +} +.fa-address-book:before { + content: "\f2b9"; +} +.fa-address-book-o:before { + content: "\f2ba"; +} +.fa-vcard:before, +.fa-address-card:before { + content: "\f2bb"; +} +.fa-vcard-o:before, +.fa-address-card-o:before { + content: "\f2bc"; +} +.fa-user-circle:before { + content: "\f2bd"; +} +.fa-user-circle-o:before { + content: "\f2be"; +} +.fa-user-o:before { + content: "\f2c0"; +} +.fa-id-badge:before { + content: "\f2c1"; +} +.fa-drivers-license:before, +.fa-id-card:before { + content: "\f2c2"; +} +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: "\f2c3"; +} +.fa-quora:before { + content: "\f2c4"; +} +.fa-free-code-camp:before { + content: "\f2c5"; +} +.fa-telegram:before { + content: "\f2c6"; +} +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: "\f2c7"; +} +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: "\f2c8"; +} +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: "\f2c9"; +} +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: "\f2ca"; +} +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: "\f2cb"; +} +.fa-shower:before { + content: "\f2cc"; +} +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: "\f2cd"; +} +.fa-podcast:before { + content: "\f2ce"; +} +.fa-window-maximize:before { + content: "\f2d0"; +} +.fa-window-minimize:before { + content: "\f2d1"; +} +.fa-window-restore:before { + content: "\f2d2"; +} +.fa-times-rectangle:before, +.fa-window-close:before { + content: "\f2d3"; +} +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: "\f2d4"; +} +.fa-bandcamp:before { + content: "\f2d5"; +} +.fa-grav:before { + content: "\f2d6"; +} +.fa-etsy:before { + content: "\f2d7"; +} +.fa-imdb:before { + content: "\f2d8"; +} +.fa-ravelry:before { + content: "\f2d9"; +} +.fa-eercast:before { + content: "\f2da"; +} +.fa-microchip:before { + content: "\f2db"; +} +.fa-snowflake-o:before { + content: "\f2dc"; +} +.fa-superpowers:before { + content: "\f2dd"; +} +.fa-wpexplorer:before { + content: "\f2de"; +} +.fa-meetup:before { + content: "\f2e0"; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/css/font-awesome.min.css b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/css/font-awesome.min.css new file mode 100644 index 000000000..540440ce8 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/FontAwesome.otf b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/FontAwesome.otf new file mode 100644 index 000000000..401ec0f36 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/FontAwesome.otf differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/fontawesome-webfont.eot b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/fontawesome-webfont.eot differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/fontawesome-webfont.svg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/fontawesome-webfont.woff b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/fontawesome-webfont.woff differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/animated.less b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/animated.less new file mode 100644 index 000000000..66ad52a5b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/animated.less @@ -0,0 +1,34 @@ +// Animated Icons +// -------------------------- + +.@{fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.@{fa-css-prefix}-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/bordered-pulled.less b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/bordered-pulled.less new file mode 100644 index 000000000..f1c8ad75f --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/bordered-pulled.less @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.@{fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em @fa-border-color; + border-radius: .1em; +} + +.@{fa-css-prefix}-pull-left { float: left; } +.@{fa-css-prefix}-pull-right { float: right; } + +.@{fa-css-prefix} { + &.@{fa-css-prefix}-pull-left { margin-right: .3em; } + &.@{fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.@{fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/core.less b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/core.less new file mode 100644 index 000000000..c577ac84a --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/core.less @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.@{fa-css-prefix} { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/fixed-width.less b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/fixed-width.less new file mode 100644 index 000000000..110289f2f --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/fixed-width.less @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.@{fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/font-awesome.less b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/font-awesome.less new file mode 100644 index 000000000..c3677def3 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/font-awesome.less @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables.less"; +@import "mixins.less"; +@import "path.less"; +@import "core.less"; +@import "larger.less"; +@import "fixed-width.less"; +@import "list.less"; +@import "bordered-pulled.less"; +@import "animated.less"; +@import "rotated-flipped.less"; +@import "stacked.less"; +@import "icons.less"; +@import "screen-reader.less"; diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/icons.less b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/icons.less new file mode 100644 index 000000000..159d60042 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/icons.less @@ -0,0 +1,789 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.@{fa-css-prefix}-glass:before { content: @fa-var-glass; } +.@{fa-css-prefix}-music:before { content: @fa-var-music; } +.@{fa-css-prefix}-search:before { content: @fa-var-search; } +.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } +.@{fa-css-prefix}-heart:before { content: @fa-var-heart; } +.@{fa-css-prefix}-star:before { content: @fa-var-star; } +.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } +.@{fa-css-prefix}-user:before { content: @fa-var-user; } +.@{fa-css-prefix}-film:before { content: @fa-var-film; } +.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } +.@{fa-css-prefix}-th:before { content: @fa-var-th; } +.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } +.@{fa-css-prefix}-check:before { content: @fa-var-check; } +.@{fa-css-prefix}-remove:before, +.@{fa-css-prefix}-close:before, +.@{fa-css-prefix}-times:before { content: @fa-var-times; } +.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } +.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } +.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } +.@{fa-css-prefix}-signal:before { content: @fa-var-signal; } +.@{fa-css-prefix}-gear:before, +.@{fa-css-prefix}-cog:before { content: @fa-var-cog; } +.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } +.@{fa-css-prefix}-home:before { content: @fa-var-home; } +.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } +.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } +.@{fa-css-prefix}-road:before { content: @fa-var-road; } +.@{fa-css-prefix}-download:before { content: @fa-var-download; } +.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } +.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } +.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } +.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } +.@{fa-css-prefix}-rotate-right:before, +.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } +.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } +.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } +.@{fa-css-prefix}-lock:before { content: @fa-var-lock; } +.@{fa-css-prefix}-flag:before { content: @fa-var-flag; } +.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } +.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } +.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } +.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } +.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } +.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } +.@{fa-css-prefix}-tag:before { content: @fa-var-tag; } +.@{fa-css-prefix}-tags:before { content: @fa-var-tags; } +.@{fa-css-prefix}-book:before { content: @fa-var-book; } +.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } +.@{fa-css-prefix}-print:before { content: @fa-var-print; } +.@{fa-css-prefix}-camera:before { content: @fa-var-camera; } +.@{fa-css-prefix}-font:before { content: @fa-var-font; } +.@{fa-css-prefix}-bold:before { content: @fa-var-bold; } +.@{fa-css-prefix}-italic:before { content: @fa-var-italic; } +.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } +.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } +.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } +.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } +.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } +.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } +.@{fa-css-prefix}-list:before { content: @fa-var-list; } +.@{fa-css-prefix}-dedent:before, +.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } +.@{fa-css-prefix}-indent:before { content: @fa-var-indent; } +.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } +.@{fa-css-prefix}-photo:before, +.@{fa-css-prefix}-image:before, +.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } +.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } +.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } +.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } +.@{fa-css-prefix}-tint:before { content: @fa-var-tint; } +.@{fa-css-prefix}-edit:before, +.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } +.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } +.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } +.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } +.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } +.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } +.@{fa-css-prefix}-backward:before { content: @fa-var-backward; } +.@{fa-css-prefix}-play:before { content: @fa-var-play; } +.@{fa-css-prefix}-pause:before { content: @fa-var-pause; } +.@{fa-css-prefix}-stop:before { content: @fa-var-stop; } +.@{fa-css-prefix}-forward:before { content: @fa-var-forward; } +.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } +.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } +.@{fa-css-prefix}-eject:before { content: @fa-var-eject; } +.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } +.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } +.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } +.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } +.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } +.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } +.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } +.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } +.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } +.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } +.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } +.@{fa-css-prefix}-ban:before { content: @fa-var-ban; } +.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } +.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } +.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } +.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } +.@{fa-css-prefix}-mail-forward:before, +.@{fa-css-prefix}-share:before { content: @fa-var-share; } +.@{fa-css-prefix}-expand:before { content: @fa-var-expand; } +.@{fa-css-prefix}-compress:before { content: @fa-var-compress; } +.@{fa-css-prefix}-plus:before { content: @fa-var-plus; } +.@{fa-css-prefix}-minus:before { content: @fa-var-minus; } +.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } +.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } +.@{fa-css-prefix}-gift:before { content: @fa-var-gift; } +.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } +.@{fa-css-prefix}-fire:before { content: @fa-var-fire; } +.@{fa-css-prefix}-eye:before { content: @fa-var-eye; } +.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } +.@{fa-css-prefix}-warning:before, +.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } +.@{fa-css-prefix}-plane:before { content: @fa-var-plane; } +.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } +.@{fa-css-prefix}-random:before { content: @fa-var-random; } +.@{fa-css-prefix}-comment:before { content: @fa-var-comment; } +.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } +.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } +.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } +.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } +.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } +.@{fa-css-prefix}-folder:before { content: @fa-var-folder; } +.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } +.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } +.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } +.@{fa-css-prefix}-bar-chart-o:before, +.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } +.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } +.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } +.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } +.@{fa-css-prefix}-key:before { content: @fa-var-key; } +.@{fa-css-prefix}-gears:before, +.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } +.@{fa-css-prefix}-comments:before { content: @fa-var-comments; } +.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } +.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } +.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } +.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } +.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } +.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } +.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } +.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } +.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } +.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } +.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } +.@{fa-css-prefix}-upload:before { content: @fa-var-upload; } +.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } +.@{fa-css-prefix}-phone:before { content: @fa-var-phone; } +.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } +.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } +.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } +.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } +.@{fa-css-prefix}-facebook-f:before, +.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } +.@{fa-css-prefix}-github:before { content: @fa-var-github; } +.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } +.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } +.@{fa-css-prefix}-feed:before, +.@{fa-css-prefix}-rss:before { content: @fa-var-rss; } +.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } +.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } +.@{fa-css-prefix}-bell:before { content: @fa-var-bell; } +.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } +.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } +.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } +.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } +.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } +.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } +.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } +.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } +.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } +.@{fa-css-prefix}-globe:before { content: @fa-var-globe; } +.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } +.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } +.@{fa-css-prefix}-filter:before { content: @fa-var-filter; } +.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } +.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } +.@{fa-css-prefix}-group:before, +.@{fa-css-prefix}-users:before { content: @fa-var-users; } +.@{fa-css-prefix}-chain:before, +.@{fa-css-prefix}-link:before { content: @fa-var-link; } +.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } +.@{fa-css-prefix}-flask:before { content: @fa-var-flask; } +.@{fa-css-prefix}-cut:before, +.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } +.@{fa-css-prefix}-copy:before, +.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } +.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } +.@{fa-css-prefix}-save:before, +.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } +.@{fa-css-prefix}-square:before { content: @fa-var-square; } +.@{fa-css-prefix}-navicon:before, +.@{fa-css-prefix}-reorder:before, +.@{fa-css-prefix}-bars:before { content: @fa-var-bars; } +.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } +.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } +.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } +.@{fa-css-prefix}-underline:before { content: @fa-var-underline; } +.@{fa-css-prefix}-table:before { content: @fa-var-table; } +.@{fa-css-prefix}-magic:before { content: @fa-var-magic; } +.@{fa-css-prefix}-truck:before { content: @fa-var-truck; } +.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } +.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } +.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } +.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } +.@{fa-css-prefix}-money:before { content: @fa-var-money; } +.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } +.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } +.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } +.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } +.@{fa-css-prefix}-columns:before { content: @fa-var-columns; } +.@{fa-css-prefix}-unsorted:before, +.@{fa-css-prefix}-sort:before { content: @fa-var-sort; } +.@{fa-css-prefix}-sort-down:before, +.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } +.@{fa-css-prefix}-sort-up:before, +.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } +.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } +.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } +.@{fa-css-prefix}-rotate-left:before, +.@{fa-css-prefix}-undo:before { content: @fa-var-undo; } +.@{fa-css-prefix}-legal:before, +.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } +.@{fa-css-prefix}-dashboard:before, +.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } +.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } +.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } +.@{fa-css-prefix}-flash:before, +.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } +.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } +.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } +.@{fa-css-prefix}-paste:before, +.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } +.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } +.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } +.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } +.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } +.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } +.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } +.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } +.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } +.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } +.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } +.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } +.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } +.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } +.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } +.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } +.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } +.@{fa-css-prefix}-beer:before { content: @fa-var-beer; } +.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } +.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } +.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } +.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } +.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } +.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } +.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } +.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } +.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } +.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } +.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } +.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } +.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } +.@{fa-css-prefix}-mobile-phone:before, +.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } +.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } +.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } +.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } +.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } +.@{fa-css-prefix}-circle:before { content: @fa-var-circle; } +.@{fa-css-prefix}-mail-reply:before, +.@{fa-css-prefix}-reply:before { content: @fa-var-reply; } +.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } +.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } +.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } +.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } +.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } +.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } +.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } +.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } +.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } +.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } +.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } +.@{fa-css-prefix}-code:before { content: @fa-var-code; } +.@{fa-css-prefix}-mail-reply-all:before, +.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } +.@{fa-css-prefix}-star-half-empty:before, +.@{fa-css-prefix}-star-half-full:before, +.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } +.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } +.@{fa-css-prefix}-crop:before { content: @fa-var-crop; } +.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } +.@{fa-css-prefix}-unlink:before, +.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } +.@{fa-css-prefix}-question:before { content: @fa-var-question; } +.@{fa-css-prefix}-info:before { content: @fa-var-info; } +.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } +.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } +.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } +.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } +.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } +.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } +.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } +.@{fa-css-prefix}-shield:before { content: @fa-var-shield; } +.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } +.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } +.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } +.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } +.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } +.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } +.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } +.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } +.@{fa-css-prefix}-html5:before { content: @fa-var-html5; } +.@{fa-css-prefix}-css3:before { content: @fa-var-css3; } +.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } +.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } +.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } +.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } +.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } +.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } +.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } +.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } +.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } +.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } +.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } +.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } +.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } +.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } +.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } +.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } +.@{fa-css-prefix}-compass:before { content: @fa-var-compass; } +.@{fa-css-prefix}-toggle-down:before, +.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } +.@{fa-css-prefix}-toggle-up:before, +.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } +.@{fa-css-prefix}-toggle-right:before, +.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } +.@{fa-css-prefix}-euro:before, +.@{fa-css-prefix}-eur:before { content: @fa-var-eur; } +.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } +.@{fa-css-prefix}-dollar:before, +.@{fa-css-prefix}-usd:before { content: @fa-var-usd; } +.@{fa-css-prefix}-rupee:before, +.@{fa-css-prefix}-inr:before { content: @fa-var-inr; } +.@{fa-css-prefix}-cny:before, +.@{fa-css-prefix}-rmb:before, +.@{fa-css-prefix}-yen:before, +.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } +.@{fa-css-prefix}-ruble:before, +.@{fa-css-prefix}-rouble:before, +.@{fa-css-prefix}-rub:before { content: @fa-var-rub; } +.@{fa-css-prefix}-won:before, +.@{fa-css-prefix}-krw:before { content: @fa-var-krw; } +.@{fa-css-prefix}-bitcoin:before, +.@{fa-css-prefix}-btc:before { content: @fa-var-btc; } +.@{fa-css-prefix}-file:before { content: @fa-var-file; } +.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } +.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } +.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } +.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } +.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } +.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } +.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } +.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } +.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } +.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } +.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } +.@{fa-css-prefix}-xing:before { content: @fa-var-xing; } +.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } +.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } +.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } +.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } +.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } +.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } +.@{fa-css-prefix}-adn:before { content: @fa-var-adn; } +.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } +.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } +.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } +.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } +.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } +.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } +.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } +.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } +.@{fa-css-prefix}-apple:before { content: @fa-var-apple; } +.@{fa-css-prefix}-windows:before { content: @fa-var-windows; } +.@{fa-css-prefix}-android:before { content: @fa-var-android; } +.@{fa-css-prefix}-linux:before { content: @fa-var-linux; } +.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } +.@{fa-css-prefix}-skype:before { content: @fa-var-skype; } +.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } +.@{fa-css-prefix}-trello:before { content: @fa-var-trello; } +.@{fa-css-prefix}-female:before { content: @fa-var-female; } +.@{fa-css-prefix}-male:before { content: @fa-var-male; } +.@{fa-css-prefix}-gittip:before, +.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; } +.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } +.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } +.@{fa-css-prefix}-archive:before { content: @fa-var-archive; } +.@{fa-css-prefix}-bug:before { content: @fa-var-bug; } +.@{fa-css-prefix}-vk:before { content: @fa-var-vk; } +.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } +.@{fa-css-prefix}-renren:before { content: @fa-var-renren; } +.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } +.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } +.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } +.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } +.@{fa-css-prefix}-toggle-left:before, +.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } +.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } +.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } +.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } +.@{fa-css-prefix}-turkish-lira:before, +.@{fa-css-prefix}-try:before { content: @fa-var-try; } +.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } +.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } +.@{fa-css-prefix}-slack:before { content: @fa-var-slack; } +.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } +.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } +.@{fa-css-prefix}-openid:before { content: @fa-var-openid; } +.@{fa-css-prefix}-institution:before, +.@{fa-css-prefix}-bank:before, +.@{fa-css-prefix}-university:before { content: @fa-var-university; } +.@{fa-css-prefix}-mortar-board:before, +.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } +.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } +.@{fa-css-prefix}-google:before { content: @fa-var-google; } +.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } +.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } +.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } +.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } +.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } +.@{fa-css-prefix}-digg:before { content: @fa-var-digg; } +.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; } +.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } +.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } +.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } +.@{fa-css-prefix}-language:before { content: @fa-var-language; } +.@{fa-css-prefix}-fax:before { content: @fa-var-fax; } +.@{fa-css-prefix}-building:before { content: @fa-var-building; } +.@{fa-css-prefix}-child:before { content: @fa-var-child; } +.@{fa-css-prefix}-paw:before { content: @fa-var-paw; } +.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } +.@{fa-css-prefix}-cube:before { content: @fa-var-cube; } +.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } +.@{fa-css-prefix}-behance:before { content: @fa-var-behance; } +.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } +.@{fa-css-prefix}-steam:before { content: @fa-var-steam; } +.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } +.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } +.@{fa-css-prefix}-automobile:before, +.@{fa-css-prefix}-car:before { content: @fa-var-car; } +.@{fa-css-prefix}-cab:before, +.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } +.@{fa-css-prefix}-tree:before { content: @fa-var-tree; } +.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } +.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } +.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } +.@{fa-css-prefix}-database:before { content: @fa-var-database; } +.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } +.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } +.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } +.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } +.@{fa-css-prefix}-file-photo-o:before, +.@{fa-css-prefix}-file-picture-o:before, +.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } +.@{fa-css-prefix}-file-zip-o:before, +.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } +.@{fa-css-prefix}-file-sound-o:before, +.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } +.@{fa-css-prefix}-file-movie-o:before, +.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } +.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } +.@{fa-css-prefix}-vine:before { content: @fa-var-vine; } +.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } +.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } +.@{fa-css-prefix}-life-bouy:before, +.@{fa-css-prefix}-life-buoy:before, +.@{fa-css-prefix}-life-saver:before, +.@{fa-css-prefix}-support:before, +.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } +.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } +.@{fa-css-prefix}-ra:before, +.@{fa-css-prefix}-resistance:before, +.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } +.@{fa-css-prefix}-ge:before, +.@{fa-css-prefix}-empire:before { content: @fa-var-empire; } +.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } +.@{fa-css-prefix}-git:before { content: @fa-var-git; } +.@{fa-css-prefix}-y-combinator-square:before, +.@{fa-css-prefix}-yc-square:before, +.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } +.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } +.@{fa-css-prefix}-qq:before { content: @fa-var-qq; } +.@{fa-css-prefix}-wechat:before, +.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } +.@{fa-css-prefix}-send:before, +.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } +.@{fa-css-prefix}-send-o:before, +.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } +.@{fa-css-prefix}-history:before { content: @fa-var-history; } +.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } +.@{fa-css-prefix}-header:before { content: @fa-var-header; } +.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } +.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } +.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } +.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } +.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } +.@{fa-css-prefix}-soccer-ball-o:before, +.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } +.@{fa-css-prefix}-tty:before { content: @fa-var-tty; } +.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } +.@{fa-css-prefix}-plug:before { content: @fa-var-plug; } +.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } +.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } +.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } +.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } +.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } +.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } +.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } +.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } +.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } +.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } +.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } +.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } +.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } +.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } +.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } +.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } +.@{fa-css-prefix}-trash:before { content: @fa-var-trash; } +.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } +.@{fa-css-prefix}-at:before { content: @fa-var-at; } +.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } +.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } +.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } +.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } +.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } +.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } +.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } +.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } +.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } +.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } +.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } +.@{fa-css-prefix}-bus:before { content: @fa-var-bus; } +.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } +.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } +.@{fa-css-prefix}-cc:before { content: @fa-var-cc; } +.@{fa-css-prefix}-shekel:before, +.@{fa-css-prefix}-sheqel:before, +.@{fa-css-prefix}-ils:before { content: @fa-var-ils; } +.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } +.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; } +.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; } +.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; } +.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; } +.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; } +.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; } +.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; } +.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; } +.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; } +.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; } +.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; } +.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; } +.@{fa-css-prefix}-ship:before { content: @fa-var-ship; } +.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; } +.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; } +.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; } +.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; } +.@{fa-css-prefix}-venus:before { content: @fa-var-venus; } +.@{fa-css-prefix}-mars:before { content: @fa-var-mars; } +.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; } +.@{fa-css-prefix}-intersex:before, +.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; } +.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; } +.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; } +.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; } +.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; } +.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; } +.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; } +.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; } +.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; } +.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; } +.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; } +.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; } +.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; } +.@{fa-css-prefix}-server:before { content: @fa-var-server; } +.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; } +.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; } +.@{fa-css-prefix}-hotel:before, +.@{fa-css-prefix}-bed:before { content: @fa-var-bed; } +.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; } +.@{fa-css-prefix}-train:before { content: @fa-var-train; } +.@{fa-css-prefix}-subway:before { content: @fa-var-subway; } +.@{fa-css-prefix}-medium:before { content: @fa-var-medium; } +.@{fa-css-prefix}-yc:before, +.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; } +.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; } +.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; } +.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; } +.@{fa-css-prefix}-battery-4:before, +.@{fa-css-prefix}-battery:before, +.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; } +.@{fa-css-prefix}-battery-3:before, +.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; } +.@{fa-css-prefix}-battery-2:before, +.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; } +.@{fa-css-prefix}-battery-1:before, +.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; } +.@{fa-css-prefix}-battery-0:before, +.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; } +.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; } +.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; } +.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; } +.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; } +.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; } +.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; } +.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; } +.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; } +.@{fa-css-prefix}-clone:before { content: @fa-var-clone; } +.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; } +.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; } +.@{fa-css-prefix}-hourglass-1:before, +.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; } +.@{fa-css-prefix}-hourglass-2:before, +.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; } +.@{fa-css-prefix}-hourglass-3:before, +.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; } +.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; } +.@{fa-css-prefix}-hand-grab-o:before, +.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; } +.@{fa-css-prefix}-hand-stop-o:before, +.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; } +.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; } +.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; } +.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; } +.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; } +.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; } +.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; } +.@{fa-css-prefix}-registered:before { content: @fa-var-registered; } +.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; } +.@{fa-css-prefix}-gg:before { content: @fa-var-gg; } +.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; } +.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; } +.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; } +.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; } +.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; } +.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; } +.@{fa-css-prefix}-safari:before { content: @fa-var-safari; } +.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; } +.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; } +.@{fa-css-prefix}-opera:before { content: @fa-var-opera; } +.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; } +.@{fa-css-prefix}-tv:before, +.@{fa-css-prefix}-television:before { content: @fa-var-television; } +.@{fa-css-prefix}-contao:before { content: @fa-var-contao; } +.@{fa-css-prefix}-500px:before { content: @fa-var-500px; } +.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; } +.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; } +.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; } +.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; } +.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; } +.@{fa-css-prefix}-industry:before { content: @fa-var-industry; } +.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; } +.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; } +.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; } +.@{fa-css-prefix}-map:before { content: @fa-var-map; } +.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; } +.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; } +.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; } +.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; } +.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; } +.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; } +.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; } +.@{fa-css-prefix}-edge:before { content: @fa-var-edge; } +.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; } +.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; } +.@{fa-css-prefix}-modx:before { content: @fa-var-modx; } +.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; } +.@{fa-css-prefix}-usb:before { content: @fa-var-usb; } +.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; } +.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; } +.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; } +.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; } +.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; } +.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; } +.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; } +.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; } +.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; } +.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; } +.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; } +.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; } +.@{fa-css-prefix}-percent:before { content: @fa-var-percent; } +.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; } +.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; } +.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; } +.@{fa-css-prefix}-envira:before { content: @fa-var-envira; } +.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; } +.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; } +.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; } +.@{fa-css-prefix}-blind:before { content: @fa-var-blind; } +.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; } +.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; } +.@{fa-css-prefix}-braille:before { content: @fa-var-braille; } +.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; } +.@{fa-css-prefix}-asl-interpreting:before, +.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; } +.@{fa-css-prefix}-deafness:before, +.@{fa-css-prefix}-hard-of-hearing:before, +.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; } +.@{fa-css-prefix}-glide:before { content: @fa-var-glide; } +.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; } +.@{fa-css-prefix}-signing:before, +.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; } +.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; } +.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; } +.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; } +.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; } +.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; } +.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; } +.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } +.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; } +.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; } +.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; } +.@{fa-css-prefix}-google-plus-circle:before, +.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; } +.@{fa-css-prefix}-fa:before, +.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; } +.@{fa-css-prefix}-handshake-o:before { content: @fa-var-handshake-o; } +.@{fa-css-prefix}-envelope-open:before { content: @fa-var-envelope-open; } +.@{fa-css-prefix}-envelope-open-o:before { content: @fa-var-envelope-open-o; } +.@{fa-css-prefix}-linode:before { content: @fa-var-linode; } +.@{fa-css-prefix}-address-book:before { content: @fa-var-address-book; } +.@{fa-css-prefix}-address-book-o:before { content: @fa-var-address-book-o; } +.@{fa-css-prefix}-vcard:before, +.@{fa-css-prefix}-address-card:before { content: @fa-var-address-card; } +.@{fa-css-prefix}-vcard-o:before, +.@{fa-css-prefix}-address-card-o:before { content: @fa-var-address-card-o; } +.@{fa-css-prefix}-user-circle:before { content: @fa-var-user-circle; } +.@{fa-css-prefix}-user-circle-o:before { content: @fa-var-user-circle-o; } +.@{fa-css-prefix}-user-o:before { content: @fa-var-user-o; } +.@{fa-css-prefix}-id-badge:before { content: @fa-var-id-badge; } +.@{fa-css-prefix}-drivers-license:before, +.@{fa-css-prefix}-id-card:before { content: @fa-var-id-card; } +.@{fa-css-prefix}-drivers-license-o:before, +.@{fa-css-prefix}-id-card-o:before { content: @fa-var-id-card-o; } +.@{fa-css-prefix}-quora:before { content: @fa-var-quora; } +.@{fa-css-prefix}-free-code-camp:before { content: @fa-var-free-code-camp; } +.@{fa-css-prefix}-telegram:before { content: @fa-var-telegram; } +.@{fa-css-prefix}-thermometer-4:before, +.@{fa-css-prefix}-thermometer:before, +.@{fa-css-prefix}-thermometer-full:before { content: @fa-var-thermometer-full; } +.@{fa-css-prefix}-thermometer-3:before, +.@{fa-css-prefix}-thermometer-three-quarters:before { content: @fa-var-thermometer-three-quarters; } +.@{fa-css-prefix}-thermometer-2:before, +.@{fa-css-prefix}-thermometer-half:before { content: @fa-var-thermometer-half; } +.@{fa-css-prefix}-thermometer-1:before, +.@{fa-css-prefix}-thermometer-quarter:before { content: @fa-var-thermometer-quarter; } +.@{fa-css-prefix}-thermometer-0:before, +.@{fa-css-prefix}-thermometer-empty:before { content: @fa-var-thermometer-empty; } +.@{fa-css-prefix}-shower:before { content: @fa-var-shower; } +.@{fa-css-prefix}-bathtub:before, +.@{fa-css-prefix}-s15:before, +.@{fa-css-prefix}-bath:before { content: @fa-var-bath; } +.@{fa-css-prefix}-podcast:before { content: @fa-var-podcast; } +.@{fa-css-prefix}-window-maximize:before { content: @fa-var-window-maximize; } +.@{fa-css-prefix}-window-minimize:before { content: @fa-var-window-minimize; } +.@{fa-css-prefix}-window-restore:before { content: @fa-var-window-restore; } +.@{fa-css-prefix}-times-rectangle:before, +.@{fa-css-prefix}-window-close:before { content: @fa-var-window-close; } +.@{fa-css-prefix}-times-rectangle-o:before, +.@{fa-css-prefix}-window-close-o:before { content: @fa-var-window-close-o; } +.@{fa-css-prefix}-bandcamp:before { content: @fa-var-bandcamp; } +.@{fa-css-prefix}-grav:before { content: @fa-var-grav; } +.@{fa-css-prefix}-etsy:before { content: @fa-var-etsy; } +.@{fa-css-prefix}-imdb:before { content: @fa-var-imdb; } +.@{fa-css-prefix}-ravelry:before { content: @fa-var-ravelry; } +.@{fa-css-prefix}-eercast:before { content: @fa-var-eercast; } +.@{fa-css-prefix}-microchip:before { content: @fa-var-microchip; } +.@{fa-css-prefix}-snowflake-o:before { content: @fa-var-snowflake-o; } +.@{fa-css-prefix}-superpowers:before { content: @fa-var-superpowers; } +.@{fa-css-prefix}-wpexplorer:before { content: @fa-var-wpexplorer; } +.@{fa-css-prefix}-meetup:before { content: @fa-var-meetup; } diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/larger.less b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/larger.less new file mode 100644 index 000000000..c9d646770 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/larger.less @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.@{fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.@{fa-css-prefix}-2x { font-size: 2em; } +.@{fa-css-prefix}-3x { font-size: 3em; } +.@{fa-css-prefix}-4x { font-size: 4em; } +.@{fa-css-prefix}-5x { font-size: 5em; } diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/list.less b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/list.less new file mode 100644 index 000000000..0b440382f --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/list.less @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.@{fa-css-prefix}-ul { + padding-left: 0; + margin-left: @fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.@{fa-css-prefix}-li { + position: absolute; + left: -@fa-li-width; + width: @fa-li-width; + top: (2em / 14); + text-align: center; + &.@{fa-css-prefix}-lg { + left: (-@fa-li-width + (4em / 14)); + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/mixins.less b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/mixins.less new file mode 100644 index 000000000..beef231d0 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/mixins.less @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +.fa-icon() { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +.fa-icon-rotate(@degrees, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; + -webkit-transform: rotate(@degrees); + -ms-transform: rotate(@degrees); + transform: rotate(@degrees); +} + +.fa-icon-flip(@horiz, @vert, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; + -webkit-transform: scale(@horiz, @vert); + -ms-transform: scale(@horiz, @vert); + transform: scale(@horiz, @vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +.sr-only() { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +.sr-only-focusable() { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/path.less b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/path.less new file mode 100644 index 000000000..835be41f8 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/path.less @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); + src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), + url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), + url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), + url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), + url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); + // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/rotated-flipped.less b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/rotated-flipped.less new file mode 100644 index 000000000..f6ba81475 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/rotated-flipped.less @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } +.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } +.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } + +.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } +.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .@{fa-css-prefix}-rotate-90, +:root .@{fa-css-prefix}-rotate-180, +:root .@{fa-css-prefix}-rotate-270, +:root .@{fa-css-prefix}-flip-horizontal, +:root .@{fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/screen-reader.less b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/screen-reader.less new file mode 100644 index 000000000..11c188196 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/screen-reader.less @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { .sr-only(); } +.sr-only-focusable { .sr-only-focusable(); } diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/stacked.less b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/stacked.less new file mode 100644 index 000000000..fc53fb0e7 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/stacked.less @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.@{fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.@{fa-css-prefix}-stack-1x { line-height: inherit; } +.@{fa-css-prefix}-stack-2x { font-size: 2em; } +.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/variables.less b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/variables.less new file mode 100644 index 000000000..7ddbbc011 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/less/variables.less @@ -0,0 +1,800 @@ +// Variables +// -------------------------- + +@fa-font-path: "../fonts"; +@fa-font-size-base: 14px; +@fa-line-height-base: 1; +//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts"; // for referencing Bootstrap CDN font files directly +@fa-css-prefix: fa; +@fa-version: "4.7.0"; +@fa-border-color: #eee; +@fa-inverse: #fff; +@fa-li-width: (30em / 14); + +@fa-var-500px: "\f26e"; +@fa-var-address-book: "\f2b9"; +@fa-var-address-book-o: "\f2ba"; +@fa-var-address-card: "\f2bb"; +@fa-var-address-card-o: "\f2bc"; +@fa-var-adjust: "\f042"; +@fa-var-adn: "\f170"; +@fa-var-align-center: "\f037"; +@fa-var-align-justify: "\f039"; +@fa-var-align-left: "\f036"; +@fa-var-align-right: "\f038"; +@fa-var-amazon: "\f270"; +@fa-var-ambulance: "\f0f9"; +@fa-var-american-sign-language-interpreting: "\f2a3"; +@fa-var-anchor: "\f13d"; +@fa-var-android: "\f17b"; +@fa-var-angellist: "\f209"; +@fa-var-angle-double-down: "\f103"; +@fa-var-angle-double-left: "\f100"; +@fa-var-angle-double-right: "\f101"; +@fa-var-angle-double-up: "\f102"; +@fa-var-angle-down: "\f107"; +@fa-var-angle-left: "\f104"; +@fa-var-angle-right: "\f105"; +@fa-var-angle-up: "\f106"; +@fa-var-apple: "\f179"; +@fa-var-archive: "\f187"; +@fa-var-area-chart: "\f1fe"; +@fa-var-arrow-circle-down: "\f0ab"; +@fa-var-arrow-circle-left: "\f0a8"; +@fa-var-arrow-circle-o-down: "\f01a"; +@fa-var-arrow-circle-o-left: "\f190"; +@fa-var-arrow-circle-o-right: "\f18e"; +@fa-var-arrow-circle-o-up: "\f01b"; +@fa-var-arrow-circle-right: "\f0a9"; +@fa-var-arrow-circle-up: "\f0aa"; +@fa-var-arrow-down: "\f063"; +@fa-var-arrow-left: "\f060"; +@fa-var-arrow-right: "\f061"; +@fa-var-arrow-up: "\f062"; +@fa-var-arrows: "\f047"; +@fa-var-arrows-alt: "\f0b2"; +@fa-var-arrows-h: "\f07e"; +@fa-var-arrows-v: "\f07d"; +@fa-var-asl-interpreting: "\f2a3"; +@fa-var-assistive-listening-systems: "\f2a2"; +@fa-var-asterisk: "\f069"; +@fa-var-at: "\f1fa"; +@fa-var-audio-description: "\f29e"; +@fa-var-automobile: "\f1b9"; +@fa-var-backward: "\f04a"; +@fa-var-balance-scale: "\f24e"; +@fa-var-ban: "\f05e"; +@fa-var-bandcamp: "\f2d5"; +@fa-var-bank: "\f19c"; +@fa-var-bar-chart: "\f080"; +@fa-var-bar-chart-o: "\f080"; +@fa-var-barcode: "\f02a"; +@fa-var-bars: "\f0c9"; +@fa-var-bath: "\f2cd"; +@fa-var-bathtub: "\f2cd"; +@fa-var-battery: "\f240"; +@fa-var-battery-0: "\f244"; +@fa-var-battery-1: "\f243"; +@fa-var-battery-2: "\f242"; +@fa-var-battery-3: "\f241"; +@fa-var-battery-4: "\f240"; +@fa-var-battery-empty: "\f244"; +@fa-var-battery-full: "\f240"; +@fa-var-battery-half: "\f242"; +@fa-var-battery-quarter: "\f243"; +@fa-var-battery-three-quarters: "\f241"; +@fa-var-bed: "\f236"; +@fa-var-beer: "\f0fc"; +@fa-var-behance: "\f1b4"; +@fa-var-behance-square: "\f1b5"; +@fa-var-bell: "\f0f3"; +@fa-var-bell-o: "\f0a2"; +@fa-var-bell-slash: "\f1f6"; +@fa-var-bell-slash-o: "\f1f7"; +@fa-var-bicycle: "\f206"; +@fa-var-binoculars: "\f1e5"; +@fa-var-birthday-cake: "\f1fd"; +@fa-var-bitbucket: "\f171"; +@fa-var-bitbucket-square: "\f172"; +@fa-var-bitcoin: "\f15a"; +@fa-var-black-tie: "\f27e"; +@fa-var-blind: "\f29d"; +@fa-var-bluetooth: "\f293"; +@fa-var-bluetooth-b: "\f294"; +@fa-var-bold: "\f032"; +@fa-var-bolt: "\f0e7"; +@fa-var-bomb: "\f1e2"; +@fa-var-book: "\f02d"; +@fa-var-bookmark: "\f02e"; +@fa-var-bookmark-o: "\f097"; +@fa-var-braille: "\f2a1"; +@fa-var-briefcase: "\f0b1"; +@fa-var-btc: "\f15a"; +@fa-var-bug: "\f188"; +@fa-var-building: "\f1ad"; +@fa-var-building-o: "\f0f7"; +@fa-var-bullhorn: "\f0a1"; +@fa-var-bullseye: "\f140"; +@fa-var-bus: "\f207"; +@fa-var-buysellads: "\f20d"; +@fa-var-cab: "\f1ba"; +@fa-var-calculator: "\f1ec"; +@fa-var-calendar: "\f073"; +@fa-var-calendar-check-o: "\f274"; +@fa-var-calendar-minus-o: "\f272"; +@fa-var-calendar-o: "\f133"; +@fa-var-calendar-plus-o: "\f271"; +@fa-var-calendar-times-o: "\f273"; +@fa-var-camera: "\f030"; +@fa-var-camera-retro: "\f083"; +@fa-var-car: "\f1b9"; +@fa-var-caret-down: "\f0d7"; +@fa-var-caret-left: "\f0d9"; +@fa-var-caret-right: "\f0da"; +@fa-var-caret-square-o-down: "\f150"; +@fa-var-caret-square-o-left: "\f191"; +@fa-var-caret-square-o-right: "\f152"; +@fa-var-caret-square-o-up: "\f151"; +@fa-var-caret-up: "\f0d8"; +@fa-var-cart-arrow-down: "\f218"; +@fa-var-cart-plus: "\f217"; +@fa-var-cc: "\f20a"; +@fa-var-cc-amex: "\f1f3"; +@fa-var-cc-diners-club: "\f24c"; +@fa-var-cc-discover: "\f1f2"; +@fa-var-cc-jcb: "\f24b"; +@fa-var-cc-mastercard: "\f1f1"; +@fa-var-cc-paypal: "\f1f4"; +@fa-var-cc-stripe: "\f1f5"; +@fa-var-cc-visa: "\f1f0"; +@fa-var-certificate: "\f0a3"; +@fa-var-chain: "\f0c1"; +@fa-var-chain-broken: "\f127"; +@fa-var-check: "\f00c"; +@fa-var-check-circle: "\f058"; +@fa-var-check-circle-o: "\f05d"; +@fa-var-check-square: "\f14a"; +@fa-var-check-square-o: "\f046"; +@fa-var-chevron-circle-down: "\f13a"; +@fa-var-chevron-circle-left: "\f137"; +@fa-var-chevron-circle-right: "\f138"; +@fa-var-chevron-circle-up: "\f139"; +@fa-var-chevron-down: "\f078"; +@fa-var-chevron-left: "\f053"; +@fa-var-chevron-right: "\f054"; +@fa-var-chevron-up: "\f077"; +@fa-var-child: "\f1ae"; +@fa-var-chrome: "\f268"; +@fa-var-circle: "\f111"; +@fa-var-circle-o: "\f10c"; +@fa-var-circle-o-notch: "\f1ce"; +@fa-var-circle-thin: "\f1db"; +@fa-var-clipboard: "\f0ea"; +@fa-var-clock-o: "\f017"; +@fa-var-clone: "\f24d"; +@fa-var-close: "\f00d"; +@fa-var-cloud: "\f0c2"; +@fa-var-cloud-download: "\f0ed"; +@fa-var-cloud-upload: "\f0ee"; +@fa-var-cny: "\f157"; +@fa-var-code: "\f121"; +@fa-var-code-fork: "\f126"; +@fa-var-codepen: "\f1cb"; +@fa-var-codiepie: "\f284"; +@fa-var-coffee: "\f0f4"; +@fa-var-cog: "\f013"; +@fa-var-cogs: "\f085"; +@fa-var-columns: "\f0db"; +@fa-var-comment: "\f075"; +@fa-var-comment-o: "\f0e5"; +@fa-var-commenting: "\f27a"; +@fa-var-commenting-o: "\f27b"; +@fa-var-comments: "\f086"; +@fa-var-comments-o: "\f0e6"; +@fa-var-compass: "\f14e"; +@fa-var-compress: "\f066"; +@fa-var-connectdevelop: "\f20e"; +@fa-var-contao: "\f26d"; +@fa-var-copy: "\f0c5"; +@fa-var-copyright: "\f1f9"; +@fa-var-creative-commons: "\f25e"; +@fa-var-credit-card: "\f09d"; +@fa-var-credit-card-alt: "\f283"; +@fa-var-crop: "\f125"; +@fa-var-crosshairs: "\f05b"; +@fa-var-css3: "\f13c"; +@fa-var-cube: "\f1b2"; +@fa-var-cubes: "\f1b3"; +@fa-var-cut: "\f0c4"; +@fa-var-cutlery: "\f0f5"; +@fa-var-dashboard: "\f0e4"; +@fa-var-dashcube: "\f210"; +@fa-var-database: "\f1c0"; +@fa-var-deaf: "\f2a4"; +@fa-var-deafness: "\f2a4"; +@fa-var-dedent: "\f03b"; +@fa-var-delicious: "\f1a5"; +@fa-var-desktop: "\f108"; +@fa-var-deviantart: "\f1bd"; +@fa-var-diamond: "\f219"; +@fa-var-digg: "\f1a6"; +@fa-var-dollar: "\f155"; +@fa-var-dot-circle-o: "\f192"; +@fa-var-download: "\f019"; +@fa-var-dribbble: "\f17d"; +@fa-var-drivers-license: "\f2c2"; +@fa-var-drivers-license-o: "\f2c3"; +@fa-var-dropbox: "\f16b"; +@fa-var-drupal: "\f1a9"; +@fa-var-edge: "\f282"; +@fa-var-edit: "\f044"; +@fa-var-eercast: "\f2da"; +@fa-var-eject: "\f052"; +@fa-var-ellipsis-h: "\f141"; +@fa-var-ellipsis-v: "\f142"; +@fa-var-empire: "\f1d1"; +@fa-var-envelope: "\f0e0"; +@fa-var-envelope-o: "\f003"; +@fa-var-envelope-open: "\f2b6"; +@fa-var-envelope-open-o: "\f2b7"; +@fa-var-envelope-square: "\f199"; +@fa-var-envira: "\f299"; +@fa-var-eraser: "\f12d"; +@fa-var-etsy: "\f2d7"; +@fa-var-eur: "\f153"; +@fa-var-euro: "\f153"; +@fa-var-exchange: "\f0ec"; +@fa-var-exclamation: "\f12a"; +@fa-var-exclamation-circle: "\f06a"; +@fa-var-exclamation-triangle: "\f071"; +@fa-var-expand: "\f065"; +@fa-var-expeditedssl: "\f23e"; +@fa-var-external-link: "\f08e"; +@fa-var-external-link-square: "\f14c"; +@fa-var-eye: "\f06e"; +@fa-var-eye-slash: "\f070"; +@fa-var-eyedropper: "\f1fb"; +@fa-var-fa: "\f2b4"; +@fa-var-facebook: "\f09a"; +@fa-var-facebook-f: "\f09a"; +@fa-var-facebook-official: "\f230"; +@fa-var-facebook-square: "\f082"; +@fa-var-fast-backward: "\f049"; +@fa-var-fast-forward: "\f050"; +@fa-var-fax: "\f1ac"; +@fa-var-feed: "\f09e"; +@fa-var-female: "\f182"; +@fa-var-fighter-jet: "\f0fb"; +@fa-var-file: "\f15b"; +@fa-var-file-archive-o: "\f1c6"; +@fa-var-file-audio-o: "\f1c7"; +@fa-var-file-code-o: "\f1c9"; +@fa-var-file-excel-o: "\f1c3"; +@fa-var-file-image-o: "\f1c5"; +@fa-var-file-movie-o: "\f1c8"; +@fa-var-file-o: "\f016"; +@fa-var-file-pdf-o: "\f1c1"; +@fa-var-file-photo-o: "\f1c5"; +@fa-var-file-picture-o: "\f1c5"; +@fa-var-file-powerpoint-o: "\f1c4"; +@fa-var-file-sound-o: "\f1c7"; +@fa-var-file-text: "\f15c"; +@fa-var-file-text-o: "\f0f6"; +@fa-var-file-video-o: "\f1c8"; +@fa-var-file-word-o: "\f1c2"; +@fa-var-file-zip-o: "\f1c6"; +@fa-var-files-o: "\f0c5"; +@fa-var-film: "\f008"; +@fa-var-filter: "\f0b0"; +@fa-var-fire: "\f06d"; +@fa-var-fire-extinguisher: "\f134"; +@fa-var-firefox: "\f269"; +@fa-var-first-order: "\f2b0"; +@fa-var-flag: "\f024"; +@fa-var-flag-checkered: "\f11e"; +@fa-var-flag-o: "\f11d"; +@fa-var-flash: "\f0e7"; +@fa-var-flask: "\f0c3"; +@fa-var-flickr: "\f16e"; +@fa-var-floppy-o: "\f0c7"; +@fa-var-folder: "\f07b"; +@fa-var-folder-o: "\f114"; +@fa-var-folder-open: "\f07c"; +@fa-var-folder-open-o: "\f115"; +@fa-var-font: "\f031"; +@fa-var-font-awesome: "\f2b4"; +@fa-var-fonticons: "\f280"; +@fa-var-fort-awesome: "\f286"; +@fa-var-forumbee: "\f211"; +@fa-var-forward: "\f04e"; +@fa-var-foursquare: "\f180"; +@fa-var-free-code-camp: "\f2c5"; +@fa-var-frown-o: "\f119"; +@fa-var-futbol-o: "\f1e3"; +@fa-var-gamepad: "\f11b"; +@fa-var-gavel: "\f0e3"; +@fa-var-gbp: "\f154"; +@fa-var-ge: "\f1d1"; +@fa-var-gear: "\f013"; +@fa-var-gears: "\f085"; +@fa-var-genderless: "\f22d"; +@fa-var-get-pocket: "\f265"; +@fa-var-gg: "\f260"; +@fa-var-gg-circle: "\f261"; +@fa-var-gift: "\f06b"; +@fa-var-git: "\f1d3"; +@fa-var-git-square: "\f1d2"; +@fa-var-github: "\f09b"; +@fa-var-github-alt: "\f113"; +@fa-var-github-square: "\f092"; +@fa-var-gitlab: "\f296"; +@fa-var-gittip: "\f184"; +@fa-var-glass: "\f000"; +@fa-var-glide: "\f2a5"; +@fa-var-glide-g: "\f2a6"; +@fa-var-globe: "\f0ac"; +@fa-var-google: "\f1a0"; +@fa-var-google-plus: "\f0d5"; +@fa-var-google-plus-circle: "\f2b3"; +@fa-var-google-plus-official: "\f2b3"; +@fa-var-google-plus-square: "\f0d4"; +@fa-var-google-wallet: "\f1ee"; +@fa-var-graduation-cap: "\f19d"; +@fa-var-gratipay: "\f184"; +@fa-var-grav: "\f2d6"; +@fa-var-group: "\f0c0"; +@fa-var-h-square: "\f0fd"; +@fa-var-hacker-news: "\f1d4"; +@fa-var-hand-grab-o: "\f255"; +@fa-var-hand-lizard-o: "\f258"; +@fa-var-hand-o-down: "\f0a7"; +@fa-var-hand-o-left: "\f0a5"; +@fa-var-hand-o-right: "\f0a4"; +@fa-var-hand-o-up: "\f0a6"; +@fa-var-hand-paper-o: "\f256"; +@fa-var-hand-peace-o: "\f25b"; +@fa-var-hand-pointer-o: "\f25a"; +@fa-var-hand-rock-o: "\f255"; +@fa-var-hand-scissors-o: "\f257"; +@fa-var-hand-spock-o: "\f259"; +@fa-var-hand-stop-o: "\f256"; +@fa-var-handshake-o: "\f2b5"; +@fa-var-hard-of-hearing: "\f2a4"; +@fa-var-hashtag: "\f292"; +@fa-var-hdd-o: "\f0a0"; +@fa-var-header: "\f1dc"; +@fa-var-headphones: "\f025"; +@fa-var-heart: "\f004"; +@fa-var-heart-o: "\f08a"; +@fa-var-heartbeat: "\f21e"; +@fa-var-history: "\f1da"; +@fa-var-home: "\f015"; +@fa-var-hospital-o: "\f0f8"; +@fa-var-hotel: "\f236"; +@fa-var-hourglass: "\f254"; +@fa-var-hourglass-1: "\f251"; +@fa-var-hourglass-2: "\f252"; +@fa-var-hourglass-3: "\f253"; +@fa-var-hourglass-end: "\f253"; +@fa-var-hourglass-half: "\f252"; +@fa-var-hourglass-o: "\f250"; +@fa-var-hourglass-start: "\f251"; +@fa-var-houzz: "\f27c"; +@fa-var-html5: "\f13b"; +@fa-var-i-cursor: "\f246"; +@fa-var-id-badge: "\f2c1"; +@fa-var-id-card: "\f2c2"; +@fa-var-id-card-o: "\f2c3"; +@fa-var-ils: "\f20b"; +@fa-var-image: "\f03e"; +@fa-var-imdb: "\f2d8"; +@fa-var-inbox: "\f01c"; +@fa-var-indent: "\f03c"; +@fa-var-industry: "\f275"; +@fa-var-info: "\f129"; +@fa-var-info-circle: "\f05a"; +@fa-var-inr: "\f156"; +@fa-var-instagram: "\f16d"; +@fa-var-institution: "\f19c"; +@fa-var-internet-explorer: "\f26b"; +@fa-var-intersex: "\f224"; +@fa-var-ioxhost: "\f208"; +@fa-var-italic: "\f033"; +@fa-var-joomla: "\f1aa"; +@fa-var-jpy: "\f157"; +@fa-var-jsfiddle: "\f1cc"; +@fa-var-key: "\f084"; +@fa-var-keyboard-o: "\f11c"; +@fa-var-krw: "\f159"; +@fa-var-language: "\f1ab"; +@fa-var-laptop: "\f109"; +@fa-var-lastfm: "\f202"; +@fa-var-lastfm-square: "\f203"; +@fa-var-leaf: "\f06c"; +@fa-var-leanpub: "\f212"; +@fa-var-legal: "\f0e3"; +@fa-var-lemon-o: "\f094"; +@fa-var-level-down: "\f149"; +@fa-var-level-up: "\f148"; +@fa-var-life-bouy: "\f1cd"; +@fa-var-life-buoy: "\f1cd"; +@fa-var-life-ring: "\f1cd"; +@fa-var-life-saver: "\f1cd"; +@fa-var-lightbulb-o: "\f0eb"; +@fa-var-line-chart: "\f201"; +@fa-var-link: "\f0c1"; +@fa-var-linkedin: "\f0e1"; +@fa-var-linkedin-square: "\f08c"; +@fa-var-linode: "\f2b8"; +@fa-var-linux: "\f17c"; +@fa-var-list: "\f03a"; +@fa-var-list-alt: "\f022"; +@fa-var-list-ol: "\f0cb"; +@fa-var-list-ul: "\f0ca"; +@fa-var-location-arrow: "\f124"; +@fa-var-lock: "\f023"; +@fa-var-long-arrow-down: "\f175"; +@fa-var-long-arrow-left: "\f177"; +@fa-var-long-arrow-right: "\f178"; +@fa-var-long-arrow-up: "\f176"; +@fa-var-low-vision: "\f2a8"; +@fa-var-magic: "\f0d0"; +@fa-var-magnet: "\f076"; +@fa-var-mail-forward: "\f064"; +@fa-var-mail-reply: "\f112"; +@fa-var-mail-reply-all: "\f122"; +@fa-var-male: "\f183"; +@fa-var-map: "\f279"; +@fa-var-map-marker: "\f041"; +@fa-var-map-o: "\f278"; +@fa-var-map-pin: "\f276"; +@fa-var-map-signs: "\f277"; +@fa-var-mars: "\f222"; +@fa-var-mars-double: "\f227"; +@fa-var-mars-stroke: "\f229"; +@fa-var-mars-stroke-h: "\f22b"; +@fa-var-mars-stroke-v: "\f22a"; +@fa-var-maxcdn: "\f136"; +@fa-var-meanpath: "\f20c"; +@fa-var-medium: "\f23a"; +@fa-var-medkit: "\f0fa"; +@fa-var-meetup: "\f2e0"; +@fa-var-meh-o: "\f11a"; +@fa-var-mercury: "\f223"; +@fa-var-microchip: "\f2db"; +@fa-var-microphone: "\f130"; +@fa-var-microphone-slash: "\f131"; +@fa-var-minus: "\f068"; +@fa-var-minus-circle: "\f056"; +@fa-var-minus-square: "\f146"; +@fa-var-minus-square-o: "\f147"; +@fa-var-mixcloud: "\f289"; +@fa-var-mobile: "\f10b"; +@fa-var-mobile-phone: "\f10b"; +@fa-var-modx: "\f285"; +@fa-var-money: "\f0d6"; +@fa-var-moon-o: "\f186"; +@fa-var-mortar-board: "\f19d"; +@fa-var-motorcycle: "\f21c"; +@fa-var-mouse-pointer: "\f245"; +@fa-var-music: "\f001"; +@fa-var-navicon: "\f0c9"; +@fa-var-neuter: "\f22c"; +@fa-var-newspaper-o: "\f1ea"; +@fa-var-object-group: "\f247"; +@fa-var-object-ungroup: "\f248"; +@fa-var-odnoklassniki: "\f263"; +@fa-var-odnoklassniki-square: "\f264"; +@fa-var-opencart: "\f23d"; +@fa-var-openid: "\f19b"; +@fa-var-opera: "\f26a"; +@fa-var-optin-monster: "\f23c"; +@fa-var-outdent: "\f03b"; +@fa-var-pagelines: "\f18c"; +@fa-var-paint-brush: "\f1fc"; +@fa-var-paper-plane: "\f1d8"; +@fa-var-paper-plane-o: "\f1d9"; +@fa-var-paperclip: "\f0c6"; +@fa-var-paragraph: "\f1dd"; +@fa-var-paste: "\f0ea"; +@fa-var-pause: "\f04c"; +@fa-var-pause-circle: "\f28b"; +@fa-var-pause-circle-o: "\f28c"; +@fa-var-paw: "\f1b0"; +@fa-var-paypal: "\f1ed"; +@fa-var-pencil: "\f040"; +@fa-var-pencil-square: "\f14b"; +@fa-var-pencil-square-o: "\f044"; +@fa-var-percent: "\f295"; +@fa-var-phone: "\f095"; +@fa-var-phone-square: "\f098"; +@fa-var-photo: "\f03e"; +@fa-var-picture-o: "\f03e"; +@fa-var-pie-chart: "\f200"; +@fa-var-pied-piper: "\f2ae"; +@fa-var-pied-piper-alt: "\f1a8"; +@fa-var-pied-piper-pp: "\f1a7"; +@fa-var-pinterest: "\f0d2"; +@fa-var-pinterest-p: "\f231"; +@fa-var-pinterest-square: "\f0d3"; +@fa-var-plane: "\f072"; +@fa-var-play: "\f04b"; +@fa-var-play-circle: "\f144"; +@fa-var-play-circle-o: "\f01d"; +@fa-var-plug: "\f1e6"; +@fa-var-plus: "\f067"; +@fa-var-plus-circle: "\f055"; +@fa-var-plus-square: "\f0fe"; +@fa-var-plus-square-o: "\f196"; +@fa-var-podcast: "\f2ce"; +@fa-var-power-off: "\f011"; +@fa-var-print: "\f02f"; +@fa-var-product-hunt: "\f288"; +@fa-var-puzzle-piece: "\f12e"; +@fa-var-qq: "\f1d6"; +@fa-var-qrcode: "\f029"; +@fa-var-question: "\f128"; +@fa-var-question-circle: "\f059"; +@fa-var-question-circle-o: "\f29c"; +@fa-var-quora: "\f2c4"; +@fa-var-quote-left: "\f10d"; +@fa-var-quote-right: "\f10e"; +@fa-var-ra: "\f1d0"; +@fa-var-random: "\f074"; +@fa-var-ravelry: "\f2d9"; +@fa-var-rebel: "\f1d0"; +@fa-var-recycle: "\f1b8"; +@fa-var-reddit: "\f1a1"; +@fa-var-reddit-alien: "\f281"; +@fa-var-reddit-square: "\f1a2"; +@fa-var-refresh: "\f021"; +@fa-var-registered: "\f25d"; +@fa-var-remove: "\f00d"; +@fa-var-renren: "\f18b"; +@fa-var-reorder: "\f0c9"; +@fa-var-repeat: "\f01e"; +@fa-var-reply: "\f112"; +@fa-var-reply-all: "\f122"; +@fa-var-resistance: "\f1d0"; +@fa-var-retweet: "\f079"; +@fa-var-rmb: "\f157"; +@fa-var-road: "\f018"; +@fa-var-rocket: "\f135"; +@fa-var-rotate-left: "\f0e2"; +@fa-var-rotate-right: "\f01e"; +@fa-var-rouble: "\f158"; +@fa-var-rss: "\f09e"; +@fa-var-rss-square: "\f143"; +@fa-var-rub: "\f158"; +@fa-var-ruble: "\f158"; +@fa-var-rupee: "\f156"; +@fa-var-s15: "\f2cd"; +@fa-var-safari: "\f267"; +@fa-var-save: "\f0c7"; +@fa-var-scissors: "\f0c4"; +@fa-var-scribd: "\f28a"; +@fa-var-search: "\f002"; +@fa-var-search-minus: "\f010"; +@fa-var-search-plus: "\f00e"; +@fa-var-sellsy: "\f213"; +@fa-var-send: "\f1d8"; +@fa-var-send-o: "\f1d9"; +@fa-var-server: "\f233"; +@fa-var-share: "\f064"; +@fa-var-share-alt: "\f1e0"; +@fa-var-share-alt-square: "\f1e1"; +@fa-var-share-square: "\f14d"; +@fa-var-share-square-o: "\f045"; +@fa-var-shekel: "\f20b"; +@fa-var-sheqel: "\f20b"; +@fa-var-shield: "\f132"; +@fa-var-ship: "\f21a"; +@fa-var-shirtsinbulk: "\f214"; +@fa-var-shopping-bag: "\f290"; +@fa-var-shopping-basket: "\f291"; +@fa-var-shopping-cart: "\f07a"; +@fa-var-shower: "\f2cc"; +@fa-var-sign-in: "\f090"; +@fa-var-sign-language: "\f2a7"; +@fa-var-sign-out: "\f08b"; +@fa-var-signal: "\f012"; +@fa-var-signing: "\f2a7"; +@fa-var-simplybuilt: "\f215"; +@fa-var-sitemap: "\f0e8"; +@fa-var-skyatlas: "\f216"; +@fa-var-skype: "\f17e"; +@fa-var-slack: "\f198"; +@fa-var-sliders: "\f1de"; +@fa-var-slideshare: "\f1e7"; +@fa-var-smile-o: "\f118"; +@fa-var-snapchat: "\f2ab"; +@fa-var-snapchat-ghost: "\f2ac"; +@fa-var-snapchat-square: "\f2ad"; +@fa-var-snowflake-o: "\f2dc"; +@fa-var-soccer-ball-o: "\f1e3"; +@fa-var-sort: "\f0dc"; +@fa-var-sort-alpha-asc: "\f15d"; +@fa-var-sort-alpha-desc: "\f15e"; +@fa-var-sort-amount-asc: "\f160"; +@fa-var-sort-amount-desc: "\f161"; +@fa-var-sort-asc: "\f0de"; +@fa-var-sort-desc: "\f0dd"; +@fa-var-sort-down: "\f0dd"; +@fa-var-sort-numeric-asc: "\f162"; +@fa-var-sort-numeric-desc: "\f163"; +@fa-var-sort-up: "\f0de"; +@fa-var-soundcloud: "\f1be"; +@fa-var-space-shuttle: "\f197"; +@fa-var-spinner: "\f110"; +@fa-var-spoon: "\f1b1"; +@fa-var-spotify: "\f1bc"; +@fa-var-square: "\f0c8"; +@fa-var-square-o: "\f096"; +@fa-var-stack-exchange: "\f18d"; +@fa-var-stack-overflow: "\f16c"; +@fa-var-star: "\f005"; +@fa-var-star-half: "\f089"; +@fa-var-star-half-empty: "\f123"; +@fa-var-star-half-full: "\f123"; +@fa-var-star-half-o: "\f123"; +@fa-var-star-o: "\f006"; +@fa-var-steam: "\f1b6"; +@fa-var-steam-square: "\f1b7"; +@fa-var-step-backward: "\f048"; +@fa-var-step-forward: "\f051"; +@fa-var-stethoscope: "\f0f1"; +@fa-var-sticky-note: "\f249"; +@fa-var-sticky-note-o: "\f24a"; +@fa-var-stop: "\f04d"; +@fa-var-stop-circle: "\f28d"; +@fa-var-stop-circle-o: "\f28e"; +@fa-var-street-view: "\f21d"; +@fa-var-strikethrough: "\f0cc"; +@fa-var-stumbleupon: "\f1a4"; +@fa-var-stumbleupon-circle: "\f1a3"; +@fa-var-subscript: "\f12c"; +@fa-var-subway: "\f239"; +@fa-var-suitcase: "\f0f2"; +@fa-var-sun-o: "\f185"; +@fa-var-superpowers: "\f2dd"; +@fa-var-superscript: "\f12b"; +@fa-var-support: "\f1cd"; +@fa-var-table: "\f0ce"; +@fa-var-tablet: "\f10a"; +@fa-var-tachometer: "\f0e4"; +@fa-var-tag: "\f02b"; +@fa-var-tags: "\f02c"; +@fa-var-tasks: "\f0ae"; +@fa-var-taxi: "\f1ba"; +@fa-var-telegram: "\f2c6"; +@fa-var-television: "\f26c"; +@fa-var-tencent-weibo: "\f1d5"; +@fa-var-terminal: "\f120"; +@fa-var-text-height: "\f034"; +@fa-var-text-width: "\f035"; +@fa-var-th: "\f00a"; +@fa-var-th-large: "\f009"; +@fa-var-th-list: "\f00b"; +@fa-var-themeisle: "\f2b2"; +@fa-var-thermometer: "\f2c7"; +@fa-var-thermometer-0: "\f2cb"; +@fa-var-thermometer-1: "\f2ca"; +@fa-var-thermometer-2: "\f2c9"; +@fa-var-thermometer-3: "\f2c8"; +@fa-var-thermometer-4: "\f2c7"; +@fa-var-thermometer-empty: "\f2cb"; +@fa-var-thermometer-full: "\f2c7"; +@fa-var-thermometer-half: "\f2c9"; +@fa-var-thermometer-quarter: "\f2ca"; +@fa-var-thermometer-three-quarters: "\f2c8"; +@fa-var-thumb-tack: "\f08d"; +@fa-var-thumbs-down: "\f165"; +@fa-var-thumbs-o-down: "\f088"; +@fa-var-thumbs-o-up: "\f087"; +@fa-var-thumbs-up: "\f164"; +@fa-var-ticket: "\f145"; +@fa-var-times: "\f00d"; +@fa-var-times-circle: "\f057"; +@fa-var-times-circle-o: "\f05c"; +@fa-var-times-rectangle: "\f2d3"; +@fa-var-times-rectangle-o: "\f2d4"; +@fa-var-tint: "\f043"; +@fa-var-toggle-down: "\f150"; +@fa-var-toggle-left: "\f191"; +@fa-var-toggle-off: "\f204"; +@fa-var-toggle-on: "\f205"; +@fa-var-toggle-right: "\f152"; +@fa-var-toggle-up: "\f151"; +@fa-var-trademark: "\f25c"; +@fa-var-train: "\f238"; +@fa-var-transgender: "\f224"; +@fa-var-transgender-alt: "\f225"; +@fa-var-trash: "\f1f8"; +@fa-var-trash-o: "\f014"; +@fa-var-tree: "\f1bb"; +@fa-var-trello: "\f181"; +@fa-var-tripadvisor: "\f262"; +@fa-var-trophy: "\f091"; +@fa-var-truck: "\f0d1"; +@fa-var-try: "\f195"; +@fa-var-tty: "\f1e4"; +@fa-var-tumblr: "\f173"; +@fa-var-tumblr-square: "\f174"; +@fa-var-turkish-lira: "\f195"; +@fa-var-tv: "\f26c"; +@fa-var-twitch: "\f1e8"; +@fa-var-twitter: "\f099"; +@fa-var-twitter-square: "\f081"; +@fa-var-umbrella: "\f0e9"; +@fa-var-underline: "\f0cd"; +@fa-var-undo: "\f0e2"; +@fa-var-universal-access: "\f29a"; +@fa-var-university: "\f19c"; +@fa-var-unlink: "\f127"; +@fa-var-unlock: "\f09c"; +@fa-var-unlock-alt: "\f13e"; +@fa-var-unsorted: "\f0dc"; +@fa-var-upload: "\f093"; +@fa-var-usb: "\f287"; +@fa-var-usd: "\f155"; +@fa-var-user: "\f007"; +@fa-var-user-circle: "\f2bd"; +@fa-var-user-circle-o: "\f2be"; +@fa-var-user-md: "\f0f0"; +@fa-var-user-o: "\f2c0"; +@fa-var-user-plus: "\f234"; +@fa-var-user-secret: "\f21b"; +@fa-var-user-times: "\f235"; +@fa-var-users: "\f0c0"; +@fa-var-vcard: "\f2bb"; +@fa-var-vcard-o: "\f2bc"; +@fa-var-venus: "\f221"; +@fa-var-venus-double: "\f226"; +@fa-var-venus-mars: "\f228"; +@fa-var-viacoin: "\f237"; +@fa-var-viadeo: "\f2a9"; +@fa-var-viadeo-square: "\f2aa"; +@fa-var-video-camera: "\f03d"; +@fa-var-vimeo: "\f27d"; +@fa-var-vimeo-square: "\f194"; +@fa-var-vine: "\f1ca"; +@fa-var-vk: "\f189"; +@fa-var-volume-control-phone: "\f2a0"; +@fa-var-volume-down: "\f027"; +@fa-var-volume-off: "\f026"; +@fa-var-volume-up: "\f028"; +@fa-var-warning: "\f071"; +@fa-var-wechat: "\f1d7"; +@fa-var-weibo: "\f18a"; +@fa-var-weixin: "\f1d7"; +@fa-var-whatsapp: "\f232"; +@fa-var-wheelchair: "\f193"; +@fa-var-wheelchair-alt: "\f29b"; +@fa-var-wifi: "\f1eb"; +@fa-var-wikipedia-w: "\f266"; +@fa-var-window-close: "\f2d3"; +@fa-var-window-close-o: "\f2d4"; +@fa-var-window-maximize: "\f2d0"; +@fa-var-window-minimize: "\f2d1"; +@fa-var-window-restore: "\f2d2"; +@fa-var-windows: "\f17a"; +@fa-var-won: "\f159"; +@fa-var-wordpress: "\f19a"; +@fa-var-wpbeginner: "\f297"; +@fa-var-wpexplorer: "\f2de"; +@fa-var-wpforms: "\f298"; +@fa-var-wrench: "\f0ad"; +@fa-var-xing: "\f168"; +@fa-var-xing-square: "\f169"; +@fa-var-y-combinator: "\f23b"; +@fa-var-y-combinator-square: "\f1d4"; +@fa-var-yahoo: "\f19e"; +@fa-var-yc: "\f23b"; +@fa-var-yc-square: "\f1d4"; +@fa-var-yelp: "\f1e9"; +@fa-var-yen: "\f157"; +@fa-var-yoast: "\f2b1"; +@fa-var-youtube: "\f167"; +@fa-var-youtube-play: "\f16a"; +@fa-var-youtube-square: "\f166"; + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_animated.scss b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_animated.scss new file mode 100644 index 000000000..8a020dbff --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_animated.scss @@ -0,0 +1,34 @@ +// Spinning Icons +// -------------------------- + +.#{$fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.#{$fa-css-prefix}-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_bordered-pulled.scss b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_bordered-pulled.scss new file mode 100644 index 000000000..d4b85a02f --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_bordered-pulled.scss @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.#{$fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em $fa-border-color; + border-radius: .1em; +} + +.#{$fa-css-prefix}-pull-left { float: left; } +.#{$fa-css-prefix}-pull-right { float: right; } + +.#{$fa-css-prefix} { + &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } + &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.#{$fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_core.scss b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_core.scss new file mode 100644 index 000000000..7425ef85f --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_core.scss @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.#{$fa-css-prefix} { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_fixed-width.scss b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_fixed-width.scss new file mode 100644 index 000000000..b221c9813 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_fixed-width.scss @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.#{$fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_icons.scss b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_icons.scss new file mode 100644 index 000000000..e63e702c4 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_icons.scss @@ -0,0 +1,789 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } +.#{$fa-css-prefix}-music:before { content: $fa-var-music; } +.#{$fa-css-prefix}-search:before { content: $fa-var-search; } +.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } +.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } +.#{$fa-css-prefix}-star:before { content: $fa-var-star; } +.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } +.#{$fa-css-prefix}-user:before { content: $fa-var-user; } +.#{$fa-css-prefix}-film:before { content: $fa-var-film; } +.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } +.#{$fa-css-prefix}-th:before { content: $fa-var-th; } +.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } +.#{$fa-css-prefix}-check:before { content: $fa-var-check; } +.#{$fa-css-prefix}-remove:before, +.#{$fa-css-prefix}-close:before, +.#{$fa-css-prefix}-times:before { content: $fa-var-times; } +.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } +.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } +.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } +.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } +.#{$fa-css-prefix}-gear:before, +.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } +.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } +.#{$fa-css-prefix}-home:before { content: $fa-var-home; } +.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } +.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } +.#{$fa-css-prefix}-road:before { content: $fa-var-road; } +.#{$fa-css-prefix}-download:before { content: $fa-var-download; } +.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } +.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } +.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } +.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } +.#{$fa-css-prefix}-rotate-right:before, +.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } +.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } +.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } +.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } +.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } +.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } +.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } +.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } +.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } +.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } +.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } +.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } +.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } +.#{$fa-css-prefix}-book:before { content: $fa-var-book; } +.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } +.#{$fa-css-prefix}-print:before { content: $fa-var-print; } +.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } +.#{$fa-css-prefix}-font:before { content: $fa-var-font; } +.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } +.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } +.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } +.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } +.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } +.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } +.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } +.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } +.#{$fa-css-prefix}-list:before { content: $fa-var-list; } +.#{$fa-css-prefix}-dedent:before, +.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } +.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } +.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } +.#{$fa-css-prefix}-photo:before, +.#{$fa-css-prefix}-image:before, +.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } +.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } +.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } +.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } +.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } +.#{$fa-css-prefix}-edit:before, +.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } +.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } +.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } +.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } +.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } +.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } +.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } +.#{$fa-css-prefix}-play:before { content: $fa-var-play; } +.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } +.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } +.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } +.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } +.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } +.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } +.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } +.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } +.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } +.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } +.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } +.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } +.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } +.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } +.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } +.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } +.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } +.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } +.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } +.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } +.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } +.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } +.#{$fa-css-prefix}-mail-forward:before, +.#{$fa-css-prefix}-share:before { content: $fa-var-share; } +.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } +.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } +.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } +.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } +.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } +.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } +.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } +.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } +.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } +.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } +.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } +.#{$fa-css-prefix}-warning:before, +.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } +.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } +.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } +.#{$fa-css-prefix}-random:before { content: $fa-var-random; } +.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } +.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } +.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } +.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } +.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } +.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } +.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } +.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } +.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } +.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } +.#{$fa-css-prefix}-bar-chart-o:before, +.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } +.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } +.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } +.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } +.#{$fa-css-prefix}-key:before { content: $fa-var-key; } +.#{$fa-css-prefix}-gears:before, +.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } +.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } +.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } +.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } +.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } +.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } +.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } +.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } +.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } +.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } +.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } +.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } +.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } +.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } +.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } +.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } +.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } +.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } +.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } +.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } +.#{$fa-css-prefix}-facebook-f:before, +.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } +.#{$fa-css-prefix}-github:before { content: $fa-var-github; } +.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } +.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } +.#{$fa-css-prefix}-feed:before, +.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } +.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } +.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } +.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } +.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } +.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } +.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } +.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } +.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } +.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } +.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } +.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } +.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } +.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } +.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } +.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } +.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } +.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } +.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } +.#{$fa-css-prefix}-group:before, +.#{$fa-css-prefix}-users:before { content: $fa-var-users; } +.#{$fa-css-prefix}-chain:before, +.#{$fa-css-prefix}-link:before { content: $fa-var-link; } +.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } +.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } +.#{$fa-css-prefix}-cut:before, +.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } +.#{$fa-css-prefix}-copy:before, +.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } +.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } +.#{$fa-css-prefix}-save:before, +.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } +.#{$fa-css-prefix}-square:before { content: $fa-var-square; } +.#{$fa-css-prefix}-navicon:before, +.#{$fa-css-prefix}-reorder:before, +.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } +.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } +.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } +.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } +.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } +.#{$fa-css-prefix}-table:before { content: $fa-var-table; } +.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } +.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } +.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } +.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } +.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } +.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } +.#{$fa-css-prefix}-money:before { content: $fa-var-money; } +.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } +.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } +.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } +.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } +.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } +.#{$fa-css-prefix}-unsorted:before, +.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } +.#{$fa-css-prefix}-sort-down:before, +.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } +.#{$fa-css-prefix}-sort-up:before, +.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } +.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } +.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } +.#{$fa-css-prefix}-rotate-left:before, +.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } +.#{$fa-css-prefix}-legal:before, +.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } +.#{$fa-css-prefix}-dashboard:before, +.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } +.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } +.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } +.#{$fa-css-prefix}-flash:before, +.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } +.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } +.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } +.#{$fa-css-prefix}-paste:before, +.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } +.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } +.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } +.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } +.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } +.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } +.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } +.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } +.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } +.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } +.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } +.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } +.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } +.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } +.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } +.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } +.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } +.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } +.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } +.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } +.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } +.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } +.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } +.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } +.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } +.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } +.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } +.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } +.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } +.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } +.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } +.#{$fa-css-prefix}-mobile-phone:before, +.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } +.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } +.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } +.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } +.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } +.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } +.#{$fa-css-prefix}-mail-reply:before, +.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } +.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } +.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } +.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } +.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } +.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } +.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } +.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } +.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } +.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } +.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } +.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } +.#{$fa-css-prefix}-code:before { content: $fa-var-code; } +.#{$fa-css-prefix}-mail-reply-all:before, +.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } +.#{$fa-css-prefix}-star-half-empty:before, +.#{$fa-css-prefix}-star-half-full:before, +.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } +.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } +.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } +.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } +.#{$fa-css-prefix}-unlink:before, +.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } +.#{$fa-css-prefix}-question:before { content: $fa-var-question; } +.#{$fa-css-prefix}-info:before { content: $fa-var-info; } +.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } +.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } +.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } +.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } +.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } +.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } +.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } +.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } +.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } +.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } +.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } +.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } +.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } +.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } +.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } +.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } +.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } +.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } +.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } +.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } +.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } +.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } +.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } +.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } +.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } +.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } +.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } +.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } +.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } +.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } +.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } +.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } +.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } +.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } +.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } +.#{$fa-css-prefix}-toggle-down:before, +.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } +.#{$fa-css-prefix}-toggle-up:before, +.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } +.#{$fa-css-prefix}-toggle-right:before, +.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } +.#{$fa-css-prefix}-euro:before, +.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } +.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } +.#{$fa-css-prefix}-dollar:before, +.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } +.#{$fa-css-prefix}-rupee:before, +.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } +.#{$fa-css-prefix}-cny:before, +.#{$fa-css-prefix}-rmb:before, +.#{$fa-css-prefix}-yen:before, +.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } +.#{$fa-css-prefix}-ruble:before, +.#{$fa-css-prefix}-rouble:before, +.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } +.#{$fa-css-prefix}-won:before, +.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } +.#{$fa-css-prefix}-bitcoin:before, +.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } +.#{$fa-css-prefix}-file:before { content: $fa-var-file; } +.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } +.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } +.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } +.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } +.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } +.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } +.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } +.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } +.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } +.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } +.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } +.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } +.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } +.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } +.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } +.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } +.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } +.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } +.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } +.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } +.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } +.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } +.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } +.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } +.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } +.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } +.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } +.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } +.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } +.#{$fa-css-prefix}-android:before { content: $fa-var-android; } +.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } +.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } +.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } +.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } +.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } +.#{$fa-css-prefix}-female:before { content: $fa-var-female; } +.#{$fa-css-prefix}-male:before { content: $fa-var-male; } +.#{$fa-css-prefix}-gittip:before, +.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } +.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } +.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } +.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } +.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } +.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } +.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } +.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } +.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } +.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } +.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } +.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } +.#{$fa-css-prefix}-toggle-left:before, +.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } +.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } +.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } +.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } +.#{$fa-css-prefix}-turkish-lira:before, +.#{$fa-css-prefix}-try:before { content: $fa-var-try; } +.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } +.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } +.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } +.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } +.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } +.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } +.#{$fa-css-prefix}-institution:before, +.#{$fa-css-prefix}-bank:before, +.#{$fa-css-prefix}-university:before { content: $fa-var-university; } +.#{$fa-css-prefix}-mortar-board:before, +.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } +.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } +.#{$fa-css-prefix}-google:before { content: $fa-var-google; } +.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } +.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } +.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } +.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } +.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } +.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } +.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } +.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } +.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } +.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } +.#{$fa-css-prefix}-language:before { content: $fa-var-language; } +.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } +.#{$fa-css-prefix}-building:before { content: $fa-var-building; } +.#{$fa-css-prefix}-child:before { content: $fa-var-child; } +.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } +.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } +.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } +.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } +.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } +.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } +.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } +.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } +.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } +.#{$fa-css-prefix}-automobile:before, +.#{$fa-css-prefix}-car:before { content: $fa-var-car; } +.#{$fa-css-prefix}-cab:before, +.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } +.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } +.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } +.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } +.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } +.#{$fa-css-prefix}-database:before { content: $fa-var-database; } +.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } +.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } +.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } +.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } +.#{$fa-css-prefix}-file-photo-o:before, +.#{$fa-css-prefix}-file-picture-o:before, +.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } +.#{$fa-css-prefix}-file-zip-o:before, +.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } +.#{$fa-css-prefix}-file-sound-o:before, +.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } +.#{$fa-css-prefix}-file-movie-o:before, +.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } +.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } +.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } +.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } +.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } +.#{$fa-css-prefix}-life-bouy:before, +.#{$fa-css-prefix}-life-buoy:before, +.#{$fa-css-prefix}-life-saver:before, +.#{$fa-css-prefix}-support:before, +.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } +.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } +.#{$fa-css-prefix}-ra:before, +.#{$fa-css-prefix}-resistance:before, +.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } +.#{$fa-css-prefix}-ge:before, +.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } +.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } +.#{$fa-css-prefix}-git:before { content: $fa-var-git; } +.#{$fa-css-prefix}-y-combinator-square:before, +.#{$fa-css-prefix}-yc-square:before, +.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } +.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } +.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } +.#{$fa-css-prefix}-wechat:before, +.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } +.#{$fa-css-prefix}-send:before, +.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } +.#{$fa-css-prefix}-send-o:before, +.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } +.#{$fa-css-prefix}-history:before { content: $fa-var-history; } +.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } +.#{$fa-css-prefix}-header:before { content: $fa-var-header; } +.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } +.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } +.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } +.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } +.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } +.#{$fa-css-prefix}-soccer-ball-o:before, +.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } +.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } +.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } +.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } +.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } +.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } +.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } +.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } +.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } +.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } +.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } +.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } +.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } +.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } +.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } +.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } +.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } +.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } +.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } +.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } +.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } +.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } +.#{$fa-css-prefix}-at:before { content: $fa-var-at; } +.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } +.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } +.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } +.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } +.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } +.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } +.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } +.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } +.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } +.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } +.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } +.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } +.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } +.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } +.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } +.#{$fa-css-prefix}-shekel:before, +.#{$fa-css-prefix}-sheqel:before, +.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } +.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } +.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } +.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } +.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } +.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } +.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } +.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } +.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } +.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } +.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } +.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } +.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } +.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } +.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } +.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } +.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } +.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } +.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } +.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } +.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } +.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } +.#{$fa-css-prefix}-intersex:before, +.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } +.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } +.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } +.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } +.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } +.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } +.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } +.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } +.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } +.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } +.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } +.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } +.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } +.#{$fa-css-prefix}-server:before { content: $fa-var-server; } +.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } +.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } +.#{$fa-css-prefix}-hotel:before, +.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } +.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } +.#{$fa-css-prefix}-train:before { content: $fa-var-train; } +.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } +.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } +.#{$fa-css-prefix}-yc:before, +.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } +.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } +.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } +.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } +.#{$fa-css-prefix}-battery-4:before, +.#{$fa-css-prefix}-battery:before, +.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } +.#{$fa-css-prefix}-battery-3:before, +.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } +.#{$fa-css-prefix}-battery-2:before, +.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } +.#{$fa-css-prefix}-battery-1:before, +.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } +.#{$fa-css-prefix}-battery-0:before, +.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } +.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } +.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } +.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } +.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } +.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } +.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } +.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } +.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } +.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } +.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } +.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } +.#{$fa-css-prefix}-hourglass-1:before, +.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } +.#{$fa-css-prefix}-hourglass-2:before, +.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } +.#{$fa-css-prefix}-hourglass-3:before, +.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } +.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } +.#{$fa-css-prefix}-hand-grab-o:before, +.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } +.#{$fa-css-prefix}-hand-stop-o:before, +.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } +.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } +.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } +.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } +.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } +.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } +.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } +.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } +.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } +.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } +.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } +.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } +.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } +.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } +.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } +.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } +.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } +.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } +.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } +.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } +.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } +.#{$fa-css-prefix}-tv:before, +.#{$fa-css-prefix}-television:before { content: $fa-var-television; } +.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } +.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } +.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } +.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } +.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } +.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } +.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } +.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } +.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } +.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } +.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } +.#{$fa-css-prefix}-map:before { content: $fa-var-map; } +.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } +.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } +.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } +.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } +.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } +.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } +.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } +.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } +.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } +.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } +.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } +.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } +.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } +.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } +.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } +.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } +.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } +.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } +.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } +.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } +.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } +.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } +.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } +.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } +.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } +.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } +.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; } +.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; } +.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; } +.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; } +.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; } +.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; } +.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; } +.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; } +.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; } +.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; } +.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; } +.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; } +.#{$fa-css-prefix}-asl-interpreting:before, +.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; } +.#{$fa-css-prefix}-deafness:before, +.#{$fa-css-prefix}-hard-of-hearing:before, +.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; } +.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; } +.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; } +.#{$fa-css-prefix}-signing:before, +.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; } +.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; } +.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; } +.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; } +.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } +.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } +.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } +.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } +.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } +.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } +.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } +.#{$fa-css-prefix}-google-plus-circle:before, +.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } +.#{$fa-css-prefix}-fa:before, +.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } +.#{$fa-css-prefix}-handshake-o:before { content: $fa-var-handshake-o; } +.#{$fa-css-prefix}-envelope-open:before { content: $fa-var-envelope-open; } +.#{$fa-css-prefix}-envelope-open-o:before { content: $fa-var-envelope-open-o; } +.#{$fa-css-prefix}-linode:before { content: $fa-var-linode; } +.#{$fa-css-prefix}-address-book:before { content: $fa-var-address-book; } +.#{$fa-css-prefix}-address-book-o:before { content: $fa-var-address-book-o; } +.#{$fa-css-prefix}-vcard:before, +.#{$fa-css-prefix}-address-card:before { content: $fa-var-address-card; } +.#{$fa-css-prefix}-vcard-o:before, +.#{$fa-css-prefix}-address-card-o:before { content: $fa-var-address-card-o; } +.#{$fa-css-prefix}-user-circle:before { content: $fa-var-user-circle; } +.#{$fa-css-prefix}-user-circle-o:before { content: $fa-var-user-circle-o; } +.#{$fa-css-prefix}-user-o:before { content: $fa-var-user-o; } +.#{$fa-css-prefix}-id-badge:before { content: $fa-var-id-badge; } +.#{$fa-css-prefix}-drivers-license:before, +.#{$fa-css-prefix}-id-card:before { content: $fa-var-id-card; } +.#{$fa-css-prefix}-drivers-license-o:before, +.#{$fa-css-prefix}-id-card-o:before { content: $fa-var-id-card-o; } +.#{$fa-css-prefix}-quora:before { content: $fa-var-quora; } +.#{$fa-css-prefix}-free-code-camp:before { content: $fa-var-free-code-camp; } +.#{$fa-css-prefix}-telegram:before { content: $fa-var-telegram; } +.#{$fa-css-prefix}-thermometer-4:before, +.#{$fa-css-prefix}-thermometer:before, +.#{$fa-css-prefix}-thermometer-full:before { content: $fa-var-thermometer-full; } +.#{$fa-css-prefix}-thermometer-3:before, +.#{$fa-css-prefix}-thermometer-three-quarters:before { content: $fa-var-thermometer-three-quarters; } +.#{$fa-css-prefix}-thermometer-2:before, +.#{$fa-css-prefix}-thermometer-half:before { content: $fa-var-thermometer-half; } +.#{$fa-css-prefix}-thermometer-1:before, +.#{$fa-css-prefix}-thermometer-quarter:before { content: $fa-var-thermometer-quarter; } +.#{$fa-css-prefix}-thermometer-0:before, +.#{$fa-css-prefix}-thermometer-empty:before { content: $fa-var-thermometer-empty; } +.#{$fa-css-prefix}-shower:before { content: $fa-var-shower; } +.#{$fa-css-prefix}-bathtub:before, +.#{$fa-css-prefix}-s15:before, +.#{$fa-css-prefix}-bath:before { content: $fa-var-bath; } +.#{$fa-css-prefix}-podcast:before { content: $fa-var-podcast; } +.#{$fa-css-prefix}-window-maximize:before { content: $fa-var-window-maximize; } +.#{$fa-css-prefix}-window-minimize:before { content: $fa-var-window-minimize; } +.#{$fa-css-prefix}-window-restore:before { content: $fa-var-window-restore; } +.#{$fa-css-prefix}-times-rectangle:before, +.#{$fa-css-prefix}-window-close:before { content: $fa-var-window-close; } +.#{$fa-css-prefix}-times-rectangle-o:before, +.#{$fa-css-prefix}-window-close-o:before { content: $fa-var-window-close-o; } +.#{$fa-css-prefix}-bandcamp:before { content: $fa-var-bandcamp; } +.#{$fa-css-prefix}-grav:before { content: $fa-var-grav; } +.#{$fa-css-prefix}-etsy:before { content: $fa-var-etsy; } +.#{$fa-css-prefix}-imdb:before { content: $fa-var-imdb; } +.#{$fa-css-prefix}-ravelry:before { content: $fa-var-ravelry; } +.#{$fa-css-prefix}-eercast:before { content: $fa-var-eercast; } +.#{$fa-css-prefix}-microchip:before { content: $fa-var-microchip; } +.#{$fa-css-prefix}-snowflake-o:before { content: $fa-var-snowflake-o; } +.#{$fa-css-prefix}-superpowers:before { content: $fa-var-superpowers; } +.#{$fa-css-prefix}-wpexplorer:before { content: $fa-var-wpexplorer; } +.#{$fa-css-prefix}-meetup:before { content: $fa-var-meetup; } diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_larger.scss b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_larger.scss new file mode 100644 index 000000000..41e9a8184 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_larger.scss @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.#{$fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.#{$fa-css-prefix}-2x { font-size: 2em; } +.#{$fa-css-prefix}-3x { font-size: 3em; } +.#{$fa-css-prefix}-4x { font-size: 4em; } +.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_list.scss b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_list.scss new file mode 100644 index 000000000..7d1e4d54d --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_list.scss @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.#{$fa-css-prefix}-ul { + padding-left: 0; + margin-left: $fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.#{$fa-css-prefix}-li { + position: absolute; + left: -$fa-li-width; + width: $fa-li-width; + top: (2em / 14); + text-align: center; + &.#{$fa-css-prefix}-lg { + left: -$fa-li-width + (4em / 14); + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_mixins.scss b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_mixins.scss new file mode 100644 index 000000000..c3bbd5745 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_mixins.scss @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +@mixin fa-icon() { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +@mixin fa-icon-rotate($degrees, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; + -webkit-transform: rotate($degrees); + -ms-transform: rotate($degrees); + transform: rotate($degrees); +} + +@mixin fa-icon-flip($horiz, $vert, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; + -webkit-transform: scale($horiz, $vert); + -ms-transform: scale($horiz, $vert); + transform: scale($horiz, $vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +@mixin sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +@mixin sr-only-focusable { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_path.scss b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_path.scss new file mode 100644 index 000000000..bb457c23a --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_path.scss @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); + src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), + url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), + url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), + url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), + url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); +// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_rotated-flipped.scss b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_rotated-flipped.scss new file mode 100644 index 000000000..a3558fd09 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_rotated-flipped.scss @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } +.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } +.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } + +.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } +.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .#{$fa-css-prefix}-rotate-90, +:root .#{$fa-css-prefix}-rotate-180, +:root .#{$fa-css-prefix}-rotate-270, +:root .#{$fa-css-prefix}-flip-horizontal, +:root .#{$fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_screen-reader.scss b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_screen-reader.scss new file mode 100644 index 000000000..637426f0d --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_screen-reader.scss @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { @include sr-only(); } +.sr-only-focusable { @include sr-only-focusable(); } diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_stacked.scss b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_stacked.scss new file mode 100644 index 000000000..aef740366 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_stacked.scss @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.#{$fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.#{$fa-css-prefix}-stack-1x { line-height: inherit; } +.#{$fa-css-prefix}-stack-2x { font-size: 2em; } +.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_variables.scss b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_variables.scss new file mode 100644 index 000000000..498fc4a08 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/_variables.scss @@ -0,0 +1,800 @@ +// Variables +// -------------------------- + +$fa-font-path: "../fonts" !default; +$fa-font-size-base: 14px !default; +$fa-line-height-base: 1 !default; +//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly +$fa-css-prefix: fa !default; +$fa-version: "4.7.0" !default; +$fa-border-color: #eee !default; +$fa-inverse: #fff !default; +$fa-li-width: (30em / 14) !default; + +$fa-var-500px: "\f26e"; +$fa-var-address-book: "\f2b9"; +$fa-var-address-book-o: "\f2ba"; +$fa-var-address-card: "\f2bb"; +$fa-var-address-card-o: "\f2bc"; +$fa-var-adjust: "\f042"; +$fa-var-adn: "\f170"; +$fa-var-align-center: "\f037"; +$fa-var-align-justify: "\f039"; +$fa-var-align-left: "\f036"; +$fa-var-align-right: "\f038"; +$fa-var-amazon: "\f270"; +$fa-var-ambulance: "\f0f9"; +$fa-var-american-sign-language-interpreting: "\f2a3"; +$fa-var-anchor: "\f13d"; +$fa-var-android: "\f17b"; +$fa-var-angellist: "\f209"; +$fa-var-angle-double-down: "\f103"; +$fa-var-angle-double-left: "\f100"; +$fa-var-angle-double-right: "\f101"; +$fa-var-angle-double-up: "\f102"; +$fa-var-angle-down: "\f107"; +$fa-var-angle-left: "\f104"; +$fa-var-angle-right: "\f105"; +$fa-var-angle-up: "\f106"; +$fa-var-apple: "\f179"; +$fa-var-archive: "\f187"; +$fa-var-area-chart: "\f1fe"; +$fa-var-arrow-circle-down: "\f0ab"; +$fa-var-arrow-circle-left: "\f0a8"; +$fa-var-arrow-circle-o-down: "\f01a"; +$fa-var-arrow-circle-o-left: "\f190"; +$fa-var-arrow-circle-o-right: "\f18e"; +$fa-var-arrow-circle-o-up: "\f01b"; +$fa-var-arrow-circle-right: "\f0a9"; +$fa-var-arrow-circle-up: "\f0aa"; +$fa-var-arrow-down: "\f063"; +$fa-var-arrow-left: "\f060"; +$fa-var-arrow-right: "\f061"; +$fa-var-arrow-up: "\f062"; +$fa-var-arrows: "\f047"; +$fa-var-arrows-alt: "\f0b2"; +$fa-var-arrows-h: "\f07e"; +$fa-var-arrows-v: "\f07d"; +$fa-var-asl-interpreting: "\f2a3"; +$fa-var-assistive-listening-systems: "\f2a2"; +$fa-var-asterisk: "\f069"; +$fa-var-at: "\f1fa"; +$fa-var-audio-description: "\f29e"; +$fa-var-automobile: "\f1b9"; +$fa-var-backward: "\f04a"; +$fa-var-balance-scale: "\f24e"; +$fa-var-ban: "\f05e"; +$fa-var-bandcamp: "\f2d5"; +$fa-var-bank: "\f19c"; +$fa-var-bar-chart: "\f080"; +$fa-var-bar-chart-o: "\f080"; +$fa-var-barcode: "\f02a"; +$fa-var-bars: "\f0c9"; +$fa-var-bath: "\f2cd"; +$fa-var-bathtub: "\f2cd"; +$fa-var-battery: "\f240"; +$fa-var-battery-0: "\f244"; +$fa-var-battery-1: "\f243"; +$fa-var-battery-2: "\f242"; +$fa-var-battery-3: "\f241"; +$fa-var-battery-4: "\f240"; +$fa-var-battery-empty: "\f244"; +$fa-var-battery-full: "\f240"; +$fa-var-battery-half: "\f242"; +$fa-var-battery-quarter: "\f243"; +$fa-var-battery-three-quarters: "\f241"; +$fa-var-bed: "\f236"; +$fa-var-beer: "\f0fc"; +$fa-var-behance: "\f1b4"; +$fa-var-behance-square: "\f1b5"; +$fa-var-bell: "\f0f3"; +$fa-var-bell-o: "\f0a2"; +$fa-var-bell-slash: "\f1f6"; +$fa-var-bell-slash-o: "\f1f7"; +$fa-var-bicycle: "\f206"; +$fa-var-binoculars: "\f1e5"; +$fa-var-birthday-cake: "\f1fd"; +$fa-var-bitbucket: "\f171"; +$fa-var-bitbucket-square: "\f172"; +$fa-var-bitcoin: "\f15a"; +$fa-var-black-tie: "\f27e"; +$fa-var-blind: "\f29d"; +$fa-var-bluetooth: "\f293"; +$fa-var-bluetooth-b: "\f294"; +$fa-var-bold: "\f032"; +$fa-var-bolt: "\f0e7"; +$fa-var-bomb: "\f1e2"; +$fa-var-book: "\f02d"; +$fa-var-bookmark: "\f02e"; +$fa-var-bookmark-o: "\f097"; +$fa-var-braille: "\f2a1"; +$fa-var-briefcase: "\f0b1"; +$fa-var-btc: "\f15a"; +$fa-var-bug: "\f188"; +$fa-var-building: "\f1ad"; +$fa-var-building-o: "\f0f7"; +$fa-var-bullhorn: "\f0a1"; +$fa-var-bullseye: "\f140"; +$fa-var-bus: "\f207"; +$fa-var-buysellads: "\f20d"; +$fa-var-cab: "\f1ba"; +$fa-var-calculator: "\f1ec"; +$fa-var-calendar: "\f073"; +$fa-var-calendar-check-o: "\f274"; +$fa-var-calendar-minus-o: "\f272"; +$fa-var-calendar-o: "\f133"; +$fa-var-calendar-plus-o: "\f271"; +$fa-var-calendar-times-o: "\f273"; +$fa-var-camera: "\f030"; +$fa-var-camera-retro: "\f083"; +$fa-var-car: "\f1b9"; +$fa-var-caret-down: "\f0d7"; +$fa-var-caret-left: "\f0d9"; +$fa-var-caret-right: "\f0da"; +$fa-var-caret-square-o-down: "\f150"; +$fa-var-caret-square-o-left: "\f191"; +$fa-var-caret-square-o-right: "\f152"; +$fa-var-caret-square-o-up: "\f151"; +$fa-var-caret-up: "\f0d8"; +$fa-var-cart-arrow-down: "\f218"; +$fa-var-cart-plus: "\f217"; +$fa-var-cc: "\f20a"; +$fa-var-cc-amex: "\f1f3"; +$fa-var-cc-diners-club: "\f24c"; +$fa-var-cc-discover: "\f1f2"; +$fa-var-cc-jcb: "\f24b"; +$fa-var-cc-mastercard: "\f1f1"; +$fa-var-cc-paypal: "\f1f4"; +$fa-var-cc-stripe: "\f1f5"; +$fa-var-cc-visa: "\f1f0"; +$fa-var-certificate: "\f0a3"; +$fa-var-chain: "\f0c1"; +$fa-var-chain-broken: "\f127"; +$fa-var-check: "\f00c"; +$fa-var-check-circle: "\f058"; +$fa-var-check-circle-o: "\f05d"; +$fa-var-check-square: "\f14a"; +$fa-var-check-square-o: "\f046"; +$fa-var-chevron-circle-down: "\f13a"; +$fa-var-chevron-circle-left: "\f137"; +$fa-var-chevron-circle-right: "\f138"; +$fa-var-chevron-circle-up: "\f139"; +$fa-var-chevron-down: "\f078"; +$fa-var-chevron-left: "\f053"; +$fa-var-chevron-right: "\f054"; +$fa-var-chevron-up: "\f077"; +$fa-var-child: "\f1ae"; +$fa-var-chrome: "\f268"; +$fa-var-circle: "\f111"; +$fa-var-circle-o: "\f10c"; +$fa-var-circle-o-notch: "\f1ce"; +$fa-var-circle-thin: "\f1db"; +$fa-var-clipboard: "\f0ea"; +$fa-var-clock-o: "\f017"; +$fa-var-clone: "\f24d"; +$fa-var-close: "\f00d"; +$fa-var-cloud: "\f0c2"; +$fa-var-cloud-download: "\f0ed"; +$fa-var-cloud-upload: "\f0ee"; +$fa-var-cny: "\f157"; +$fa-var-code: "\f121"; +$fa-var-code-fork: "\f126"; +$fa-var-codepen: "\f1cb"; +$fa-var-codiepie: "\f284"; +$fa-var-coffee: "\f0f4"; +$fa-var-cog: "\f013"; +$fa-var-cogs: "\f085"; +$fa-var-columns: "\f0db"; +$fa-var-comment: "\f075"; +$fa-var-comment-o: "\f0e5"; +$fa-var-commenting: "\f27a"; +$fa-var-commenting-o: "\f27b"; +$fa-var-comments: "\f086"; +$fa-var-comments-o: "\f0e6"; +$fa-var-compass: "\f14e"; +$fa-var-compress: "\f066"; +$fa-var-connectdevelop: "\f20e"; +$fa-var-contao: "\f26d"; +$fa-var-copy: "\f0c5"; +$fa-var-copyright: "\f1f9"; +$fa-var-creative-commons: "\f25e"; +$fa-var-credit-card: "\f09d"; +$fa-var-credit-card-alt: "\f283"; +$fa-var-crop: "\f125"; +$fa-var-crosshairs: "\f05b"; +$fa-var-css3: "\f13c"; +$fa-var-cube: "\f1b2"; +$fa-var-cubes: "\f1b3"; +$fa-var-cut: "\f0c4"; +$fa-var-cutlery: "\f0f5"; +$fa-var-dashboard: "\f0e4"; +$fa-var-dashcube: "\f210"; +$fa-var-database: "\f1c0"; +$fa-var-deaf: "\f2a4"; +$fa-var-deafness: "\f2a4"; +$fa-var-dedent: "\f03b"; +$fa-var-delicious: "\f1a5"; +$fa-var-desktop: "\f108"; +$fa-var-deviantart: "\f1bd"; +$fa-var-diamond: "\f219"; +$fa-var-digg: "\f1a6"; +$fa-var-dollar: "\f155"; +$fa-var-dot-circle-o: "\f192"; +$fa-var-download: "\f019"; +$fa-var-dribbble: "\f17d"; +$fa-var-drivers-license: "\f2c2"; +$fa-var-drivers-license-o: "\f2c3"; +$fa-var-dropbox: "\f16b"; +$fa-var-drupal: "\f1a9"; +$fa-var-edge: "\f282"; +$fa-var-edit: "\f044"; +$fa-var-eercast: "\f2da"; +$fa-var-eject: "\f052"; +$fa-var-ellipsis-h: "\f141"; +$fa-var-ellipsis-v: "\f142"; +$fa-var-empire: "\f1d1"; +$fa-var-envelope: "\f0e0"; +$fa-var-envelope-o: "\f003"; +$fa-var-envelope-open: "\f2b6"; +$fa-var-envelope-open-o: "\f2b7"; +$fa-var-envelope-square: "\f199"; +$fa-var-envira: "\f299"; +$fa-var-eraser: "\f12d"; +$fa-var-etsy: "\f2d7"; +$fa-var-eur: "\f153"; +$fa-var-euro: "\f153"; +$fa-var-exchange: "\f0ec"; +$fa-var-exclamation: "\f12a"; +$fa-var-exclamation-circle: "\f06a"; +$fa-var-exclamation-triangle: "\f071"; +$fa-var-expand: "\f065"; +$fa-var-expeditedssl: "\f23e"; +$fa-var-external-link: "\f08e"; +$fa-var-external-link-square: "\f14c"; +$fa-var-eye: "\f06e"; +$fa-var-eye-slash: "\f070"; +$fa-var-eyedropper: "\f1fb"; +$fa-var-fa: "\f2b4"; +$fa-var-facebook: "\f09a"; +$fa-var-facebook-f: "\f09a"; +$fa-var-facebook-official: "\f230"; +$fa-var-facebook-square: "\f082"; +$fa-var-fast-backward: "\f049"; +$fa-var-fast-forward: "\f050"; +$fa-var-fax: "\f1ac"; +$fa-var-feed: "\f09e"; +$fa-var-female: "\f182"; +$fa-var-fighter-jet: "\f0fb"; +$fa-var-file: "\f15b"; +$fa-var-file-archive-o: "\f1c6"; +$fa-var-file-audio-o: "\f1c7"; +$fa-var-file-code-o: "\f1c9"; +$fa-var-file-excel-o: "\f1c3"; +$fa-var-file-image-o: "\f1c5"; +$fa-var-file-movie-o: "\f1c8"; +$fa-var-file-o: "\f016"; +$fa-var-file-pdf-o: "\f1c1"; +$fa-var-file-photo-o: "\f1c5"; +$fa-var-file-picture-o: "\f1c5"; +$fa-var-file-powerpoint-o: "\f1c4"; +$fa-var-file-sound-o: "\f1c7"; +$fa-var-file-text: "\f15c"; +$fa-var-file-text-o: "\f0f6"; +$fa-var-file-video-o: "\f1c8"; +$fa-var-file-word-o: "\f1c2"; +$fa-var-file-zip-o: "\f1c6"; +$fa-var-files-o: "\f0c5"; +$fa-var-film: "\f008"; +$fa-var-filter: "\f0b0"; +$fa-var-fire: "\f06d"; +$fa-var-fire-extinguisher: "\f134"; +$fa-var-firefox: "\f269"; +$fa-var-first-order: "\f2b0"; +$fa-var-flag: "\f024"; +$fa-var-flag-checkered: "\f11e"; +$fa-var-flag-o: "\f11d"; +$fa-var-flash: "\f0e7"; +$fa-var-flask: "\f0c3"; +$fa-var-flickr: "\f16e"; +$fa-var-floppy-o: "\f0c7"; +$fa-var-folder: "\f07b"; +$fa-var-folder-o: "\f114"; +$fa-var-folder-open: "\f07c"; +$fa-var-folder-open-o: "\f115"; +$fa-var-font: "\f031"; +$fa-var-font-awesome: "\f2b4"; +$fa-var-fonticons: "\f280"; +$fa-var-fort-awesome: "\f286"; +$fa-var-forumbee: "\f211"; +$fa-var-forward: "\f04e"; +$fa-var-foursquare: "\f180"; +$fa-var-free-code-camp: "\f2c5"; +$fa-var-frown-o: "\f119"; +$fa-var-futbol-o: "\f1e3"; +$fa-var-gamepad: "\f11b"; +$fa-var-gavel: "\f0e3"; +$fa-var-gbp: "\f154"; +$fa-var-ge: "\f1d1"; +$fa-var-gear: "\f013"; +$fa-var-gears: "\f085"; +$fa-var-genderless: "\f22d"; +$fa-var-get-pocket: "\f265"; +$fa-var-gg: "\f260"; +$fa-var-gg-circle: "\f261"; +$fa-var-gift: "\f06b"; +$fa-var-git: "\f1d3"; +$fa-var-git-square: "\f1d2"; +$fa-var-github: "\f09b"; +$fa-var-github-alt: "\f113"; +$fa-var-github-square: "\f092"; +$fa-var-gitlab: "\f296"; +$fa-var-gittip: "\f184"; +$fa-var-glass: "\f000"; +$fa-var-glide: "\f2a5"; +$fa-var-glide-g: "\f2a6"; +$fa-var-globe: "\f0ac"; +$fa-var-google: "\f1a0"; +$fa-var-google-plus: "\f0d5"; +$fa-var-google-plus-circle: "\f2b3"; +$fa-var-google-plus-official: "\f2b3"; +$fa-var-google-plus-square: "\f0d4"; +$fa-var-google-wallet: "\f1ee"; +$fa-var-graduation-cap: "\f19d"; +$fa-var-gratipay: "\f184"; +$fa-var-grav: "\f2d6"; +$fa-var-group: "\f0c0"; +$fa-var-h-square: "\f0fd"; +$fa-var-hacker-news: "\f1d4"; +$fa-var-hand-grab-o: "\f255"; +$fa-var-hand-lizard-o: "\f258"; +$fa-var-hand-o-down: "\f0a7"; +$fa-var-hand-o-left: "\f0a5"; +$fa-var-hand-o-right: "\f0a4"; +$fa-var-hand-o-up: "\f0a6"; +$fa-var-hand-paper-o: "\f256"; +$fa-var-hand-peace-o: "\f25b"; +$fa-var-hand-pointer-o: "\f25a"; +$fa-var-hand-rock-o: "\f255"; +$fa-var-hand-scissors-o: "\f257"; +$fa-var-hand-spock-o: "\f259"; +$fa-var-hand-stop-o: "\f256"; +$fa-var-handshake-o: "\f2b5"; +$fa-var-hard-of-hearing: "\f2a4"; +$fa-var-hashtag: "\f292"; +$fa-var-hdd-o: "\f0a0"; +$fa-var-header: "\f1dc"; +$fa-var-headphones: "\f025"; +$fa-var-heart: "\f004"; +$fa-var-heart-o: "\f08a"; +$fa-var-heartbeat: "\f21e"; +$fa-var-history: "\f1da"; +$fa-var-home: "\f015"; +$fa-var-hospital-o: "\f0f8"; +$fa-var-hotel: "\f236"; +$fa-var-hourglass: "\f254"; +$fa-var-hourglass-1: "\f251"; +$fa-var-hourglass-2: "\f252"; +$fa-var-hourglass-3: "\f253"; +$fa-var-hourglass-end: "\f253"; +$fa-var-hourglass-half: "\f252"; +$fa-var-hourglass-o: "\f250"; +$fa-var-hourglass-start: "\f251"; +$fa-var-houzz: "\f27c"; +$fa-var-html5: "\f13b"; +$fa-var-i-cursor: "\f246"; +$fa-var-id-badge: "\f2c1"; +$fa-var-id-card: "\f2c2"; +$fa-var-id-card-o: "\f2c3"; +$fa-var-ils: "\f20b"; +$fa-var-image: "\f03e"; +$fa-var-imdb: "\f2d8"; +$fa-var-inbox: "\f01c"; +$fa-var-indent: "\f03c"; +$fa-var-industry: "\f275"; +$fa-var-info: "\f129"; +$fa-var-info-circle: "\f05a"; +$fa-var-inr: "\f156"; +$fa-var-instagram: "\f16d"; +$fa-var-institution: "\f19c"; +$fa-var-internet-explorer: "\f26b"; +$fa-var-intersex: "\f224"; +$fa-var-ioxhost: "\f208"; +$fa-var-italic: "\f033"; +$fa-var-joomla: "\f1aa"; +$fa-var-jpy: "\f157"; +$fa-var-jsfiddle: "\f1cc"; +$fa-var-key: "\f084"; +$fa-var-keyboard-o: "\f11c"; +$fa-var-krw: "\f159"; +$fa-var-language: "\f1ab"; +$fa-var-laptop: "\f109"; +$fa-var-lastfm: "\f202"; +$fa-var-lastfm-square: "\f203"; +$fa-var-leaf: "\f06c"; +$fa-var-leanpub: "\f212"; +$fa-var-legal: "\f0e3"; +$fa-var-lemon-o: "\f094"; +$fa-var-level-down: "\f149"; +$fa-var-level-up: "\f148"; +$fa-var-life-bouy: "\f1cd"; +$fa-var-life-buoy: "\f1cd"; +$fa-var-life-ring: "\f1cd"; +$fa-var-life-saver: "\f1cd"; +$fa-var-lightbulb-o: "\f0eb"; +$fa-var-line-chart: "\f201"; +$fa-var-link: "\f0c1"; +$fa-var-linkedin: "\f0e1"; +$fa-var-linkedin-square: "\f08c"; +$fa-var-linode: "\f2b8"; +$fa-var-linux: "\f17c"; +$fa-var-list: "\f03a"; +$fa-var-list-alt: "\f022"; +$fa-var-list-ol: "\f0cb"; +$fa-var-list-ul: "\f0ca"; +$fa-var-location-arrow: "\f124"; +$fa-var-lock: "\f023"; +$fa-var-long-arrow-down: "\f175"; +$fa-var-long-arrow-left: "\f177"; +$fa-var-long-arrow-right: "\f178"; +$fa-var-long-arrow-up: "\f176"; +$fa-var-low-vision: "\f2a8"; +$fa-var-magic: "\f0d0"; +$fa-var-magnet: "\f076"; +$fa-var-mail-forward: "\f064"; +$fa-var-mail-reply: "\f112"; +$fa-var-mail-reply-all: "\f122"; +$fa-var-male: "\f183"; +$fa-var-map: "\f279"; +$fa-var-map-marker: "\f041"; +$fa-var-map-o: "\f278"; +$fa-var-map-pin: "\f276"; +$fa-var-map-signs: "\f277"; +$fa-var-mars: "\f222"; +$fa-var-mars-double: "\f227"; +$fa-var-mars-stroke: "\f229"; +$fa-var-mars-stroke-h: "\f22b"; +$fa-var-mars-stroke-v: "\f22a"; +$fa-var-maxcdn: "\f136"; +$fa-var-meanpath: "\f20c"; +$fa-var-medium: "\f23a"; +$fa-var-medkit: "\f0fa"; +$fa-var-meetup: "\f2e0"; +$fa-var-meh-o: "\f11a"; +$fa-var-mercury: "\f223"; +$fa-var-microchip: "\f2db"; +$fa-var-microphone: "\f130"; +$fa-var-microphone-slash: "\f131"; +$fa-var-minus: "\f068"; +$fa-var-minus-circle: "\f056"; +$fa-var-minus-square: "\f146"; +$fa-var-minus-square-o: "\f147"; +$fa-var-mixcloud: "\f289"; +$fa-var-mobile: "\f10b"; +$fa-var-mobile-phone: "\f10b"; +$fa-var-modx: "\f285"; +$fa-var-money: "\f0d6"; +$fa-var-moon-o: "\f186"; +$fa-var-mortar-board: "\f19d"; +$fa-var-motorcycle: "\f21c"; +$fa-var-mouse-pointer: "\f245"; +$fa-var-music: "\f001"; +$fa-var-navicon: "\f0c9"; +$fa-var-neuter: "\f22c"; +$fa-var-newspaper-o: "\f1ea"; +$fa-var-object-group: "\f247"; +$fa-var-object-ungroup: "\f248"; +$fa-var-odnoklassniki: "\f263"; +$fa-var-odnoklassniki-square: "\f264"; +$fa-var-opencart: "\f23d"; +$fa-var-openid: "\f19b"; +$fa-var-opera: "\f26a"; +$fa-var-optin-monster: "\f23c"; +$fa-var-outdent: "\f03b"; +$fa-var-pagelines: "\f18c"; +$fa-var-paint-brush: "\f1fc"; +$fa-var-paper-plane: "\f1d8"; +$fa-var-paper-plane-o: "\f1d9"; +$fa-var-paperclip: "\f0c6"; +$fa-var-paragraph: "\f1dd"; +$fa-var-paste: "\f0ea"; +$fa-var-pause: "\f04c"; +$fa-var-pause-circle: "\f28b"; +$fa-var-pause-circle-o: "\f28c"; +$fa-var-paw: "\f1b0"; +$fa-var-paypal: "\f1ed"; +$fa-var-pencil: "\f040"; +$fa-var-pencil-square: "\f14b"; +$fa-var-pencil-square-o: "\f044"; +$fa-var-percent: "\f295"; +$fa-var-phone: "\f095"; +$fa-var-phone-square: "\f098"; +$fa-var-photo: "\f03e"; +$fa-var-picture-o: "\f03e"; +$fa-var-pie-chart: "\f200"; +$fa-var-pied-piper: "\f2ae"; +$fa-var-pied-piper-alt: "\f1a8"; +$fa-var-pied-piper-pp: "\f1a7"; +$fa-var-pinterest: "\f0d2"; +$fa-var-pinterest-p: "\f231"; +$fa-var-pinterest-square: "\f0d3"; +$fa-var-plane: "\f072"; +$fa-var-play: "\f04b"; +$fa-var-play-circle: "\f144"; +$fa-var-play-circle-o: "\f01d"; +$fa-var-plug: "\f1e6"; +$fa-var-plus: "\f067"; +$fa-var-plus-circle: "\f055"; +$fa-var-plus-square: "\f0fe"; +$fa-var-plus-square-o: "\f196"; +$fa-var-podcast: "\f2ce"; +$fa-var-power-off: "\f011"; +$fa-var-print: "\f02f"; +$fa-var-product-hunt: "\f288"; +$fa-var-puzzle-piece: "\f12e"; +$fa-var-qq: "\f1d6"; +$fa-var-qrcode: "\f029"; +$fa-var-question: "\f128"; +$fa-var-question-circle: "\f059"; +$fa-var-question-circle-o: "\f29c"; +$fa-var-quora: "\f2c4"; +$fa-var-quote-left: "\f10d"; +$fa-var-quote-right: "\f10e"; +$fa-var-ra: "\f1d0"; +$fa-var-random: "\f074"; +$fa-var-ravelry: "\f2d9"; +$fa-var-rebel: "\f1d0"; +$fa-var-recycle: "\f1b8"; +$fa-var-reddit: "\f1a1"; +$fa-var-reddit-alien: "\f281"; +$fa-var-reddit-square: "\f1a2"; +$fa-var-refresh: "\f021"; +$fa-var-registered: "\f25d"; +$fa-var-remove: "\f00d"; +$fa-var-renren: "\f18b"; +$fa-var-reorder: "\f0c9"; +$fa-var-repeat: "\f01e"; +$fa-var-reply: "\f112"; +$fa-var-reply-all: "\f122"; +$fa-var-resistance: "\f1d0"; +$fa-var-retweet: "\f079"; +$fa-var-rmb: "\f157"; +$fa-var-road: "\f018"; +$fa-var-rocket: "\f135"; +$fa-var-rotate-left: "\f0e2"; +$fa-var-rotate-right: "\f01e"; +$fa-var-rouble: "\f158"; +$fa-var-rss: "\f09e"; +$fa-var-rss-square: "\f143"; +$fa-var-rub: "\f158"; +$fa-var-ruble: "\f158"; +$fa-var-rupee: "\f156"; +$fa-var-s15: "\f2cd"; +$fa-var-safari: "\f267"; +$fa-var-save: "\f0c7"; +$fa-var-scissors: "\f0c4"; +$fa-var-scribd: "\f28a"; +$fa-var-search: "\f002"; +$fa-var-search-minus: "\f010"; +$fa-var-search-plus: "\f00e"; +$fa-var-sellsy: "\f213"; +$fa-var-send: "\f1d8"; +$fa-var-send-o: "\f1d9"; +$fa-var-server: "\f233"; +$fa-var-share: "\f064"; +$fa-var-share-alt: "\f1e0"; +$fa-var-share-alt-square: "\f1e1"; +$fa-var-share-square: "\f14d"; +$fa-var-share-square-o: "\f045"; +$fa-var-shekel: "\f20b"; +$fa-var-sheqel: "\f20b"; +$fa-var-shield: "\f132"; +$fa-var-ship: "\f21a"; +$fa-var-shirtsinbulk: "\f214"; +$fa-var-shopping-bag: "\f290"; +$fa-var-shopping-basket: "\f291"; +$fa-var-shopping-cart: "\f07a"; +$fa-var-shower: "\f2cc"; +$fa-var-sign-in: "\f090"; +$fa-var-sign-language: "\f2a7"; +$fa-var-sign-out: "\f08b"; +$fa-var-signal: "\f012"; +$fa-var-signing: "\f2a7"; +$fa-var-simplybuilt: "\f215"; +$fa-var-sitemap: "\f0e8"; +$fa-var-skyatlas: "\f216"; +$fa-var-skype: "\f17e"; +$fa-var-slack: "\f198"; +$fa-var-sliders: "\f1de"; +$fa-var-slideshare: "\f1e7"; +$fa-var-smile-o: "\f118"; +$fa-var-snapchat: "\f2ab"; +$fa-var-snapchat-ghost: "\f2ac"; +$fa-var-snapchat-square: "\f2ad"; +$fa-var-snowflake-o: "\f2dc"; +$fa-var-soccer-ball-o: "\f1e3"; +$fa-var-sort: "\f0dc"; +$fa-var-sort-alpha-asc: "\f15d"; +$fa-var-sort-alpha-desc: "\f15e"; +$fa-var-sort-amount-asc: "\f160"; +$fa-var-sort-amount-desc: "\f161"; +$fa-var-sort-asc: "\f0de"; +$fa-var-sort-desc: "\f0dd"; +$fa-var-sort-down: "\f0dd"; +$fa-var-sort-numeric-asc: "\f162"; +$fa-var-sort-numeric-desc: "\f163"; +$fa-var-sort-up: "\f0de"; +$fa-var-soundcloud: "\f1be"; +$fa-var-space-shuttle: "\f197"; +$fa-var-spinner: "\f110"; +$fa-var-spoon: "\f1b1"; +$fa-var-spotify: "\f1bc"; +$fa-var-square: "\f0c8"; +$fa-var-square-o: "\f096"; +$fa-var-stack-exchange: "\f18d"; +$fa-var-stack-overflow: "\f16c"; +$fa-var-star: "\f005"; +$fa-var-star-half: "\f089"; +$fa-var-star-half-empty: "\f123"; +$fa-var-star-half-full: "\f123"; +$fa-var-star-half-o: "\f123"; +$fa-var-star-o: "\f006"; +$fa-var-steam: "\f1b6"; +$fa-var-steam-square: "\f1b7"; +$fa-var-step-backward: "\f048"; +$fa-var-step-forward: "\f051"; +$fa-var-stethoscope: "\f0f1"; +$fa-var-sticky-note: "\f249"; +$fa-var-sticky-note-o: "\f24a"; +$fa-var-stop: "\f04d"; +$fa-var-stop-circle: "\f28d"; +$fa-var-stop-circle-o: "\f28e"; +$fa-var-street-view: "\f21d"; +$fa-var-strikethrough: "\f0cc"; +$fa-var-stumbleupon: "\f1a4"; +$fa-var-stumbleupon-circle: "\f1a3"; +$fa-var-subscript: "\f12c"; +$fa-var-subway: "\f239"; +$fa-var-suitcase: "\f0f2"; +$fa-var-sun-o: "\f185"; +$fa-var-superpowers: "\f2dd"; +$fa-var-superscript: "\f12b"; +$fa-var-support: "\f1cd"; +$fa-var-table: "\f0ce"; +$fa-var-tablet: "\f10a"; +$fa-var-tachometer: "\f0e4"; +$fa-var-tag: "\f02b"; +$fa-var-tags: "\f02c"; +$fa-var-tasks: "\f0ae"; +$fa-var-taxi: "\f1ba"; +$fa-var-telegram: "\f2c6"; +$fa-var-television: "\f26c"; +$fa-var-tencent-weibo: "\f1d5"; +$fa-var-terminal: "\f120"; +$fa-var-text-height: "\f034"; +$fa-var-text-width: "\f035"; +$fa-var-th: "\f00a"; +$fa-var-th-large: "\f009"; +$fa-var-th-list: "\f00b"; +$fa-var-themeisle: "\f2b2"; +$fa-var-thermometer: "\f2c7"; +$fa-var-thermometer-0: "\f2cb"; +$fa-var-thermometer-1: "\f2ca"; +$fa-var-thermometer-2: "\f2c9"; +$fa-var-thermometer-3: "\f2c8"; +$fa-var-thermometer-4: "\f2c7"; +$fa-var-thermometer-empty: "\f2cb"; +$fa-var-thermometer-full: "\f2c7"; +$fa-var-thermometer-half: "\f2c9"; +$fa-var-thermometer-quarter: "\f2ca"; +$fa-var-thermometer-three-quarters: "\f2c8"; +$fa-var-thumb-tack: "\f08d"; +$fa-var-thumbs-down: "\f165"; +$fa-var-thumbs-o-down: "\f088"; +$fa-var-thumbs-o-up: "\f087"; +$fa-var-thumbs-up: "\f164"; +$fa-var-ticket: "\f145"; +$fa-var-times: "\f00d"; +$fa-var-times-circle: "\f057"; +$fa-var-times-circle-o: "\f05c"; +$fa-var-times-rectangle: "\f2d3"; +$fa-var-times-rectangle-o: "\f2d4"; +$fa-var-tint: "\f043"; +$fa-var-toggle-down: "\f150"; +$fa-var-toggle-left: "\f191"; +$fa-var-toggle-off: "\f204"; +$fa-var-toggle-on: "\f205"; +$fa-var-toggle-right: "\f152"; +$fa-var-toggle-up: "\f151"; +$fa-var-trademark: "\f25c"; +$fa-var-train: "\f238"; +$fa-var-transgender: "\f224"; +$fa-var-transgender-alt: "\f225"; +$fa-var-trash: "\f1f8"; +$fa-var-trash-o: "\f014"; +$fa-var-tree: "\f1bb"; +$fa-var-trello: "\f181"; +$fa-var-tripadvisor: "\f262"; +$fa-var-trophy: "\f091"; +$fa-var-truck: "\f0d1"; +$fa-var-try: "\f195"; +$fa-var-tty: "\f1e4"; +$fa-var-tumblr: "\f173"; +$fa-var-tumblr-square: "\f174"; +$fa-var-turkish-lira: "\f195"; +$fa-var-tv: "\f26c"; +$fa-var-twitch: "\f1e8"; +$fa-var-twitter: "\f099"; +$fa-var-twitter-square: "\f081"; +$fa-var-umbrella: "\f0e9"; +$fa-var-underline: "\f0cd"; +$fa-var-undo: "\f0e2"; +$fa-var-universal-access: "\f29a"; +$fa-var-university: "\f19c"; +$fa-var-unlink: "\f127"; +$fa-var-unlock: "\f09c"; +$fa-var-unlock-alt: "\f13e"; +$fa-var-unsorted: "\f0dc"; +$fa-var-upload: "\f093"; +$fa-var-usb: "\f287"; +$fa-var-usd: "\f155"; +$fa-var-user: "\f007"; +$fa-var-user-circle: "\f2bd"; +$fa-var-user-circle-o: "\f2be"; +$fa-var-user-md: "\f0f0"; +$fa-var-user-o: "\f2c0"; +$fa-var-user-plus: "\f234"; +$fa-var-user-secret: "\f21b"; +$fa-var-user-times: "\f235"; +$fa-var-users: "\f0c0"; +$fa-var-vcard: "\f2bb"; +$fa-var-vcard-o: "\f2bc"; +$fa-var-venus: "\f221"; +$fa-var-venus-double: "\f226"; +$fa-var-venus-mars: "\f228"; +$fa-var-viacoin: "\f237"; +$fa-var-viadeo: "\f2a9"; +$fa-var-viadeo-square: "\f2aa"; +$fa-var-video-camera: "\f03d"; +$fa-var-vimeo: "\f27d"; +$fa-var-vimeo-square: "\f194"; +$fa-var-vine: "\f1ca"; +$fa-var-vk: "\f189"; +$fa-var-volume-control-phone: "\f2a0"; +$fa-var-volume-down: "\f027"; +$fa-var-volume-off: "\f026"; +$fa-var-volume-up: "\f028"; +$fa-var-warning: "\f071"; +$fa-var-wechat: "\f1d7"; +$fa-var-weibo: "\f18a"; +$fa-var-weixin: "\f1d7"; +$fa-var-whatsapp: "\f232"; +$fa-var-wheelchair: "\f193"; +$fa-var-wheelchair-alt: "\f29b"; +$fa-var-wifi: "\f1eb"; +$fa-var-wikipedia-w: "\f266"; +$fa-var-window-close: "\f2d3"; +$fa-var-window-close-o: "\f2d4"; +$fa-var-window-maximize: "\f2d0"; +$fa-var-window-minimize: "\f2d1"; +$fa-var-window-restore: "\f2d2"; +$fa-var-windows: "\f17a"; +$fa-var-won: "\f159"; +$fa-var-wordpress: "\f19a"; +$fa-var-wpbeginner: "\f297"; +$fa-var-wpexplorer: "\f2de"; +$fa-var-wpforms: "\f298"; +$fa-var-wrench: "\f0ad"; +$fa-var-xing: "\f168"; +$fa-var-xing-square: "\f169"; +$fa-var-y-combinator: "\f23b"; +$fa-var-y-combinator-square: "\f1d4"; +$fa-var-yahoo: "\f19e"; +$fa-var-yc: "\f23b"; +$fa-var-yc-square: "\f1d4"; +$fa-var-yelp: "\f1e9"; +$fa-var-yen: "\f157"; +$fa-var-yoast: "\f2b1"; +$fa-var-youtube: "\f167"; +$fa-var-youtube-play: "\f16a"; +$fa-var-youtube-square: "\f166"; + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/font-awesome.scss b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/font-awesome.scss new file mode 100644 index 000000000..f1c83aaa5 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/font-awesome-4.7.0/scss/font-awesome.scss @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables"; +@import "mixins"; +@import "path"; +@import "core"; +@import "larger"; +@import "fixed-width"; +@import "list"; +@import "bordered-pulled"; +@import "animated"; +@import "rotated-flipped"; +@import "stacked"; +@import "icons"; +@import "screen-reader"; diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/仪表盘/4个卡片.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/仪表盘/4个卡片.png new file mode 100644 index 000000000..b71f41f41 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/仪表盘/4个卡片.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/仪表盘/全屏模式.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/仪表盘/全屏模式.png new file mode 100644 index 000000000..3b9914e86 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/仪表盘/全屏模式.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/仪表盘/切换树图.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/仪表盘/切换树图.png new file mode 100644 index 000000000..ff20cc7b0 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/仪表盘/切换树图.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/仪表盘/齿轮.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/仪表盘/齿轮.png new file mode 100644 index 000000000..36a13278e Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/仪表盘/齿轮.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/新增-定制协议.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/新增-定制协议.png new file mode 100644 index 000000000..440397ec5 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/新增-定制协议.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/新增-标准协议.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/新增-标准协议.png new file mode 100644 index 000000000..857a19234 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/新增-标准协议.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/新增扩展信息.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/新增扩展信息.png new file mode 100644 index 000000000..df6db3ad5 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/新增扩展信息.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/新增表单.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/新增表单.png new file mode 100644 index 000000000..6854f6d57 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/新增表单.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/新增配置.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/新增配置.png new file mode 100644 index 000000000..5bb80ad4d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/新增配置.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/根据协议查询.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/根据协议查询.png new file mode 100644 index 000000000..aa6527845 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/根据协议查询.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/根据名称查询.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/根据名称查询.png new file mode 100644 index 000000000..498387d58 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/根据名称查询.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/编辑信息.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/编辑信息.png new file mode 100644 index 000000000..834971882 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/编辑信息.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/首页.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/首页.png new file mode 100644 index 000000000..b2b5373e0 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/应用管理/首页.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/日志管理/同步器.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/日志管理/同步器.png new file mode 100644 index 000000000..565062f35 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/日志管理/同步器.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/日志管理/登录.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/日志管理/登录.png new file mode 100644 index 000000000..90b54edbf Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/日志管理/登录.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/日志管理/系统.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/日志管理/系统.png new file mode 100644 index 000000000..31b41153b Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/日志管理/系统.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/日志管理/访问.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/日志管理/访问.png new file mode 100644 index 000000000..6796ce5fe Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/日志管理/访问.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/日志管理/连接器.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/日志管理/连接器.png new file mode 100644 index 000000000..a94e38d13 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/日志管理/连接器.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/删除角色.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/删除角色.png new file mode 100644 index 000000000..4b1095479 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/删除角色.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/删除资源.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/删除资源.png new file mode 100644 index 000000000..34038419d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/删除资源.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/新增角色.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/新增角色.png new file mode 100644 index 000000000..140ca7d96 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/新增角色.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/新增资源.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/新增资源.png new file mode 100644 index 000000000..7257a28d7 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/新增资源.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/查看权限.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/查看权限.png new file mode 100644 index 000000000..564732b05 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/查看权限.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/查看访问权限.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/查看访问权限.png new file mode 100644 index 000000000..4fa0b23e9 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/查看访问权限.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/点击成员.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/点击成员.png new file mode 100644 index 000000000..04d0f5874 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/点击成员.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/编辑角色.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/编辑角色.png new file mode 100644 index 000000000..ce618b5c0 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/编辑角色.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/编辑资源.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/编辑资源.png new file mode 100644 index 000000000..e63efc41b Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/编辑资源.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/角色管理.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/角色管理.png new file mode 100644 index 000000000..43d6cc868 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/角色管理.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/资源管理.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/资源管理.png new file mode 100644 index 000000000..2e9040fa0 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/资源管理.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/通过资源名称进行查询.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/通过资源名称进行查询.png new file mode 100644 index 000000000..d2c612e16 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/通过资源名称进行查询.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/首页.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/首页.png new file mode 100644 index 000000000..8208a0821 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/权限管理/首页.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/登录/登录.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/登录/登录.png new file mode 100644 index 000000000..960319adb Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/登录/登录.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/登录/登录成功.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/登录/登录成功.png new file mode 100644 index 000000000..a4cef8bb8 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/登录/登录成功.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/登录/退出登录.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/登录/退出登录.png new file mode 100644 index 000000000..a972c8403 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/登录/退出登录.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/会话管理/点击展开.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/会话管理/点击展开.png new file mode 100644 index 000000000..d673529d9 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/会话管理/点击展开.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/会话管理/首页.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/会话管理/首页.png new file mode 100644 index 000000000..42903b81c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/会话管理/首页.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/访问控制/删除.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/访问控制/删除.png new file mode 100644 index 000000000..00b894cdc Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/访问控制/删除.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/访问控制/新增.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/访问控制/新增.png new file mode 100644 index 000000000..630e02d56 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/访问控制/新增.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/访问控制/根据名称查询.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/访问控制/根据名称查询.png new file mode 100644 index 000000000..f20146494 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/访问控制/根据名称查询.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/访问控制/首页.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/访问控制/首页.png new file mode 100644 index 000000000..cb024f61c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/访问控制/访问控制/首页.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/删除组织.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/删除组织.png new file mode 100644 index 000000000..8c184b3ac Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/删除组织.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/新增组织.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/新增组织.png new file mode 100644 index 000000000..7581dc73e Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/新增组织.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/新增组织地址信息.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/新增组织地址信息.png new file mode 100644 index 000000000..c9b1cdf89 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/新增组织地址信息.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/新增组织扩展信息.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/新增组织扩展信息.png new file mode 100644 index 000000000..ddc63eb02 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/新增组织扩展信息.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/新增组织联系方式.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/新增组织联系方式.png new file mode 100644 index 000000000..c6d7c04d0 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/新增组织联系方式.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/检索组织.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/检索组织.png new file mode 100644 index 000000000..4d2549974 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/检索组织.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户.png new file mode 100644 index 000000000..7dd1b728d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/密码修改.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/密码修改.png new file mode 100644 index 000000000..1f0be70a4 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/密码修改.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/新增用户.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/新增用户.png new file mode 100644 index 000000000..cf351c768 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/新增用户.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/新增用户个人信息.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/新增用户个人信息.png new file mode 100644 index 000000000..3775fd945 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/新增用户个人信息.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/用户更多操作.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/用户更多操作.png new file mode 100644 index 000000000..6eda0e1a3 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/用户更多操作.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/用户查询.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/用户查询.png new file mode 100644 index 000000000..efeaaf237 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/用户查询.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/编辑用户.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/编辑用户.png new file mode 100644 index 000000000..070687fe4 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/编辑用户.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/解锁成功.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/解锁成功.png new file mode 100644 index 000000000..66fed6b3d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/解锁成功.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/锁定用户.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/锁定用户.png new file mode 100644 index 000000000..da963a691 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户/锁定用户.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组.png new file mode 100644 index 000000000..7a7d6a96e Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/新增动态.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/新增动态.png new file mode 100644 index 000000000..ef3a3c5a2 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/新增动态.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/新增用户组.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/新增用户组.png new file mode 100644 index 000000000..d0137e903 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/新增用户组.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/更多-成员.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/更多-成员.png new file mode 100644 index 000000000..bae211b78 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/更多-成员.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/查询.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/查询.png new file mode 100644 index 000000000..ba3dd5531 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/查询.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/用户组成员.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/用户组成员.png new file mode 100644 index 000000000..d9daa98b3 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/用户组成员.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/用户组成员/单个删除.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/用户组成员/单个删除.png new file mode 100644 index 000000000..72079f23d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/用户组成员/单个删除.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/用户组成员/批量删除.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/用户组成员/批量删除.png new file mode 100644 index 000000000..b3caaf1cb Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/用户组成员/批量删除.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/用户组成员/新增用户组成员.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/用户组成员/新增用户组成员.png new file mode 100644 index 000000000..a952898f2 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/用户组成员/新增用户组成员.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/用户组成员/查询用户组.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/用户组成员/查询用户组.png new file mode 100644 index 000000000..950918b72 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/用户组成员/查询用户组.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/编辑.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/编辑.png new file mode 100644 index 000000000..4f8abe2c7 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/编辑.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/访问权限.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/访问权限.png new file mode 100644 index 000000000..1faee09fb Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组/访问权限.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组成员.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组成员.png new file mode 100644 index 000000000..b06d017a7 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/用户组成员.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/组织.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/组织.png new file mode 100644 index 000000000..d3e670ee0 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/组织.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/编辑组织.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/编辑组织.png new file mode 100644 index 000000000..15cb8edcf Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/身份管理/编辑组织.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/LDAP配置.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/LDAP配置.png new file mode 100644 index 000000000..5f42c7986 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/LDAP配置.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/删除策略.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/删除策略.png new file mode 100644 index 000000000..a1ae221e2 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/删除策略.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/同步器管理-属性映射.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/同步器管理-属性映射.png new file mode 100644 index 000000000..07394de3e Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/同步器管理-属性映射.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/同步器管理-新增.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/同步器管理-新增.png new file mode 100644 index 000000000..0ff8d3c2c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/同步器管理-新增.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/同步器管理-查询.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/同步器管理-查询.png new file mode 100644 index 000000000..bd7bf9427 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/同步器管理-查询.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/同步器管理-编辑策略.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/同步器管理-编辑策略.png new file mode 100644 index 000000000..d890343b0 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/同步器管理-编辑策略.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/客户端绑定微博.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/客户端绑定微博.png new file mode 100644 index 000000000..b419bb543 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/客户端绑定微博.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/密码策略.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/密码策略.png new file mode 100644 index 000000000..ad6c3dce8 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/密码策略.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/属性映射-编辑.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/属性映射-编辑.png new file mode 100644 index 000000000..0114aeaf5 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/属性映射-编辑.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/机构配置.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/机构配置.png new file mode 100644 index 000000000..6de07d415 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/机构配置.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/电子邮箱.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/电子邮箱.png new file mode 100644 index 000000000..d2305c1a0 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/电子邮箱.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/短信服务.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/短信服务.png new file mode 100644 index 000000000..b81f1eeb5 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/短信服务.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/社交服务-微博.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/社交服务-微博.png new file mode 100644 index 000000000..1e8bf4e68 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/社交服务-微博.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/社交服务-新增.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/社交服务-新增.png new file mode 100644 index 000000000..a26135d48 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/社交服务-新增.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/社交服务-查询.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/社交服务-查询.png new file mode 100644 index 000000000..7d76c8a32 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/社交服务-查询.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/社交服务-编辑.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/社交服务-编辑.png new file mode 100644 index 000000000..a342f4c13 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/社交服务-编辑.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/社交服务.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/社交服务.png new file mode 100644 index 000000000..c23913d98 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/社交服务.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/账号管理-删除与批量删除.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/账号管理-删除与批量删除.png new file mode 100644 index 000000000..c02b67af4 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/账号管理-删除与批量删除.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/账号管理-新增账号.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/账号管理-新增账号.png new file mode 100644 index 000000000..35a7321f9 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/账号管理-新增账号.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/账号管理-查询用户名.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/账号管理-查询用户名.png new file mode 100644 index 000000000..e895ece03 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/账号管理-查询用户名.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/账号管理-根据应用管理.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/账号管理-根据应用管理.png new file mode 100644 index 000000000..6e7e03962 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/账号管理-根据应用管理.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/账号管理.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/账号管理.png new file mode 100644 index 000000000..56eb7b4fc Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/账号管理.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/连接器管理.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/连接器管理.png new file mode 100644 index 000000000..c90adc98a Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/adminster/配置管理/连接器管理.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/application-certificate.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/application-certificate.png new file mode 100644 index 000000000..cc6aff616 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/application-certificate.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/会话管理.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/会话管理.png new file mode 100644 index 000000000..b8cb1b8fd Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/会话管理.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/dingding.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/dingding.png new file mode 100644 index 000000000..6a77417aa Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/dingding.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/个人信息.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/个人信息.png new file mode 100644 index 000000000..b57539814 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/个人信息.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/基本信息.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/基本信息.png new file mode 100644 index 000000000..6cb276d09 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/基本信息.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/审计/应用.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/审计/应用.png new file mode 100644 index 000000000..87c6a1ab5 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/审计/应用.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/审计/查询1.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/审计/查询1.png new file mode 100644 index 000000000..11b35fba1 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/审计/查询1.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/审计/登录.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/审计/登录.png new file mode 100644 index 000000000..32311f0e4 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/审计/登录.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/家庭信息.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/家庭信息.png new file mode 100644 index 000000000..d6015c5e5 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/家庭信息.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/密码修改.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/密码修改.png new file mode 100644 index 000000000..644205f54 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/密码修改.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/我的资料.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/我的资料.png new file mode 100644 index 000000000..fc251b58f Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/我的资料.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/时间令牌.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/时间令牌.png new file mode 100644 index 000000000..8b2ba85e7 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/时间令牌.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/机构信息.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/机构信息.png new file mode 100644 index 000000000..68548ac5b Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/机构信息.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/机构扩展.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/机构扩展.png new file mode 100644 index 000000000..4c1113e65 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/机构扩展.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/生成令牌.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/生成令牌.png new file mode 100644 index 000000000..b46197165 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/生成令牌.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/社交关联.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/社交关联.png new file mode 100644 index 000000000..9aa666463 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/社交关联.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/社交关联1.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/社交关联1.png new file mode 100644 index 000000000..ebe26d5f8 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/社交关联1.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/社交关联2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/社交关联2.png new file mode 100644 index 000000000..faadb8a2a Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/社交关联2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/解绑社交.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/解绑社交.png new file mode 100644 index 000000000..180f58884 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/功能使用说明/配置/解绑社交.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/应用访问中心.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/应用访问中心.png new file mode 100644 index 000000000..102572cb4 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/应用访问中心.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/忘记密码/忘记密码.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/忘记密码/忘记密码.png new file mode 100644 index 000000000..1f7bdd950 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/忘记密码/忘记密码.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/忘记密码/手机重置.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/忘记密码/手机重置.png new file mode 100644 index 000000000..ceacf08e5 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/忘记密码/手机重置.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/忘记密码/邮箱重置.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/忘记密码/邮箱重置.png new file mode 100644 index 000000000..a9db119a3 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/忘记密码/邮箱重置.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/其他登录.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/其他登录.png new file mode 100644 index 000000000..baf3a8cb5 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/其他登录.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/扫码登录.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/扫码登录.png new file mode 100644 index 000000000..6a855cebc Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/扫码登录.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/登录入口.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/登录入口.png new file mode 100644 index 000000000..bfbe2d490 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/登录入口.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/登录失败锁定.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/登录失败锁定.png new file mode 100644 index 000000000..35a450611 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/登录失败锁定.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/登录完成.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/登录完成.png new file mode 100644 index 000000000..b4593b4d8 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/登录完成.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/记住登录.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/记住登录.png new file mode 100644 index 000000000..480713e10 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/记住登录.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/语言切换.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/语言切换.png new file mode 100644 index 000000000..112e3b09d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/登录管理/语言切换.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/页面配置/全屏模式.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/页面配置/全屏模式.png new file mode 100644 index 000000000..ade1630fb Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/页面配置/全屏模式.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/页面配置/左右屏切换.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/页面配置/左右屏切换.png new file mode 100644 index 000000000..9b1f81919 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/页面配置/左右屏切换.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/页面配置/首页.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/页面配置/首页.png new file mode 100644 index 000000000..c26966653 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authentication/页面配置/首页.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn.png new file mode 100644 index 000000000..b4f4a99c4 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_s.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_s.png new file mode 100644 index 000000000..3384bbe69 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_s.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_s_1.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_s_1.png new file mode 100644 index 000000000..3f4a9e1ce Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_s_1.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_s_2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_s_2.png new file mode 100644 index 000000000..7bc8536da Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_s_2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_s_3.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_s_3.png new file mode 100644 index 000000000..54b674f25 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_s_3.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_s_4.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_s_4.png new file mode 100644 index 000000000..834848f57 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_s_4.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_sa_1.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_sa_1.png new file mode 100644 index 000000000..f12ad3684 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_sa_1.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_sa_2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_sa_2.png new file mode 100644 index 000000000..1ea3d4e50 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/authn_sa_2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/captcha_arithmetic.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/captcha_arithmetic.png new file mode 100644 index 000000000..4066f6e8e Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/captcha_arithmetic.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/captcha_text.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/captcha_text.png new file mode 100644 index 000000000..49c6d4d3b Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/captcha_text.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/fgpwd-1.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/fgpwd-1.png new file mode 100644 index 000000000..d1fdccc7d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/fgpwd-1.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/fgpwd-2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/fgpwd-2.png new file mode 100644 index 000000000..9c51cdbae Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/fgpwd-2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/fgpwd-3.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/fgpwd-3.png new file mode 100644 index 000000000..2961ac063 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/fgpwd-3.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/fgpwd-4.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/fgpwd-4.png new file mode 100644 index 000000000..58e9e4825 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/fgpwd-4.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/google1.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/google1.jpg new file mode 100644 index 000000000..6e25f7611 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/google1.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/google2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/google2.png new file mode 100644 index 000000000..3a2bee70a Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/google2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/google3.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/google3.jpg new file mode 100644 index 000000000..18fdcd698 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/google3.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/google4.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/google4.png new file mode 100644 index 000000000..9e59f7314 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/google4.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/justauth.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/justauth.png new file mode 100644 index 000000000..442ab48f0 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/justauth.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/ldap_config.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/ldap_config.png new file mode 100644 index 000000000..d775754b3 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/ldap_config.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/safety.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/safety.png new file mode 100644 index 000000000..c5c33126d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/safety.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/sms.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/sms.png new file mode 100644 index 000000000..ad6cdaa5b Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authn/sms.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authz.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authz.png new file mode 100644 index 000000000..8b587b516 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/authz.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/blank.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/blank.png new file mode 100644 index 000000000..26ce2a7da Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/blank.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/cas/1.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/cas/1.png new file mode 100644 index 000000000..93df7d473 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/cas/1.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/cas/2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/cas/2.png new file mode 100644 index 000000000..a58770115 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/cas/2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/cog.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/cog.png new file mode 100644 index 000000000..572b300d4 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/cog.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/config/druid_encrypt.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/config/druid_encrypt.png new file mode 100644 index 000000000..5ab7b84f6 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/config/druid_encrypt.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import.png new file mode 100644 index 000000000..8ff17fb31 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import2.png new file mode 100644 index 000000000..1deb5e9d2 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import3.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import3.png new file mode 100644 index 000000000..6757d1933 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import3.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import4.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import4.png new file mode 100644 index 000000000..be334651a Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import4.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import5.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import5.png new file mode 100644 index 000000000..58a10fec3 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import5.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import_s.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import_s.png new file mode 100644 index 000000000..b1d271888 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/import_s.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/mgt.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/mgt.png new file mode 100644 index 000000000..26b9c40c5 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/mgt.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/run.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/run.png new file mode 100644 index 000000000..172c71793 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/run.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/sso.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/sso.png new file mode 100644 index 000000000..261bca74d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/sso.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/start.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/start.png new file mode 100644 index 000000000..8d1d29e45 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/start.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/start_workspace.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/start_workspace.png new file mode 100644 index 000000000..9ffc0ccdf Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/eclipse/start_workspace.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/vscode/folder.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/vscode/folder.png new file mode 100644 index 000000000..505f7c2c5 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/vscode/folder.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/vscode/import_s.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/vscode/import_s.png new file mode 100644 index 000000000..eb6d10945 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/vscode/import_s.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/vscode/start.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/vscode/start.png new file mode 100644 index 000000000..c8514e157 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dev/vscode/start.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/docads/warmflow.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/docads/warmflow.jpg new file mode 100644 index 000000000..993902d97 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/docads/warmflow.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/cubic.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/cubic.png new file mode 100644 index 000000000..f6968262e Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/cubic.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/dante-cloud2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/dante-cloud2.png new file mode 100644 index 000000000..4dfbbb01c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/dante-cloud2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/dromara.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/dromara.png new file mode 100644 index 000000000..be0cf7e45 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/dromara.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/dynamic-tp.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/dynamic-tp.png new file mode 100644 index 000000000..4c91c5b4e Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/dynamic-tp.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/easy-es2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/easy-es2.png new file mode 100644 index 000000000..c42176fe4 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/easy-es2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/fast-request.gif b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/fast-request.gif new file mode 100644 index 000000000..17e9e4d06 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/fast-request.gif differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/fast-request.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/fast-request.png new file mode 100644 index 000000000..3089d2622 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/fast-request.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/forest-logo.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/forest-logo.png new file mode 100644 index 000000000..6db8032cb Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/forest-logo.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/gobrs-async.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/gobrs-async.png new file mode 100644 index 000000000..028592ca3 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/gobrs-async.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/hertzbeat_brand.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/hertzbeat_brand.jpg new file mode 100644 index 000000000..fafd1d80e Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/hertzbeat_brand.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/hmily.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/hmily.png new file mode 100644 index 000000000..719535dda Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/hmily.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/hutool.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/hutool.jpg new file mode 100644 index 000000000..52a358bb7 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/hutool.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/image-combiner.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/image-combiner.png new file mode 100644 index 000000000..9b3351a44 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/image-combiner.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/jpom.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/jpom.png new file mode 100644 index 000000000..10b1723c1 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/jpom.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/koalas-rpc2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/koalas-rpc2.png new file mode 100644 index 000000000..4aa683e5f Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/koalas-rpc2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/liteflow.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/liteflow.png new file mode 100644 index 000000000..5b61ec959 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/liteflow.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/mendmix.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/mendmix.png new file mode 100644 index 000000000..7b94d4ed6 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/mendmix.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/myth.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/myth.png new file mode 100644 index 000000000..1fd418d3c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/myth.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/northstar_logo.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/northstar_logo.png new file mode 100644 index 000000000..bd975cb20 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/northstar_logo.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/raincat.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/raincat.png new file mode 100644 index 000000000..e19e0d478 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/raincat.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/sa-token.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/sa-token.png new file mode 100644 index 000000000..0192f1a4d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/sa-token.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/sureness.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/sureness.png new file mode 100644 index 000000000..7fdecb93d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/sureness.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/tlog2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/tlog2.png new file mode 100644 index 000000000..0c0e9ae5f Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/tlog2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/x-easypdf.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/x-easypdf.png new file mode 100644 index 000000000..8aa0af02c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/x-easypdf.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/zsxq.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/zsxq.jpg new file mode 100644 index 000000000..ad4d52edb Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/dromara/zsxq.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/favicon.ico b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/favicon.ico new file mode 100644 index 000000000..485a4a4ad Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/favicon.ico differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/gitcode_gstar.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/gitcode_gstar.jpg new file mode 100644 index 000000000..031fb7300 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/gitcode_gstar.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/gitee.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/gitee.jpg new file mode 100644 index 000000000..a0a73ad45 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/gitee.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/gitee_mvp.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/gitee_mvp.png new file mode 100644 index 000000000..a526e25cf Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/gitee_mvp.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/github.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/github.jpg new file mode 100644 index 000000000..e102d5861 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/github.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home.png new file mode 100644 index 000000000..11f59e931 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/about-img.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/about-img.png new file mode 100644 index 000000000..9897ab93a Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/about-img.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/intro-carousel/1.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/intro-carousel/1.jpg new file mode 100644 index 000000000..77a62b886 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/intro-carousel/1.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/intro-carousel/2.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/intro-carousel/2.jpg new file mode 100644 index 000000000..f5ff3a75a Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/intro-carousel/2.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/intro-carousel/3.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/intro-carousel/3.jpg new file mode 100644 index 000000000..30bcfa3c3 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/intro-carousel/3.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/intro-carousel/4.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/intro-carousel/4.jpg new file mode 100644 index 000000000..95161d061 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/intro-carousel/4.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/intro-carousel/5.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/intro-carousel/5.jpg new file mode 100644 index 000000000..6affd5486 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/intro-carousel/5.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/protocol.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/protocol.png new file mode 100644 index 000000000..caf999cb8 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/protocol.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/screen_short.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/screen_short.png new file mode 100644 index 000000000..16eac841c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/screen_short.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/social_integration.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/social_integration.png new file mode 100644 index 000000000..3450cef29 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/home/social_integration.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/im/identityLifecycle.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/im/identityLifecycle.png new file mode 100644 index 000000000..e9eb528ef Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/im/identityLifecycle.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/im/maxkey_im.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/im/maxkey_im.png new file mode 100644 index 000000000..420e9dc67 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/im/maxkey_im.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/info.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/info.png new file mode 100644 index 000000000..833cdd534 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/info.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-0.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-0.png new file mode 100644 index 000000000..30f235faa Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-0.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-1.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-1.png new file mode 100644 index 000000000..231ea78e1 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-1.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-2.png new file mode 100644 index 000000000..fd20b798a Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-3.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-3.png new file mode 100644 index 000000000..099d77021 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-3.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-docker.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-docker.png new file mode 100644 index 000000000..d39486bff Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-docker.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-maxkey.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-maxkey.png new file mode 100644 index 000000000..107233dee Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota-maxkey.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota.png new file mode 100644 index 000000000..1462b50b8 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/install/baota/baota.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/al_aly.gif b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/al_aly.gif new file mode 100644 index 000000000..a9c182676 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/al_aly.gif differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/apisix.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/apisix.png new file mode 100644 index 000000000..e23b69cfd Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/apisix.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/atlassian_confluence.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/atlassian_confluence.png new file mode 100644 index 000000000..24b060069 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/atlassian_confluence.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/atlassian_jira.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/atlassian_jira.png new file mode 100644 index 000000000..9b6f189a2 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/atlassian_jira.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/gitlab.gif b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/gitlab.gif new file mode 100644 index 000000000..261d64685 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/gitlab.gif differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/grafana.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/grafana.png new file mode 100644 index 000000000..82ade5fbe Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/grafana.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/hw_hwy.gif b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/hw_hwy.gif new file mode 100644 index 000000000..3f4e1b402 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/hw_hwy.gif differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/hw_ysmail.gif b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/hw_ysmail.gif new file mode 100644 index 000000000..414d9fb18 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/hw_ysmail.gif differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/jenkins.gif b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/jenkins.gif new file mode 100644 index 000000000..945cf9492 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/jenkins.gif differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/jumpserver.gif b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/jumpserver.gif new file mode 100644 index 000000000..e5720ea4f Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/jumpserver.gif differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/k8s.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/k8s.png new file mode 100644 index 000000000..26e706cf0 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/k8s.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/knox.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/knox.png new file mode 100644 index 000000000..a41733e46 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/knox.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/liferay.gif b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/liferay.gif new file mode 100644 index 000000000..e31d5790f Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/liferay.gif differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/o2oa.gif b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/o2oa.gif new file mode 100644 index 000000000..a2a912ea7 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/o2oa.gif differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/salesforce_crm.gif b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/salesforce_crm.gif new file mode 100644 index 000000000..f99db9c12 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/salesforce_crm.gif differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/tx_email.gif b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/tx_email.gif new file mode 100644 index 000000000..63bab3326 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/tx_email.gif differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/tx_txy.gif b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/tx_txy.gif new file mode 100644 index 000000000..73364328a Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/tx_txy.gif differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/weaver_oa.gif b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/weaver_oa.gif new file mode 100644 index 000000000..21e05896f Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/weaver_oa.gif differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/zabbix.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/zabbix.png new file mode 100644 index 000000000..3b7e4d141 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/zabbix.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/zentao_pm.gif b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/zentao_pm.gif new file mode 100644 index 000000000..97d5b4132 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/inteapps/zentao_pm.gif differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/gitlab/1.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/gitlab/1.png new file mode 100644 index 000000000..f12cae926 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/gitlab/1.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/gitlab/2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/gitlab/2.png new file mode 100644 index 000000000..05af3047f Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/gitlab/2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/gitlab/3.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/gitlab/3.png new file mode 100644 index 000000000..2efe88565 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/gitlab/3.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/gitlab/4.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/gitlab/4.png new file mode 100644 index 000000000..4288d91ee Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/gitlab/4.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/gitlab/5.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/gitlab/5.png new file mode 100644 index 000000000..be65b6457 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/gitlab/5.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jenkins/1.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jenkins/1.png new file mode 100644 index 000000000..75a9a538d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jenkins/1.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jenkins/2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jenkins/2.png new file mode 100644 index 000000000..f6e94e3db Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jenkins/2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jenkins/3.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jenkins/3.png new file mode 100644 index 000000000..040e5598e Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jenkins/3.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jenkins/4.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jenkins/4.png new file mode 100644 index 000000000..83a3b1727 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jenkins/4.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/1.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/1.png new file mode 100644 index 000000000..2905f9547 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/1.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/2.png new file mode 100644 index 000000000..8ccd2439b Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/3.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/3.png new file mode 100644 index 000000000..e19f28012 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/3.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/4.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/4.png new file mode 100644 index 000000000..52d393189 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/4.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/5.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/5.png new file mode 100644 index 000000000..fdd71b5ef Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/5.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/6.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/6.png new file mode 100644 index 000000000..797504765 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/6.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/7.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/7.png new file mode 100644 index 000000000..1dae21044 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/jira/7.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/1.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/1.png new file mode 100644 index 000000000..06747a2a3 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/1.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/2.png new file mode 100644 index 000000000..4c3e7685b Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/3.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/3.png new file mode 100644 index 000000000..e14afa49c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/3.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/4.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/4.png new file mode 100644 index 000000000..10d809d64 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/4.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/5.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/5.png new file mode 100644 index 000000000..8a4262f06 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/5.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/6.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/6.png new file mode 100644 index 000000000..be65b6457 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/6.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/7.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/7.png new file mode 100644 index 000000000..c344e9d29 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/7.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/8.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/8.png new file mode 100644 index 000000000..1d32925a7 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/integration/zentao/8.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/jwt/client-credentials-grant.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/jwt/client-credentials-grant.png new file mode 100644 index 000000000..1efbd2b2a Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/jwt/client-credentials-grant.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/jwt/comparing-jwt-vs-saml2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/jwt/comparing-jwt-vs-saml2.png new file mode 100644 index 000000000..3743d8d8a Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/jwt/comparing-jwt-vs-saml2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/jwt/encoded-jwt3.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/jwt/encoded-jwt3.png new file mode 100644 index 000000000..0f5ed18fa Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/jwt/encoded-jwt3.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/jwt/legacy-app-auth-5.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/jwt/legacy-app-auth-5.png new file mode 100644 index 000000000..489b2c230 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/jwt/legacy-app-auth-5.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/layers.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/layers.png new file mode 100644 index 000000000..d1570492e Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/layers.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/link.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/link.png new file mode 100644 index 000000000..18cf1ecc6 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/link.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/logo.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/logo.jpg new file mode 100644 index 000000000..b887a2783 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/logo.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/logo.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/logo.png new file mode 100644 index 000000000..ef4c9508c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/logo.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/logo_maxkey.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/logo_maxkey.png new file mode 100644 index 000000000..df747614c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/logo_maxkey.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_ha.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_ha.png new file mode 100644 index 000000000..414a33747 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_ha.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_ha_micro.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_ha_micro.png new file mode 100644 index 000000000..99c99cd2b Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_ha_micro.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_index.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_index.png new file mode 100644 index 000000000..557f088a0 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_index.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_login.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_login.png new file mode 100644 index 000000000..b161db1fe Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_login.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_mgt_apps.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_mgt_apps.png new file mode 100644 index 000000000..fe53e109e Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_mgt_apps.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_mgt_rpt.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_mgt_rpt.png new file mode 100644 index 000000000..95202a06d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_mgt_rpt.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_mgt_users.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_mgt_users.png new file mode 100644 index 000000000..4eea38ca1 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/maxkey_mgt_users.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/client.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/client.jpg new file mode 100644 index 000000000..4f463d363 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/client.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/code.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/code.jpg new file mode 100644 index 000000000..6c3883bc1 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/code.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/flow.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/flow.jpg new file mode 100644 index 000000000..4e4553ec8 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/flow.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/implicit.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/implicit.jpg new file mode 100644 index 000000000..91bfaace8 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/implicit.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/qq.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/qq.jpg new file mode 100644 index 000000000..74321f7bb Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/qq.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/resource.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/resource.jpg new file mode 100644 index 000000000..8a269011c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/oauth2/resource.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/openid/1.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/openid/1.png new file mode 100644 index 000000000..fb5c1c3d7 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/openid/1.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/openid/2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/openid/2.png new file mode 100644 index 000000000..aac3cea9b Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/openid/2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/openid/3.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/openid/3.png new file mode 100644 index 000000000..0106102e6 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/openid/3.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/aizuda.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/aizuda.png new file mode 100644 index 000000000..6eca197bd Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/aizuda.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/apache-shenyu.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/apache-shenyu.png new file mode 100644 index 000000000..47bc9cd2d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/apache-shenyu.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/ccbpmLogo.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/ccbpmLogo.png new file mode 100644 index 000000000..2a2e6cdfa Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/ccbpmLogo.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/ccflowAD_Smaill.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/ccflowAD_Smaill.png new file mode 100644 index 000000000..420267791 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/ccflowAD_Smaill.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/collectiveoauth.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/collectiveoauth.png new file mode 100644 index 000000000..5e1d90914 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/collectiveoauth.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/denglu1.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/denglu1.jpg new file mode 100644 index 000000000..982f7fcb1 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/denglu1.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/dromara.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/dromara.jpg new file mode 100644 index 000000000..d8d5adb66 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/dromara.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/eolink.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/eolink.png new file mode 100644 index 000000000..83db581e1 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/eolink.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/eolinker.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/eolinker.jpg new file mode 100644 index 000000000..72f3037a0 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/eolinker.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/gitee.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/gitee.png new file mode 100644 index 000000000..8be327470 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/gitee.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/highgo.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/highgo.png new file mode 100644 index 000000000..318771953 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/highgo.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/hutool.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/hutool.jpg new file mode 100644 index 000000000..52a358bb7 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/hutool.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/jpom.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/jpom.png new file mode 100644 index 000000000..434f4d7f2 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/jpom.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/justauth.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/justauth.png new file mode 100644 index 000000000..ba75b02f6 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/justauth.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/phalapi.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/phalapi.png new file mode 100644 index 000000000..581346e3d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/phalapi.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/redoop.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/redoop.png new file mode 100644 index 000000000..f7fce46db Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/redoop.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/sa-token.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/sa-token.png new file mode 100644 index 000000000..0192f1a4d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/sa-token.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/snowy_logo.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/snowy_logo.png new file mode 100644 index 000000000..94b9eb2d2 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/snowy_logo.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/sureness.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/sureness.png new file mode 100644 index 000000000..30f38a8f5 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/sureness.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/uniadmin.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/uniadmin.jpg new file mode 100644 index 000000000..17bef2163 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/partners/uniadmin.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/performance/p1200.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/performance/p1200.png new file mode 100644 index 000000000..50dc3202e Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/performance/p1200.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/performance/p1600.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/performance/p1600.png new file mode 100644 index 000000000..c86c47398 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/performance/p1600.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/performance/p600.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/performance/p600.png new file mode 100644 index 000000000..c4d88678c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/performance/p600.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0001.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0001.jpg new file mode 100644 index 000000000..48ec49fcc Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0001.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0002.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0002.jpg new file mode 100644 index 000000000..c59efa2b7 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0002.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0003.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0003.jpg new file mode 100644 index 000000000..5f3f66ff3 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0003.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0004.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0004.jpg new file mode 100644 index 000000000..cc264e96e Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0004.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0005.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0005.jpg new file mode 100644 index 000000000..119a8acc7 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0005.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0006.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0006.jpg new file mode 100644 index 000000000..04e616471 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0006.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0007.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0007.jpg new file mode 100644 index 000000000..03df0cfe0 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0007.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0008.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0008.jpg new file mode 100644 index 000000000..a5d53c818 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0008.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0009.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0009.jpg new file mode 100644 index 000000000..a7b3710f5 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0009.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0010.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0010.jpg new file mode 100644 index 000000000..bf7ad0a49 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0010.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0011.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0011.jpg new file mode 100644 index 000000000..883d3958e Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0011.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0012.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0012.jpg new file mode 100644 index 000000000..619997569 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0012.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0013.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0013.jpg new file mode 100644 index 000000000..fbc2816a6 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0013.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0014.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0014.jpg new file mode 100644 index 000000000..e421d5b4f Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0014.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0015.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0015.jpg new file mode 100644 index 000000000..64d6f3afd Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0015.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0016.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0016.jpg new file mode 100644 index 000000000..197984b80 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0016.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0017.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0017.jpg new file mode 100644 index 000000000..384caa284 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0017.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0018.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0018.jpg new file mode 100644 index 000000000..03b063da3 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0018.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0019.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0019.jpg new file mode 100644 index 000000000..bc0d488e0 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0019.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0020.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0020.jpg new file mode 100644 index 000000000..dfc9df345 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0020.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0021.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0021.jpg new file mode 100644 index 000000000..2847d8446 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0021.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0022.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0022.jpg new file mode 100644 index 000000000..fa005d5ff Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0022.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0023.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0023.jpg new file mode 100644 index 000000000..3442f1f67 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0023.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0024.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0024.jpg new file mode 100644 index 000000000..5d25069b2 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0024.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0025.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0025.jpg new file mode 100644 index 000000000..f34f8f70c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0025.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0026.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0026.jpg new file mode 100644 index 000000000..3690ac300 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0026.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0027.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0027.jpg new file mode 100644 index 000000000..576da0a85 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0027.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0028.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0028.jpg new file mode 100644 index 000000000..529fbf199 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0028.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0029.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0029.jpg new file mode 100644 index 000000000..0a54215f3 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0029.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0030.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0030.jpg new file mode 100644 index 000000000..2de427557 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0030.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0031.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0031.jpg new file mode 100644 index 000000000..742c83273 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0031.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0032.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0032.jpg new file mode 100644 index 000000000..fb99f14a6 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0032.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0033.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0033.jpg new file mode 100644 index 000000000..cb3c4283d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0033.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0034.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0034.jpg new file mode 100644 index 000000000..4acaddb7a Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0034.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0035.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0035.jpg new file mode 100644 index 000000000..e598dab2c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/ppts/MaxKey-CE_page-0035.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/preloader.gif b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/preloader.gif new file mode 100644 index 000000000..5c47ade9b Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/preloader.gif differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/roadmap.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/roadmap.jpg new file mode 100644 index 000000000..f34f8f70c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/roadmap.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/saml/saml1.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/saml/saml1.png new file mode 100644 index 000000000..ae96f15ab Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/saml/saml1.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/saml/saml2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/saml/saml2.png new file mode 100644 index 000000000..719f77d7f Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/saml/saml2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/saml/saml3.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/saml/saml3.png new file mode 100644 index 000000000..ed44704d6 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/saml/saml3.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_cas_conf.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_cas_conf.png new file mode 100644 index 000000000..054344074 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_cas_conf.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_form_yd_conf.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_form_yd_conf.png new file mode 100644 index 000000000..606fc10c0 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_form_yd_conf.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_jwt_conf.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_jwt_conf.png new file mode 100644 index 000000000..00866f117 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_jwt_conf.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_oauth.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_oauth.png new file mode 100644 index 000000000..72a6259d5 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_oauth.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_oauth_conf.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_oauth_conf.png new file mode 100644 index 000000000..f21e77ead Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_oauth_conf.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_oidc_conf.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_oidc_conf.png new file mode 100644 index 000000000..c39fa97d8 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_oidc_conf.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_saml_aly_conf.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_saml_aly_conf.png new file mode 100644 index 000000000..6c68188f3 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_saml_aly_conf.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_saml_aly_conf_ex.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_saml_aly_conf_ex.png new file mode 100644 index 000000000..53034fd0b Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_saml_aly_conf_ex.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_saml_txy_conf.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_saml_txy_conf.png new file mode 100644 index 000000000..8cdb1d28a Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_saml_txy_conf.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_saml_txy_conf_ex.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_saml_txy_conf_ex.png new file mode 100644 index 000000000..1dbb57b15 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_saml_txy_conf_ex.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_token_conf.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_token_conf.png new file mode 100644 index 000000000..f07e4779c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_token_conf.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_token_json_conf.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_token_json_conf.png new file mode 100644 index 000000000..f9d75b0d8 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_token_json_conf.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_token_ltpa_conf.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_token_ltpa_conf.png new file mode 100644 index 000000000..07f03418d Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/sso/sso_token_ltpa_conf.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/svn_readme.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/svn_readme.png new file mode 100644 index 000000000..43c6d4ed5 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/svn_readme.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy/1.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy/1.png new file mode 100644 index 000000000..a4ca35be8 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy/1.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy/2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy/2.png new file mode 100644 index 000000000..89a5fa565 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy/2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy/3.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy/3.png new file mode 100644 index 000000000..e45c22ce5 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy/3.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy/4.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy/4.jpg new file mode 100644 index 000000000..e86b03665 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy/4.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy2207/1.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy2207/1.png new file mode 100644 index 000000000..dbf78ea30 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy2207/1.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy2207/2.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy2207/2.png new file mode 100644 index 000000000..b122ae040 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy2207/2.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy2207/3.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy2207/3.png new file mode 100644 index 000000000..6e7056f6a Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/images/zqjy2207/3.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/docusaurus.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/docusaurus.png new file mode 100644 index 000000000..f458149e3 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/docusaurus.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/favicon.ico b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/favicon.ico new file mode 100644 index 000000000..485a4a4ad Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/favicon.ico differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/logo.jpg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/logo.jpg new file mode 100644 index 000000000..b887a2783 Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/logo.jpg differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/logo.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/logo.png new file mode 100644 index 000000000..ef4c9508c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/logo.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/logo.svg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/logo.svg new file mode 100644 index 000000000..9db6d0d06 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/logo_maxkey.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/logo_maxkey.png new file mode 100644 index 000000000..df747614c Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/logo_maxkey.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/quickwit-architecture.svg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/quickwit-architecture.svg new file mode 100644 index 000000000..d824e8a00 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/quickwit-architecture.svg @@ -0,0 +1,91 @@ + + + quickwit-sketch + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The node that receives the query becomes the root node and distribute the workload + + + + + + + Time pruned splits + + + Returns splits addresses + and index meta for time + pruning + + + + Turbo index splits selected for the given query + + + SEARCH CLUSTER + + + METASTORE + + + Turbo index splits + + + + Stateless search instance: any instance can answer to + any query + + + + \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/quickwit-ecosystem.png b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/quickwit-ecosystem.png new file mode 100644 index 000000000..5581d33bf Binary files /dev/null and b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/quickwit-ecosystem.png differ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/undraw_docusaurus_mountain.svg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/undraw_docusaurus_mountain.svg new file mode 100644 index 000000000..af961c49a --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/undraw_docusaurus_mountain.svg @@ -0,0 +1,171 @@ + + Easy to Use + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/undraw_docusaurus_react.svg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/undraw_docusaurus_react.svg new file mode 100644 index 000000000..94b5cf08f --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/undraw_docusaurus_react.svg @@ -0,0 +1,170 @@ + + Powered by React + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/undraw_docusaurus_tree.svg b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/undraw_docusaurus_tree.svg new file mode 100644 index 000000000..d9161d339 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/img/undraw_docusaurus_tree.svg @@ -0,0 +1,40 @@ + + Focus on What Matters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/is-star-plugin.js b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/is-star-plugin.js new file mode 100644 index 000000000..ca3bfcfa4 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/is-star-plugin.js @@ -0,0 +1,225 @@ +// + +// 应用参数 +const client_id = 'ee6fdc484b3398d17e77d6ff37fd8b9fe502106398c7b22bf5522d3c01303f45'; +const client_secret = '2574c2aac8ce2142e34752dc5957dddcb30bc68df5c61de64251a3a6b11a51e5'; +var redirect_uri = 'https://www.maxkey.top/doc/docs/overview/intro/'; +const docDomain = 'maxkey.top'; +if(location.host.indexOf("sso.maxkey.top")>-1) { + redirect_uri = 'http://sso.maxkey.top/maxkey/'; +} + +// const redirect_uri = 'http://127.0.0.1:8848/sa-token-doc/doc.html'; +// const docDomain = '127.0.0.1:8848'; + +// 检查成功后,多少天不再检查 +const allowDisparity = 1000 * 60 * 60 * 24 * 30; +// const allowDisparity = 1000 * 10; + + +// 判断当前是否已 star +function isStarRepo() { + + // 判断是否在主域名下 + if(location.host.substring(docDomain)<=-1) { + console.log('非主域名,不检测... , host '+location.host); + return; + } + console.log('主域名检测 , host '+location.host); + // 判断是否近期已经判断过了 + try{ + const isStarRepo = localStorage.isStarRepo; + if(isStarRepo) { + // 记录 star 的时间,和当前时间的差距 + const disparity = new Date().getTime() - parseInt(isStarRepo); + + // 差距小于一月,不再检测,大于一月,再检测一下 + if(disparity < allowDisparity) { + console.log('checked ...'); + return; + } + } + }catch(e){ + console.error(e); + } + + // 开始获取 code + $('body').css({'overflow': 'hidden'}); + getCode(); +} + +// 去请求授权 +function getCode() { + + // 检查url中是否有code + const code = getParam('code'); + if(code) { + // 有 code,进一步去请求 access_token + getAccessToken(code); + } else { + // 不存在code,弹窗提示询问 + confirmStar(); + } +} + +// 弹窗提示点 star +function confirmStar() { + + // 弹窗提示文字 + const tipStr = ` +
+

嗨,同学,来支持一下 MaxKey 吧,为项目点个 star !

+
仅需两步即可完成:
+
1、打开 MaxKey 开源仓库主页,在右上角点个 star 。
+
2、点击下方 [ 同意授权检测 ] 按钮,同意 MaxKey 获取 API 权限进行检测。
+
+

文档或演示系统将在 star 后正常开放展示

+
+ `; + + const index = layer.confirm(tipStr, { + title: '提示', + btn: ['同意授权检测'], + // btn: ['同意授权检测', '暂时不要,我先看看文档'], + area: '450px', + offset: '25%', + closeBtn: false + }, + function(index) { + // + layer.close(index); + // 用户点了确认,去 gitee 官方请求授权获取 + goAuth(); + } + ); + const closeLayer = + ` + + `; + $('#layui-layer' + index).prepend(closeLayer) +} + + +// 跳转到 gitee 授权界面 +function goAuth() { + const authUrl = "https://gitee.com/oauth/authorize" + + "?client_id=" + client_id + + "&redirect_uri=" + redirect_uri + + "&response_type=code"; + location.href = authUrl; +} + + +// 获取 access_token +function getAccessToken(code) { + // 根据 code 获取 access_token + $.ajax({ + url: 'https://www.maxkey.top/gitst/oauth/token', + method: 'post', + data: { + grant_type: 'authorization_code', + code: code, + client_id: client_id, + redirect_uri: redirect_uri, + client_secret: client_secret, + }, + success: function(res) { + // 如果返回的不是 200 + if(res.code !== 200) { + return layer.alert(res.msg, {closeBtn: false}, function(){ + // 刷新url,去掉 code 参数 + location.href = 'doc.html'; + }); + } + + // 拿到 access_token + const access_token = res.access_token; + + // 根据 access_token 判断是否 star 了仓库 + $.ajax({ + url: 'https://gitee.com/api/v5/user/starred/dromara/MaxKey', + method: 'get', + data: { + access_token: access_token + }, + success: function(res) { + // success 回调即代表已经 star,gitee API 请求体不返回任何数据 + console.log('-> stared ...'); + // 记录本次检查时间 + localStorage.isStarRepo = new Date().getTime(); + // + layer.alert('感谢你的支持 ❤️ ❤️ ❤️ ,MaxKey 将努力变得更加完善!', function(index) { + layer.close(index); + // 刷新url,去掉 code 参数 + location.href = location.href.replace("?code=" + code, ''); + }) + }, + error: function(e) { + // console.log('ff请求错误 ', e); + // 如下返回,代表没有 star + if(e.statusText = 'Not Found'){ + console.log('not star ...'); + layer.alert('未检测到 star 数据...', {closeBtn: false}, function() { + // 刷新url,去掉 code 参数 + location.href = location.href.replace("?code=" + code, ''); + }); + } + } + }); + + }, + error: function(e) { + console.log('请求错误 ', e); + // 如果请求地址有错,可能是服务器宕机了,暂停一天检测 + if(e.status === 0 || e.status === 502) { + return layer.alert(JSON.stringify(e), {closeBtn: false}, function(){ + // 一天内不再检查 + const ygTime = allowDisparity - (1000 * 60 * 60 * 24); + localStorage.isStarRepo = new Date().getTime() - ygTime; + // 刷新 url,去掉 code 参数 + location.href = location.href.replace("?code=" + code, ''); + }); + } + + // 无效授权,可能是 code 无效 + const errorMsg = (e.responseJSON && e.responseJSON.error) || JSON.stringify(e); + if(errorMsg == 'invalid_grant') { + console.log('无效code', code); + } + layer.alert('check error... ' + errorMsg, function(index) { + layer.close(index); + // 刷新url,去掉 code 参数 + let url = location.href.replace("?code=" + code, ''); + url = url.replace("&code=" + code, ''); + location.href = url; + }); + } + }) +} + +// 疑问 +function authDetails() { + const str = "用于检测的凭证信息将仅保存你的浏览器本地,MaxKey 文档已完整开源,源码可查"; + alert(str); +} + +// 获取 url 携带的参数 +function getParam(name, defaultValue){ + var query = window.location.search.substring(1); + var vars = query.split("&"); + for (var i=0;i+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 00;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.1",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
'+(f?r.title[0]:r.title)+"
":"";return r.zIndex=s,t([r.shade?'
':"",'
'+(e&&2!=r.type?"":u)+'
'+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
'+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
'+e+"
"}():"")+(r.resize?'':"")+"
"],u,i('
')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"http://layer.layui.com","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(e){s=e.find(".layui-layer-input"),s.focus(),"function"==typeof f&&f(e)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a=''+t[0].title+"";i"+t[i].title+"";return a}(),content:'
    '+function(){var e=t.length,i=1,a="";if(e>0)for(a='
  • '+(t[0].content||"no content")+"
  • ";i'+(t[i].content||"no content")+"";return a}()+"
",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
'+(u.length>1?'':"")+'
'+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window); \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/layer.js b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/layer.js new file mode 100644 index 000000000..03e05a5a0 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/layer.js @@ -0,0 +1,2 @@ +/*! layer-v3.5.1 Web 通用弹出层组件 MIT License */ + ;!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var t=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}(),i=e.LAYUI_GLOBAL||{};return i.layer_dir||t.substring(0,t.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c="creating",u=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function d(t){var n=100,a=document.getElementById(f);return++u>1e4/n?e.console&&console.error(l+".css: Invalid"):void(1989===parseInt(o.getStyle(a,"width"))?(t===c&&a.removeAttribute("lay-status"),a.getAttribute("lay-status")===c?setTimeout(d,n):i()):(a.setAttribute("lay-status",c),setTimeout(function(){d(c)},n)))}()}}},r={v:"3.5.1",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:260},n))}},s=function(e){var t=this,a=function(){t.creat()};t.index=++r.index,t.config.maxWidth=i(n).width()-30,t.config=i.extend({},t.config,o.config,e),document.body?a():setTimeout(function(){a()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],l.SHADE="layui-layer-shade",l.MOVE="layui-layer-move",s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,minStack:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
'+(f?r.title[0]:r.title)+"
":"";return r.zIndex=s,t([r.shade?'
':"",'
'+(e&&2!=r.type?"":u)+'
'+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
'+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
'+e+"
"}():"")+(r.resize?'':"")+"
"],u,i('
')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i("#"+l.MOVE)[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),e.shadeo=i("#"+l.SHADE+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),e.shadeo.css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():function(){e.offset(),parseInt(o.getStyle(document.getElementById(l.MOVE),"z-index"))||function(){e.layero.css("visibility","hidden"),r.ready(function(){e.offset(),e.layero.css("visibility","visible")})}()}(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&t.shadeo.on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n,t.index);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n,t.index)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n,t.index)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){t=t||{};var a=i("#"+l[0]+e),s=i("#"+l.SHADE+e),f=a.find(l[1]).outerHeight()||0,c=a.attr("minLeft")||181*o.minIndex+"px",u=a.css("position"),d={width:180,height:f,position:"fixed",overflow:"hidden"};o.record(a),o.minLeft[0]&&(c=o.minLeft[0],o.minLeft.shift()),t.minStack&&(d.left=c,d.top=n.height()-f,a.attr("minLeft")||o.minIndex++,a.attr("minLeft",c)),a.attr("position",u),r.style(e,d,!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),s.hide()},r.restore=function(e){var t=i("#"+l[0]+e),n=i("#"+l.SHADE+e),a=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(a[0]),height:parseFloat(a[1]),top:parseFloat(a[2]),left:parseFloat(a[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e),n.show()},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e,t){var n=i("#"+l[0]+e),a=n.attr("type"),s="layer-anim-close";if(n[0]){var f="layui-layer-wrap",c=function(){if(a===o.type[1]&&"object"===n.attr("conType")){n.children(":not(."+l[5]+")").remove();for(var r=n.find("."+f),s=0;s<2;s++)r.unwrap();r.css("display",r.data("display")).removeClass(f)}else{if(a===o.type[2])try{var c=i("#"+l[4]+e)[0];c.contentWindow.document.write(""),c.contentWindow.close(),n.find("."+l[5])[0].removeChild(c)}catch(u){}n[0].innerHTML="",n.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e],"function"==typeof t&&t()};n.data("isOutAnim")&&n.addClass("layer-anim "+s),i("#layui-layer-moves, #"+l.SHADE+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),n.attr("minLeft")&&(o.minIndex--,o.minLeft.push(n.attr("minLeft"))),r.ie&&r.ie<10||!n.data("isOutAnim")?c():setTimeout(function(){c()},200)}},r.closeAll=function(e,t){"function"==typeof e&&(t=e,e=null);var n=i("."+l[0]);i.each(n,function(a){var o=i(this),s=e?o.attr("type")===e:1;s&&r.close(o.attr("times"),a===n.length-1?t:null),s=null}),0===n.length&&"function"==typeof t&&t()};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(t){s=t.find(".layui-layer-input"),s.val(e.value||"").focus(),"function"==typeof f&&f(t)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a=''+t[0].title+"";i"+t[i].title+"";return a}(),content:'
    '+function(){var e=t.length,i=1,a="";if(e>0)for(a='
  • '+(t[0].content||"no content")+"
  • ";i'+(t[i].content||"no content")+"";return a}()+"
",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=!("string"==typeof t.photos||t.photos instanceof i),f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){h();var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0)}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev(!0)}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext(!0)}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),a&&(t.anim=-1),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||'+function(){return u.length>1?'
'+(u[d].alt||"")+""+s.imgIndex+" / "+u.length+"
":""}()+"",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){r.ready(),o.run(e.jQuery)}()}(window); \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/theme/default/layer.css b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/theme/default/layer.css new file mode 100644 index 000000000..820b4a99b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/theme/default/layer.css @@ -0,0 +1 @@ +.layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}} \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/version.txt b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/version.txt new file mode 100644 index 000000000..ed29f7a68 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/static/version.txt @@ -0,0 +1,2 @@ +jQuery v3.7.1 +layer-v3.5.1 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/_category_.json new file mode 100644 index 000000000..a8362e278 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "单点登录", + "position": 4, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important Docusaurus concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/inteapps.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/inteapps.md new file mode 100644 index 000000000..75a6e6c5e --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/inteapps.md @@ -0,0 +1,139 @@ +--- +title: 常用应用列表 +sidebar_position: 2 +--- + +## 常用应用列表 + +MaxKey与常用应用集成,持续更新。。。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
应用名称图标类型文档
阿里云SAAS(云服务)集成指南
腾讯云SAAS(云服务)集成指南
华为云SAAS(云服务)
SalesForceSAAS(云服务)
腾讯企业邮箱SAAS(云服务)
华为云速邮箱SAAS(云服务)
泛微OA企业应用
O2OA企业应用
GitLab企业应用集成指南
JumpServer企业应用
ZABBIX企业应用
Kubernetes企业应用
Apache Knox企业应用
Apache APISIX企业应用
Jenkins企业应用集成指南
Liferay Portal企业应用
Grafana企业应用
禅道项目管理企业应用集成指南
Atlassian Confluence企业应用
Atlassian Jira企业应用集成指南
+ + \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/_category_.json new file mode 100644 index 000000000..8460e2e07 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "应用集成指南", + "position": 3, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important Docusaurus concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/gitlab.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/gitlab.md new file mode 100644 index 000000000..a15435f06 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/gitlab.md @@ -0,0 +1,113 @@ +--- +title: GitLab集成指南 +sidebar_position: 7 +--- + +## GitLab 介绍 + +GitLab 是由 GitLab Inc.开发,使⽤ MIT 许可证的基于⽹络的 Git 仓库管理⼯具,且具有 wiki 和 issue +跟踪功能。使⽤ Git 作为代码管理⼯具,并在此基础上搭建起来的 web 服务。 + +官⽅⽹站地址:https://about.gitlab.com/ + +## GitLab 安装配置 + +### GitLab 安装 + +请参照官⽅⽂档 https://about.gitlab.com/install/ + +### 配置 + +具体可参照 https://docs.gitlab.com/ee/integration/oauth_provider.html + +编辑 gitlab.rb + +```sh +vim /etc/gitlab/gitlab.rb +``` + +增加 Oauth 配置: + +```ini +gitlab_rails['omniauth_enabled'] = true +gitlab_rails['omniauth_allow_single_sign_on'] = ['oauth2_generic'] #跟下⾯的 name 对应,不建议修改 +gitlab_rails['omniauth_block_auto_created_users'] = false # 是否⾃动创建账号 +gitlab_rails['omniauth_providers'] = [ + { + 'name' => 'oauth2_generic', #此处跟maxke配置的回调地址有关系 + 'label': 'SSO', # 此处显示在 SSO 授权登录的名称 + // highlight-start + 'app_id' => '9cdbccbe-47a0-4adb-9d3d-7e0eceacaace', + 'app_secret' => 'F3QOMTUwMzIwMjExMTMyMTAzNDknMW', + // highlight-end + 'args' => { + client_options: { + // highlight-start + 'site' => 'http://yourdomain', # maxkey 认证端的域名 + 'authorize_url'=>'/sign/authz/oauth/v20/authorize', + 'token_url'=>'/sign/authz/oauth/v20/token', + 'user_info_url' => '/sign/api/oauth/v20/me' + // highlight-end + }, + user_response_structure: { + root_path: [], + // highlight-start + id_path: ['username'], + // highlight-end + attributes: { name: 'realname', email: 'username'} + }, + #name: 'maxkey', + strategy_class: "OmniAuth::Strategies::OAuth2Generic" + } + } +] +``` +配置⽂件修改完成后, 重设配置: +``` +gitlab-ctl reconfigure +``` + +重设完毕, 等待约 30 秒。 + +重新启动 gitliab +``` +gitlab-ctl restart +``` + +### 创建账号 +....略 + +### 创建⼀个账号 maxkey +....略 + +### 关联 Gitlab 账号 + +⽤户登录 gitlab 之后, 在 setting-Account 中点击 Connect 进⾏账户关联。 + + + + +关联成功后, 即可使⽤登录⻚的 Oauth2 登录。 + +### 注意事项 +Gitlab 必须要⼿动关联后, 才可单点登录。 +https 需要配置 omiauth 的 provider_ignores_state:true, 同时需要把 maxkey 的证书放到 gitlab 的 +trusted-certs 下, 然后 重新配置 gitlab-ctl reconfigure 就好了。 + +## MaxKey 配置及登录验证 + +### 应⽤配置 + +进⼊后台"应⽤管理" ,编辑应⽤ + + +进入"OAuth2.0 配置",配置如下 + + +### 应⽤访问赋权 + +如果不在该列表内,可以“新增成员” + +### 单点登录验证 + +重新登录 MaxKey,点击"Gitlab"图标单点登录 diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/index.txt b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/index.txt new file mode 100644 index 000000000..bf0580420 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/index.txt @@ -0,0 +1,26 @@ +a 1 +b 2 +c 3 +d 4 +e 5 +f 6 +g 7 +h 8 +i 9 +j 10 +k 11 +l 12 +m 13 +n 14 +o 15 +p 16 +q 17 +r 18 +s 19 +t 20 +u 21 +v 22 +w 23 +x 24 +y 25 +z 26 diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/jenkins.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/jenkins.md new file mode 100644 index 000000000..7cc02b1fa --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/jenkins.md @@ -0,0 +1,46 @@ +--- +title: Jenkins集成指南 +sidebar_position: 10 +--- + +## Jenkins 介绍 +Jenkins 是⼀个开源软件项⽬,是基于 Java 开发的⼀种持续集成⼯具,⽤于监控持续重 复的⼯作, +旨在提供⼀个开放易⽤的软件平台,使软件的持续集成变成可能。 + +Jenkins 是⼀个功能强⼤的应⽤程序,允许持续集成和持续交付项⽬,⽆论⽤的是什么 平台。这是 +⼀个免费的源代码,可以处理任何类型的构建或持续集成。集成 Jenkins 可以⽤ 于⼀些测试和部署 +技术。 + +Jenkins 是⼀种软件允许持续集成。Jenkins 安装在⼀台服务上也中央构建发⽣的地⽅。 + +官⽅⽹站地址:https://www.jenkins.io/ + +## Jenkins 安装配置 +### Jenkins 安装 +请参照官⽅⽂档 https://www.jenkins.io/doc/book/installing/ + +### 认证插件安装 +登录 jenkins 安装 cas-plugin + +参⻅⽂档 https://plugins.jenkins.io/cas-plugin/ + + +### 认证配置 +配置认证服务, 进⼊Configure Global Security, 具体配置⼊下 + + +备注:配置的URL为:http://yourdomain/sign/authz/cas/ + +## MaxKey 配置及登录验证 +### 应⽤配置 +进⼊后台"应⽤管理" ,编辑应⽤ + + +进入"CAS配置",配置如下 + + +### 应⽤访问赋权 +如果不在该列表内,可以“新增成员” + +### 单点登录验证 +重新登录MaxKey,点击"Jenkins"图标单点登录 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/jira.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/jira.md new file mode 100644 index 000000000..65265aafd --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/jira.md @@ -0,0 +1,67 @@ +--- +title: Jira集成指南 +sidebar_position: 10 +--- + +## Atlassian Jira介绍 +JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 + +JIRA中配置灵活、功能全面、部署简单、扩展丰富,其超过150项特性得到了全球115个国家超过19,000家客户的认可。 + +官方网站地址:https://www.atlassian.com/software/jira + +## Jira安装配置 +### Jira 安装 +请参照官方文档 +https://confluence.atlassian.com/adminjiraserver0813/installing-jira-applications-1027137422.html + +安装路径D:\MaxKey\3party\Jira8.13.10 + +数据路径D:\MaxKey\3party\Jira8.13.10_data + +### Jira启动https +修改D:\MaxKey\3party\Jira8.13.10\conf + +```xml + +``` + +### 认证配置 +配置认证服务,进入Jira,具体配置入下 + + + +基本URL更改为https://jira.maxkey.top:8443 + + + + +备注: + +单一登录发行者:http://yourdomain/sign/saml + +身份提供者单一登录URL:http://yourdomain/sign/authz/saml20/{appid} + +用户名映射:```{NameID}``` + +## MaxKey 配置及登录验证 +### 应⽤配置 +进⼊后台"应⽤管理" ,编辑应⽤ + + +进入"SAML配置",配置如下 + + +### 应⽤访问赋权 +如果不在该列表内,可以“新增成员” + +### 单点登录验证 +重新登录MaxKey,点击“Jira”图标单点登录 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/zentao.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/zentao.md new file mode 100644 index 000000000..902015092 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/integration/zentao.md @@ -0,0 +1,114 @@ +--- +title: 禅道项目管理集成指南 +sidebar_position: 26 +--- + +## 禅道(ZenTao) 介绍 +禅道是第一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。 + +官方网站地址:https://www.zentao.net/ + +## 安装配置 +禅道11.5.1版本开始,增加第三方应用免密登录禅道的功能 + +具体单点登录的方案 + +https://www.zentao.net/book/zentaopmshelp/344.html + +软件下载 + +https://www.zentao.net/download.html + +ZenTaoPMS.***.win**.exe + +在window本地安装 + +安装完成后目录 + + +运行start.exe + +点击“服务”,修改端口避免和maxkey冲突 + + +去掉”启用Apache用户访问验证”,后“启动禅道” + + +## 禅道配置免密登录禅道 +https://www.zentao.net/book/zentaopmshelp/344.html + +禅道11.5.1版本开始,增加第三方应用免密登录禅道的功能。 + +下面,我们来介绍一下免密登录的具体配置。 + +### 添加应用,开启免密登录 + +登录禅道,到后台--二次开发--应用,添加应用时开启免密登录。 + +只有免密登录,选择开启后方可使用。 + + + +### 免密登录的签名机制 +以图中红框内容为例,假设你的禅道访问地址为www.zentao.net 或者 http://47.105.128.128/biz 。 + +我们的请求格式则为: + +http://www.zentao.net/api.php?m=user&f=apilogin&account=account&code=test&time=timestamp&token=token + +或者 + +http://47.105.128.128/biz/api.php?m=user&f=apilogin&account=account&code=test&time=timestamp&token=token + + + +说明: + +m:模块名,是固定的,不可更改。 + +f :方法名, 是固定的,不可更改。 + +account:你想要登录的用户名,该用户需存在于禅道系统中。 + +code:应用代号。 + +time:当前时间戳,php可用time()函数获取。时间戳只一次有效,下次免密登录时,需要刷新页面。 + +token:算法为:code、应用密钥、time()字符串合并,再进行 md5 加密。 + +``` +$code = 'test'; +$key = 'a5246932b0f371263c252384076cd3f0'; +$time = '1557034496'; +$token = md5($code . $key . $time); +``` + +### 错误提示 +401  缺少参数或应用未设置密钥 + +403  被限制访问 + +404  应用不存在 + +405  token已失效 + +406  用户不存在 + +407  错误的时间戳 + +## MaxKey 配置及登录验证 +### 应⽤配置 +进⼊后台"应⽤管理" ,编辑应⽤ + + +"API配置",配置如下 + + +"扩展配置",配置如下 + + +### 应⽤访问赋权 +如果不在该列表内,可以“新增成员” + +### 单点登录验证 +重新登录MaxKey,点击"Jenkins"图标单点登录 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/_category_.json new file mode 100644 index 000000000..8e33db6db --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "标准协议", + "position": 1, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important Docusaurus concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/cas.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/cas.md new file mode 100644 index 000000000..73b7bb578 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/cas.md @@ -0,0 +1,371 @@ +--- +sidebar_position: 3 +--- +# CAS应用集成 +本文介绍CAS应用如何与MaxKey进行集成。 + +## 应用注册 + +应用在MaxKey管理系统进行注册,注册的配置信息如下 +![sso_cas_conf](/images/sso/sso_cas_conf.png) + + +## CAS客户端配置 + +本文使用JAVA WEB程序为例 + +源代码地址 + +https://github.com/MaxKeyTop/MaxKey-Demo/blob/master/maxkey-demo-cas + + +### 引入依赖包 + +jar包依赖如下 + +```java +cas-client-core-3.2.1.jar +commons-codec-1.9.jar +commons-io-2.2.jar +commons-logging-1.1.1.jar +``` + + +### web.xml配置 +```xml + + + + + org.jasig.cas.client.session.SingleSignOutHttpSessionListener + + + CAS Single Sign Out Filter + org.jasig.cas.client.session.SingleSignOutFilter + + + CAS Single Sign Out Filter + /index.jsp + + + CAS Filter + org.jasig.cas.client.authentication.AuthenticationFilter + + + casServerLoginUrl + http://sso.maxkey.top/sign/authz/cas/login + + + + serverName + http://cas.demo.maxkey.top:8080/ + + + + CAS Filter + /index.jsp + + + + CAS Validation Filter + org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter + + + casServerUrlPrefix + http://sso.maxkey.top/sign/authz/cas/ + + + + serverName + http://cas.demo.maxkey.top:8080/ + + + + CAS Validation Filter + /index.jsp + + + CAS HttpServletRequest Wrapper Filter + + org.jasig.cas.client.util.HttpServletRequestWrapperFilter + + + + CAS HttpServletRequest Wrapper Filter + /index.jsp + + + CAS Assertion Thread Local Filter + org.jasig.cas.client.util.AssertionThreadLocalFilter + + + CAS Assertion Thread Local Filter + /index.jsp + + + index.jsp + + +``` + +### 获取登录名及用户属性 + +```java +<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> +<%@ page language="java" import="java.util.Map.Entry" %> +<%@ page language="java" import="org.apache.commons.codec.binary.Base64" %> +<%@ page language="java" import="org.jasig.cas.client.authentication.AttributePrincipal" %> +<%@ page language="java" import="org.jasig.cas.client.validation.Assertion" %> +<%@ page language="java" import="org.jasig.cas.client.util.AbstractCasFilter" %> +<% + String path = request.getContextPath(); + String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; + System.out.println("CAS Assertion Success . "); + Assertion assertion = (Assertion) request.getSession().getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION); + String username= assertion.getPrincipal().getName(); +%> + + + + + Demo CAS + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + <% + Map attMap = assertion.getPrincipal().getAttributes(); + for (Entry entry : attMap.entrySet()) { + String attributeValue=entry.getValue()==null?"":entry.getValue().toString(); + System.out.println("attributeValue : "+attributeValue); + if(attributeValue.startsWith("base64:")){ + attributeValue=new String(Base64.decodeBase64(attributeValue.substring("base64:".length())),"UTF-8"); + } + %> + + + + + <%}%> +
CAS Demo for MaxKey
CAS Logo
CAS Assertion<%=username %>
CAS Has Attributes <%=!assertion.getPrincipal().getAttributes().isEmpty() %> size : <%=assertion.getPrincipal().getAttributes().size() %>
CAS <%=entry.getKey() %> <%=attributeValue %>
+
+ + +``` + + +## SpringBoot CAS配置 + +源代码地址 + +https://github.com/MaxKeyTop/MaxKey-SpringBoot4CAS-demo + + +demo分别写了三个请求:拦截请求 test1/index,test1/index1 以及不拦截请求test1/index2, + +### 引入依赖包 + +```xml + + net.unicon.cas + cas-client-autoconfig-support + 2.3.0-GA + +``` + +### SpringBoot配置 + +``` +server: + port: 8989 +cas: + # cas服务端地址 + server-url-prefix: http://sso.maxkey.top/sign/authz/cas/ + # cas服务端登陆地址 + server-login-url: http://sso.maxkey.top/sign/authz/cas/login + # 客户端访问地址 + client-host-url: http://localhost:8989/ + # 认证方式,默认cas + validation-type: cas + # 客户端需要拦截的URL地址 + authentication-url-patterns: + - /test1/index + - /test1/index1 +``` + +扩展配置项 +``` +cas.authentication-url-patterns +cas.validation-url-patterns +cas.request-wrapper-url-patterns +cas.assertion-thread-local-url-patterns +cas.gateway +cas.use-session +cas.redirect-after-validation +cas.allowed-proxy-chains +cas.proxy-callback-url +cas.proxy-receptor-url +cas.accept-any-proxy +server.context-parameters.renew +``` + +### CAS注解 +在application启动类上加上 @EnableCasClient 注解 + +```java +@SpringBootApplication +@EnableCasClient +public class DemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } + +} +``` + +### 获取登录用户信息 + +```java + @GetMapping("test1/index1") + public String index1(HttpServletRequest request){ + String token =request.getParameter("token"); + System.out.println("token : "+token); + Assertion assertion = (Assertion) request.getSession().getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION); + + String username= assertion.getPrincipal().getName(); + System.out.println(username); + + return "test index cas拦截正常,登录账号:"+username; + } +``` + +## CAS REST登录 + +```java +package org.maxkey.web.authorize.endpoint; + +import org.pac4j.cas.profile.CasRestProfile; +import org.pac4j.cas.client.rest.CasRestFormClient; +import org.pac4j.cas.config.CasConfiguration; +import org.pac4j.cas.credentials.authenticator.CasRestAuthenticator; +import org.pac4j.cas.profile.CasProfile; +import org.pac4j.core.context.J2EContext; +import org.pac4j.core.context.WebContext; +import org.pac4j.core.credentials.TokenCredentials; +import org.pac4j.core.credentials.UsernamePasswordCredentials; +import org.pac4j.core.exception.HttpAction; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; + +import java.util.Map; +import java.util.Set; + +//https://apereo.github.io/cas/6.0.x/protocol/REST-Protocol.html + +public class RestTestClient { + + public static void main(String[] args ) throws HttpAction { + final String casUrlPrefix = "http://sso.maxkey.top/sign/authz/cas/"; + String username ="admin"; + String password ="maxkey"; + String serviceUrl = "http://cas.demo.maxkey.top:8080/demo-cas/"; + CasConfiguration casConfiguration = new CasConfiguration(casUrlPrefix); + final CasRestAuthenticator authenticator = new CasRestAuthenticator(casConfiguration); + final CasRestFormClient client = new CasRestFormClient(casConfiguration,"username","password"); + final MockHttpServletRequest request = new MockHttpServletRequest(); + final MockHttpServletResponse response = new MockHttpServletResponse(); + + final WebContext webContext = new J2EContext(request, response); + casConfiguration.init(); + UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(username,password); + CasRestAuthenticator restAuthenticator = new CasRestAuthenticator(casConfiguration); + // authenticate with credentials (validate credentials) + restAuthenticator.validate(credentials, webContext); + final CasRestProfile profile = (CasRestProfile) credentials.getUserProfile(); + // get service ticket + final TokenCredentials casCredentials = client.requestServiceTicket(serviceUrl, profile, webContext); + // validate service ticket + final CasProfile casProfile = client.validateServiceTicket(serviceUrl, casCredentials, webContext); + + Map attributes = casProfile.getAttributes(); + Set> mapEntries = attributes.entrySet(); + for (Map.Entry entry : mapEntries) { + System.out.println(entry.getKey() + ":" + entry.getValue()); + } + client.destroyTicketGrantingTicket(profile,webContext); + } +} +``` + +详细见请参考 + +https://github.com/MaxKeyTop/MaxKey/blob/master/maxkey-protocols/maxkey-protocol-cas/src/test/java/org/maxkey/web/authorize/endpoint/RestTestClient.java \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/formbased.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/formbased.md new file mode 100644 index 000000000..2eb6dfa8a --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/formbased.md @@ -0,0 +1,16 @@ +--- +sidebar_position: 9 +--- +# FormBased应用集成 +本文介绍FormBased应用如何与MaxKey进行集成。 + +## 应用注册 + +应用在MaxKey管理系统进行注册,注册的配置信息如下 + +![sso_form_yd_conf](/images/sso/sso_form_yd_conf.png) + + +## 认证定制 + +可以基于相关的信息定制其他的认证方式。 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/jwt.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/jwt.md new file mode 100644 index 000000000..44a3c7c58 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/jwt.md @@ -0,0 +1,170 @@ +--- +sidebar_position: 4 +--- +# JWT应用集成 +本文介绍JWT应用如何与MaxKey进行集成。 + +## 应用注册 + +应用在MaxKey管理系统进行注册,注册的配置信息如下 + +![sso_jwt_conf](/images/sso/sso_jwt_conf.png) + + +## JWT客户端集成 + +本文使用JAVA WEB程序为例 + +### 引入客户端所需包 + +```java +gson-2.2.4.jar +maxkey-client-sdk.jar +nimbus-jose-jwt-8.10.jar +commons-codec-1.9.jar +commons-io-2.2.jar +commons-logging-1.1.1.jar +``` + + +### 获取令牌和用户信息及验证签名 + +```java +<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> +<%@ page language="java" import="org.maxkey.client.oauth.model.*" %> +<%@ page language="java" import="org.maxkey.client.utils.*" %> +<%@ page language="java" import="com.nimbusds.jwt.JWTClaimsSet" %> +<%@ page language="java" import="com.nimbusds.jose.*" %> +<%@ page language="java" import="com.nimbusds.jwt.*" %> +<%@ page language="java" import="com.connsec.oidc.jose.keystore.*" %> +<%@ page language="java" import="com.nimbusds.jose.jwk.*" %> +<%@ page language="java" import="java.io.File" %> +<%@ page language="java" import="com.nimbusds.jose.crypto.*" %> +<%@ page language="java" import="com.google.gson.*" %> +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; +String token=request.getParameter("jwt"); +System.out.println("jwt "+token); +SignedJWT signedJWT=null; +File jwksFile=new File(PathUtils.getInstance().getClassPath()+"jwk.jwks"); +JWKSet jwkSet=JWKSet.load(jwksFile); +RSASSAVerifier rsaSSAVerifier = new RSASSAVerifier(((RSAKey) jwkSet.getKeyByKeyId("maxkey_rsa")).toRSAPublicKey()); +try { + signedJWT = SignedJWT.parse(token); +} catch (java.text.ParseException e) { + // Invalid signed JWT encoding +} +System.out.println("signedJWT "+signedJWT); +JWTClaimsSet jwtClaims =signedJWT.getJWTClaimsSet(); +%> + + + + + JWT 1.0 Demo + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
JSON Web Token (JWT) 1.0 Demo
JWT 1.0 Logo
Issuer<%=jwtClaims.getIssuer() %>
Subject<%=jwtClaims.getSubject()%>
Audience<%=jwtClaims.getAudience() %>
ExpirationTime<%=jwtClaims.getExpirationTime() %>
JWTID<%=jwtClaims.getJWTID() %>
IssueTime<%=jwtClaims.getIssueTime() %>
Verify<%=signedJWT.verify(rsaSSAVerifier) %>
JWTClaims + +
+
+ + + +``` + + +## PHP客户端集成 + +### 引入依赖firebase/php-jwt + +```php +composer require firebase/php-jwt +``` + +### 验证签名 + +```php + +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/oauth2.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/oauth2.md new file mode 100644 index 000000000..95634cd18 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/oauth2.md @@ -0,0 +1,649 @@ +--- +sidebar_position: 1 +--- + +# OAuth2应用集成 +本文介绍OAuth2应用如何与MaxKey进行集成。 + +## 认证流程 +采用Authorization Code获取Access Token的授权验证流程又被称为Web Server Flow,适用于所有Server端的应用。其调用流程示意图如下: +![sso_oauth](/images/sso/sso_oauth.png) + + +对于应用而言,其流程由获取Authorization Code和通过Authorization Code获取Access Token这2步组成。 + +1.引导需要授权的用户到如下地址: + +``` +http://sso.maxkey.top/sign/authz/oauth/v20/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI +``` + +2.页面跳转至 + +``` +YOUR_REGISTERED_REDIRECT_URI/?code=CODE +``` + +3.换取Access Token + +``` +http://sso.maxkey.top/sign/authz/oauth/v20/token?client_id=YOUR_CLIENT_ID&client_secret=YOUR _SECRET&grant_type=authorization_code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI&code=CODE +``` + +返回值 + +``` +{ "access_token":"SlAV32hkKG", "remind_in ":3600, "expires_in":3600 } +``` + +## 应用注册 +应用在MaxKey管理系统进行注册,注册的配置信息如下 + +![sso_oauth_conf](/images/sso/sso_oauth_conf.png) + + +## API接口标准 + + + + + + + + + + + + + + + + + + + + + + + + + + +
接口 说明 详细说明 调用方法
/authz/oauth/v20/authorize 请求用户授权Token http://sso.maxkey.top/sign接收app sso认证请求,
client_id为需要认证的应用的id;
APP
/authz/oauth/v20/token 获取授权过的 Access Token 后台应用获取 tokencode ,调用接口进行 tokencode 校验;
校验成功获取访问 token
APP
/api/oauth/v20/me 授权用户信息查询接口 通过访问 token 获取登录用户信息 APP
+ + +### 授权接口 + +/authz/oauth/v20/authorize + +请求用户授权Token + + + + + + + + + + + + + + +
接口名称 请求用户授权Token
url http://sso.maxkey.top/sign/authz/oauth/v20/authorize
请求方式 http get/post
+ +
请求参数
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
参数 说明
client_id 注册应用时分配的client_id。
redirect_uri 应用回调地址,注册时需要配置
grant_type授权类型。
etc param其他参数。
+ 响应返回app应用程序,包含请求参数如下: +
+ http://app.maxkey.org/app/callback?tokencode =PQ7q7W91a-oMsCeLvIaQm6bTrgtp7 +
tokencode用于调用/authz/oauth/token,接口获取授权后的访问token。
+ +### 令牌接口 +/authz/oauth/v20/token + +通过/authz/oauth/v20/token用tokencode换取访问token + + + + + + + + + + + + + + +
接口名称 token 接口
url http://sso.maxkey.top/sign/authz/oauth/v20/token
请求方式 http get/post
+ +
请求参数
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
参数 说明
client_id 注册应用时分配的client_id。
client_secret 注册应用时分配的client_secret
redirect_uri 应用回调地址,注册时需要配置
tokencode调用authz/oauth/v20/authorize获得的tokencode值。
grant_type授权类型。Grant type
username当grant_type=password时,此参数表示直接认证用户名。
password当grant_type=password时,此参数表示直接认证用户密码。
etc param其他参数
+实际请求如下: + +```http +The actual request might look like: +POST /authz/oauth/v20/token token HTTP/1.1 +Host: sso.maxkey.org/openapi +Content-Type: application/x-www-form-urlencoded +tokencode= PQ7q7W91a-oMsCeLvIaQm6bTrgtp7& +client_id=QPKKKSADFUP876& +client_secret=client_secret& +redirect_uri=http://app.maxkey.org/app/callback +``` +
+ 返回数据 +
+ A successful response to this request contains the following fields: +
access_token用该token能调用SSO的API
+ 成功返回JSON数据,如下: + +```json +{ + "access_token":"token_id", + "id_token":"id_token" +} +``` +
+ +### 用户属性接口 +/api/oauth/v20/me + + + + + + + + + + + + + + +
接口名称 token 接口
url http://sso.maxkey.top/sign/api/oauth/v20/me
请求方式 http get/post
+ +
请求参数
+ + + + + + + + + + + + + + + + + + + +
参数 说明
access_token 调用sso/ token获得的token值。
+ 实际请求如下: + +```http +POST /oauth/ userinfo HTTP/1.1 +Host: sso.maxkey.org/openapi +Content-Type: application/x-www-form-urlencoded +access_token= PQ7q7W91a-oMsCeLvIaQm6bTrgtp7 +``` + +
+ 返回数据/ response data +
+

成功返回JSON数据,如下:

+ +```json +{ + "userid":"zhangs" +} +``` + +
+zhangs是认证的用户ID +
+ + + +OAuth认证接口属性列表 + + + + + + + + + + + + +
属性名(Attribute) 描述 数据类型
uiduid字符串
+ + + +## OAuth2.0 错误码 + +MaxKey OAuth2.0实现中,授权服务器在接收到验证授权请求时,会按照OAuth2.0协议对本请求的请求头部.请求参数进行检验,若请求不合法或验证未通过,授权服务器会返回相应的错误信息,包含以下几个参数: + +error: 错误码 + +error_description: 错误的描述信息 + + + +错误信息的返回方式有两种: + +当请求授权Endpoint:http://sso.maxkey.top/sign/authz/oauth/v20/authorize 时出现错误,返回方式是:跳转到redirect_uri,并在uri 的query parameter中附带错误的描述信息。 + +当请求access token endpoint:http://sso.maxkey.top/sign/authz/oauth/v20/token 时出现错误,返回方式:返回JSON文本。 + +例如: +```json +{ + "error":"unsupported_response_type", + "error_description":"不支持的 ResponseType." +} +``` + +OAuth2.0错误响应中的错误码定义如下表所示: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
编号错误码(error)描述(error_description)
1empty_client_id参数client_id为空
2empty_client_secret参数client_secret为空
3empty_redirect_uri参数redirect_uri为空
4empty_response_type参数response_type为空
5empty_codecode为空
6app_unsupport_sso应用不支持sso登录
7app_unsupport_oauth应用不支持OAuth认证
8invalid_client_id非法的client_id
9invalid_response_type非法的response_type
10invalid_scope非法的scope
11invalid_grant_type非法的grant_type
12redirect_uri_mismatch非法的redirect_uri
13unsupported_response_type不支持传递的response_type
14invalid_code非法的code
15unsupported_refresh_token不支持refresh_token的方式
16access_token_expriseaccess_token过期
17invalid_access_token非法的access_token
18invalid_refresh_token非法的refresh_token
19refresh_token_expriserefresh_token过期
+ + +## OAuth2客户端集成 + + +本文使用JAVA WEB程序为例 + +### 引入依赖包 + +```java +gson-2.2.4.jar +maxkey-client-sdk.jar +nimbus-jose-jwt-8.10.jar +commons-codec-1.9.jar +commons-io-2.2.jar +commons-logging-1.1.1.jar +``` + +### 认证授权 + +```java +<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> +<%@ page language="java" import="org.maxkey.client.oauth.oauth.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.builder.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.builder.api.MaxkeyApi20" %> +<%@ page language="java" import="org.maxkey.client.oauth.model.Token" %> + +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+path+"/"; + +String callback="http://oauth.demo.maxkey.top:8080/demo-oauth/oauth20callback.jsp"; +OAuthService service = new ServiceBuilder() + .provider(MaxkeyApi20.class) + .apiKey("b32834accb544ea7a9a09dcae4a36403") + .apiSecret("E9UO53P3JH52aQAcnLP2FlLv8olKIB7u") + .callback(callback) + .build(); +Token EMPTY_TOKEN = null; +String authorizationUrl = service.getAuthorizationUrl(EMPTY_TOKEN); + +request.getSession().setAttribute("oauthv20service", service); + +%> + + + + + + + OAuth 2.0 SSO + + + + + + + + + + oauth 2.0 sso + + +``` + +### 获取令牌及用户信息 + +```java +<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> +<%@ page language="java" import="org.maxkey.client.oauth.oauth.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.builder.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.builder.api.MaxkeyApi20" %> +<%@ page language="java" import="org.maxkey.client.oauth.model.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.domain.*" %> +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; + +OAuthService service = (OAuthService)request.getSession().getAttribute("oauthv20service"); +if(service == null){ + String callback="http://oauth.demo.maxkey.top:8080/demo-oauth/oauth20callback.jsp"; + service = new ServiceBuilder() + .provider(MaxkeyApi20.class) + .apiKey("b32834accb544ea7a9a09dcae4a36403") + .apiSecret("E9UO53P3JH52aQAcnLP2FlLv8olKIB7u") + .callback(callback) + .build(); +} + +Token EMPTY_TOKEN = null; +Verifier verifier = new Verifier(request.getParameter("code")); +Token accessToken = service.getAccessToken(EMPTY_TOKEN, verifier); + +OAuthClient restClient=new OAuthClient("http://sso.maxkey.top/sign/api/oauth/v20/me"); +UserInfo userInfo=restClient.getUserInfo(accessToken.getAccess_token()); + +%> + + + + + OAuth V2.0 Demo + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OAuth V2.0 Demo
OAuth V2.0 Logo
Login<%=userInfo.getUsername() %>
DisplayName<%=userInfo.getDisplayName() %>
Department<%=userInfo.getDepartment() %>
JobTitle<%=userInfo.getJobTitle() %>
email<%=userInfo.getEmail() %>
ResponseString + +
+ +
+ + +``` + +## OAuth2 PASSWORD模式 + +本文使用JAVA 程序为例 + +```java +package org.maxkey.client.oauth.test; + +import org.maxkey.client.http.Response; +import org.maxkey.client.oauth.builder.api.MaxkeyPasswordApi20; +import org.maxkey.client.oauth.model.OAuthConfig; +import org.maxkey.client.oauth.model.Token; +import org.maxkey.client.oauth.oauth.OAuthPasswordService; + +public class MaxkeyPasswordDemo { + /** + * @param args + */ + public static void main(String[] args) { + String accessTokenUrl="http://sso.maxkey.top/sign/authz/oauth/v20/token"; + String clientId = "b32834accb544ea7a9a09dcae4a36403"; + String clientSerect = "E9UO53P3JH52aQAcnLP2FlLv8olKIB7u"; + + String callback = "http://oauth.demo.maxkey.top:8080/demo-oauth/oauth20callback.jsp"; + String responseType ="token"; + String approvalprompt = "auto"; + + OAuthConfig oauthServiceConfig=new OAuthConfig(clientId,clientSerect,callback); + MaxkeyPasswordApi20 passwordApi20=new MaxkeyPasswordApi20(accessTokenUrl); + OAuthPasswordService oAuthPasswordService=new OAuthPasswordService(oauthServiceConfig,passwordApi20); + Token accessToken = null; + Response response = null; + accessToken = oAuthPasswordService.getAccessToken("admin", "maxkey"); + } +} +``` + + +### 详细见请参考 + +https://github.com/MaxKeyTop/MaxKey-Client-sdk/blob/master/src/test/java/org/maxkey/client/oauth/test/MaxkeyPasswordDemo.java \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/oidc.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/oidc.md new file mode 100644 index 000000000..55b0383e5 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/oidc.md @@ -0,0 +1,308 @@ +--- +sidebar_position: 2 +--- +# OpenID Connect应用集成 +本文介绍OpenID Connect应用如何与MaxKey进行集成。 + +## 认证流程 + +请参照OAuth2认证流程 + +## 应用注册 +应用在MaxKey管理系统进行注册,注册的配置信息如下 + +![sso_oidc_conf](/images/sso/sso_oidc_conf.png) + + +## 集成和接口 +用户属性接口/api/connect/v10/userinfo + +通过访问token 获取登录用户信息及签名信息,在程序中必须验证相关的签名信息。 + + + + + + + + + + + + + + +
接口名称 OIDC授权用户信息查询接口
url https://sso.maxkey.org/maxkey/api/connect/v10/userinfo
请求方式 http get/post
+ +
请求参数
+ + + + + + + + + + + + + + + + + + + +
参数 说明
access_token 调用sso/ token获得的token值。
+ 实际请求如下: + +```http +POST /oauth/ userinfo HTTP/1.1 +Host: sso.maxkey.org/openapi +Content-Type: application/x-www-form-urlencoded +access_token= PQ7q7W91a-oMsCeLvIaQm6bTrgtp7 +``` +
+ 返回数据/ response data +
+

成功返回JSON数据,如下:

+ +```json +{ + userid : "zhangs" +} +``` + +
+zhangs是认证的用户ID +
+ + + +OAuth认证接口属性列表 + + + + + + + + + + + + +
属性名(Attribute) 描述 数据类型
uiduid字符串
+ +其他请参照OAuth2 + + +## OIDC V1客户端集成 + +本文使用JAVA WEB程序为例 + +### 引入依赖包 + +```java +gson-2.2.4.jar +maxkey-client-sdk.jar +nimbus-jose-jwt-8.10.jar +commons-codec-1.9.jar +commons-io-2.2.jar +commons-logging-1.1.1.jar +``` + +### 认证授权 + +```java +<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> +<%@ page language="java" import="org.maxkey.client.oauth.oauth.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.builder.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.builder.api.MaxkeyApi20" %> +<%@ page language="java" import="org.maxkey.client.oauth.model.Token" %> + +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+path+"/"; + +String callback="http://oauth.demo.maxkey.top:8080/demo-oauth/oauth20callback.jsp"; +OAuthService service = new ServiceBuilder() + .provider(MaxkeyApi20.class) + .apiKey("ae20330a-ef0b-4dad-9f10-d5e3485ca2ad") + .apiSecret("KQY4MDUwNjIwMjAxNTE3NTM1OTEYty") + .callback(callback) + .build(); +Token EMPTY_TOKEN = null; +String authorizationUrl = service.getAuthorizationUrl(EMPTY_TOKEN); + +request.getSession().setAttribute("oauthv20service", service); + +%> + + + + + + + OIDC V1 SSO + + + + + + + + + OIDC V1 SSO + + + +``` + + +### 登录验证 + +获取令牌、用户信息及验证签名 (id_token及用户信息) + +```java +<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> +<%@ page language="java" import="org.maxkey.client.oauth.oauth.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.builder.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.builder.api.MaxkeyApi20" %> +<%@ page language="java" import="org.maxkey.client.oauth.model.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.*" %> +<%@ page language="java" import="org.maxkey.client.oauth.domain.*" %> +<%@ page language="java" import="org.maxkey.client.utils.*" %> +<%@ page language="java" import="com.nimbusds.jwt.JWTClaimsSet" %> +<%@ page language="java" import="com.nimbusds.jose.*" %> +<%@ page language="java" import="com.nimbusds.jwt.*" %> +<%@ page language="java" import="com.connsec.oidc.jose.keystore.*" %> +<%@ page language="java" import="com.nimbusds.jose.jwk.*" %> +<%@ page language="java" import="java.io.File" %> +<%@ page language="java" import="com.nimbusds.jose.crypto.*" %> +<%@ page language="java" import="com.google.gson.*" %> + +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; + +OAuthService service = (OAuthService)request.getSession().getAttribute("oauthv20service"); + +if(service==null){ + String callback="http://oauth.demo.maxkey.top:8080/demo-oauth/oidc10callback.jsp"; + service = new ServiceBuilder() + .provider(MaxkeyApi20.class) + .apiKey("ae20330a-ef0b-4dad-9f10-d5e3485ca2ad") + .apiSecret("KQY4MDUwNjIwMjAxNTE3NTM1OTEYty") + .callback(callback) + .build(); +} + +Token EMPTY_TOKEN = null; +Verifier verifier = new Verifier(request.getParameter("code")); +Token accessToken = service.getAccessToken(EMPTY_TOKEN, verifier); + +//JWTClaimsSet idClaims = JWTClaimsSet.parse(accessToken.getId_token()); +SignedJWT signedJWT=null; + +//JWKSetKeyStore jwkSetKeyStore=new JWKSetKeyStore(); + +File jwksFile=new File(PathUtils.getInstance().getClassPath()+"jwk.jwks"); +JWKSet jwkSet=JWKSet.load(jwksFile); + +RSASSAVerifier rsaSSAVerifier = new RSASSAVerifier(((RSAKey) jwkSet.getKeyByKeyId("maxkey_rsa")).toRSAPublicKey()); +try { + signedJWT = SignedJWT.parse(accessToken.getId_token()); +} catch (java.text.ParseException e) { + // Invalid signed JWT encoding +} +; + +OAuthClient restClient=new OAuthClient("http://sso.maxkey.top/sign/api/connect/v10/userinfo",accessToken.getToken()); + +OIDCUserInfo userInfo=restClient.getOIDCUserInfo(accessToken.getToken()); + +%> + + + + + + + OpenID Connect 1.0 Demo + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OpenID Connect 1.0 Demo
OpenID Connect 1.0 Logo
Login<%=userInfo.getSub() %>
DisplayName<%=userInfo.getName()%>
Department<%=userInfo.getGender() %>
email<%=userInfo.getEmail() %>
ResponseString + +
Id_token<%=accessToken.getId_token() %>
Verify<%=signedJWT.verify(rsaSSAVerifier) %>
Issuer<%=signedJWT.getJWTClaimsSet().getIssuer() %>
JWTClaims + +
+
+ + + + +``` diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/saml_aly.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/saml_aly.md new file mode 100644 index 000000000..dfcef8098 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/saml_aly.md @@ -0,0 +1,22 @@ +--- +sidebar_position: 6 +--- +# SAML阿里云集成 +本文介绍阿里云使用SAML如何与MaxKey进行集成。 + +

应用注册

+ +1)首先需要注册阿里云,并开通SAML认证功能,下载阿里云SAML元数据,具体说明文档请参照 + +访问控制 > 单点登录管理(SSO) > SSO概览 + + +2)应用在MaxKey管理系统进行注册,注册的配置信息如下,注册时需要提供阿里云SAML元数据 +![sso_saml_aly_conf](/images/sso/sso_saml_aly_conf.png) + + +扩展属性配置,把阿里云的3个相关属性配置到MaxKey中 + +![sso_saml_aly_conf_ex](/images/sso/sso_saml_aly_conf_ex.png) + +3)把MaxKey元数据上传到阿里云,参照阿里云文档 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/saml_salesforce.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/saml_salesforce.md new file mode 100644 index 000000000..e0bb49f1b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/saml_salesforce.md @@ -0,0 +1,5 @@ +--- +sidebar_position: 8 +--- +# SAMLSalesForce集成 +TODO \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/saml_txy.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/saml_txy.md new file mode 100644 index 000000000..16efd9ca4 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/saml_txy.md @@ -0,0 +1,21 @@ +--- +sidebar_position: 7 +--- +# SAML腾讯云集成 +本文介绍腾讯云使用SAML如何与MaxKey进行集成。 + +

应用注册

+ +1)首先需要注册腾讯云,并开通SAML认证功能,下载腾讯云SAML元数据,具体说明文档请参照 + +文档中心>访问管理>用户指南>身份提供商 + +2)应用在MaxKey管理系统进行注册,注册的配置信息如下,注册时需要提供腾讯云SAML元数据 + +![sso_saml_txy_conf](/images/sso/sso_saml_txy_conf.png) + +扩展属性配置,把腾讯云的3个相关属性配置到MaxKey中 + +![sso_saml_txy_conf_ex](/images/sso/sso_saml_txy_conf_ex.png) + +3)把MaxKey元数据上传到腾讯云,参照腾讯云文档 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/tokenbased.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/tokenbased.md new file mode 100644 index 000000000..7f0a88788 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso/tokenbased.md @@ -0,0 +1,241 @@ +--- +sidebar_position: 5 +--- + +# TokenBased应用集成 +本文介绍TokenBased应用如何与MaxKey进行集成。 + +## 应用注册 + +应用在MaxKey管理系统进行注册,注册的配置信息如下 + +![sso_token_conf](/images/sso/sso_token_conf.png) + +LTPA使用Cookie传输令牌 + +![sso_token_ltpa_conf](/images/sso/sso_token_ltpa_conf.png) + + +## TokenBased客户端集成 + +本文使用JAVA WEB程序为例 + +### 引入客户端所需包 + +```ini +gson-2.2.4.jar +maxkey-client-sdk.jar +nimbus-jose-jwt-8.10.jar +commons-codec-1.9.jar +commons-io-2.2.jar +commons-logging-1.1.1.jar +``` + +### 简单令牌 + +``` +<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> +<%@ page language="java" import="org.maxkey.client.tokenbase.*"%> +<%@ page language="java" import="org.maxkey.client.crypto.*"%> +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; + +String token =request.getParameter("token"); +System.out.println("token : "+token); +String tokenString=TokenUtils.decode(token, "x8zPbCya", ReciprocalUtils.Algorithm.DES); +String parseToken[]=TokenUtils.parseSimpleBasedToken(tokenString); +%> + + + + + + SimpleBasedToken Demo + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
SimpleBasedToken Demo
SimpleBasedToken Logo
UserName<%=parseToken[0]%>
Authentication at Time<%=parseToken[1]%>
+
+ + +``` + +### 基于JSON令牌 + +```java +<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> +<%@ page language="java" import="org.maxkey.client.tokenbase.*"%> +<%@ page language="java" import="org.maxkey.client.crypto.*"%> +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; + +String token =request.getParameter("token"); +System.out.println("token : "+token); +String tokenString=TokenUtils.decode(token, "lEWhDLTo", ReciprocalUtils.Algorithm.DES); +Map tokenMap=TokenUtils.parseJsonBasedToken(tokenString); + +%> + + + + + + JsonBasedToken Demo + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
JsonBasedToken Demo
JsonBasedToken Logo
UID<%=tokenMap.get("uid") %>
UserName<%=tokenMap.get("username") %>
Department<%=tokenMap.get("department") %>
Email<%=tokenMap.get("email") %>
Authentication at Time<%=tokenMap.get("at")%>
Expires<%=tokenMap.get("expires")%>
+
+ + +``` + +### 基于LTPA JSON(COOKIE JSON)令牌 + +```java +<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> +<%@ page language="java" import="org.maxkey.client.ltpa.*"%> +<%@ page language="java" import="org.maxkey.client.crypto.*"%> +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; + +String ltpaVaule=LtpaUtils.readLtpa(request, "maxkey.top", "ltpa"); +System.out.println("============ ltpaVaule "+ltpaVaule); +Map tokenMap=null; +if(ltpaVaule!=null){ + String ltpaString=LtpaUtils.decode(ltpaVaule, "k1tk41Ng", ReciprocalUtils.Algorithm.DES); + tokenMap=LtpaUtils.parseLtpaJson(ltpaString); +} +%> + + + + + + + LTPA Demo + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LTPA Demo
LTPA Logo
UID<%=tokenMap.get("uid") %>
UserName<%=tokenMap.get("username") %>
Department<%=tokenMap.get("department") %>
Email<%=tokenMap.get("email") %>
Authentication at Time<%=tokenMap.get("at")%>
Expires<%=tokenMap.get("expires")%>
+
+ + + +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso_ui.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso_ui.md new file mode 100644 index 000000000..2a65e472f --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/am/sso_ui.md @@ -0,0 +1,16 @@ +--- +title: 单点登录UI +sidebar_position: 4 +--- +# 单点登录UI + +## 登录视图 + + +![登录视图](/images/maxkey_login.png) + + +## 应用视图 + + +![应用视图](/images/maxkey_index.png) diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/_category_.json new file mode 100644 index 000000000..26d5a19be --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "API接口", + "position": 10, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important Docusaurus concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/authz.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/authz.md new file mode 100644 index 000000000..46d322817 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/authz.md @@ -0,0 +1,75 @@ +--- +title: 认证总地址接口 +sidebar_position: 11 +--- + +## 认证总地址接口 + + +**接口地址**:`/sign/authz/{id}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

参数应用ID,分发到不同应用的认证地址

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/10validate.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/10validate.md new file mode 100644 index 000000000..fe7550187 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/10validate.md @@ -0,0 +1,57 @@ +--- +title: CAS 1.0 ticket验证接口 +--- + +## CAS 1.0 ticket验证接口 + + +**接口地址**:`/sign/authz/cas/validate` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

通过ticket获取当前登录用户信息

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|service|service|query|true|string|| +|ticket|ticket|query|true|string|| +|renew|renew|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/20proxyValidate.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/20proxyValidate.md new file mode 100644 index 000000000..0fb0bc1eb --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/20proxyValidate.md @@ -0,0 +1,59 @@ +--- +title: CAS 2.0 ticket代理验证接口 +--- + +## CAS 2.0 ticket代理验证接口 + + +**接口地址**:`/sign/authz/cas/proxyValidate` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`application/xml` + + +**接口描述**:

通过ticket获取当前登录用户信息

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|service|service|query|true|string|| +|ticket|ticket|query|true|string|| +|format|format|query|false|string|| +|pgtUrl|pgtUrl|query|false|string|| +|renew|renew|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/20serviceValidate.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/20serviceValidate.md new file mode 100644 index 000000000..fc9767b58 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/20serviceValidate.md @@ -0,0 +1,59 @@ +--- +title: CAS 2.0 ticket验证接口 +--- + +## CAS 2.0 ticket验证接口 + + +**接口地址**:`/sign/authz/cas/serviceValidate` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`application/xml` + + +**接口描述**:

通过ticket获取当前登录用户信息

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|service|service|query|true|string|| +|ticket|ticket|query|true|string|| +|format|format|query|false|string|| +|pgtUrl|pgtUrl|query|false|string|| +|renew|renew|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/30proxy.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/30proxy.md new file mode 100644 index 000000000..e0d27c1d8 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/30proxy.md @@ -0,0 +1,57 @@ +--- +title: CAS 3.0 ProxyTicket代理验证接口 +--- + +## CAS 3.0 ProxyTicket代理验证接口 + + +**接口地址**:`/sign/authz/cas/p3/proxy` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

通过ProxyGrantingTicket获取ProxyTicket

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|pgt|pgt|query|true|string|| +|targetService|targetService|query|true|string|| +|format|format|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```javascript + +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/30proxyValidate.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/30proxyValidate.md new file mode 100644 index 000000000..31eafb60d --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/30proxyValidate.md @@ -0,0 +1,59 @@ +--- +title: CAS 3.0 ticket代理验证接口 +--- + +## CAS 3.0 ticket代理验证接口 + + +**接口地址**:`/sign/authz/cas/p3/proxyValidate` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

通过ProxyTicket获取当前登录用户信息

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|service|service|query|true|string|| +|ticket|ticket|query|true|string|| +|format|format|query|false|string|| +|pgtUrl|pgtUrl|query|false|string|| +|renew|renew|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```javascript + +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/30serviceValidate.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/30serviceValidate.md new file mode 100644 index 000000000..8099c5e67 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/30serviceValidate.md @@ -0,0 +1,59 @@ +--- +title: CAS 3.0 ticket验证接口 +--- + +## CAS 3.0 ticket验证接口 + + +**接口地址**:`/sign/authz/cas/p3/serviceValidate` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

通过ticket获取当前登录用户信息

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|service|service|query|true|string|| +|ticket|ticket|query|true|string|| +|format|format|query|false|string|| +|pgtUrl|pgtUrl|query|false|string|| +|renew|renew|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```javascript + +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/_category_.json new file mode 100644 index 000000000..1692b6760 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "CAS接口", + "position": 2, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important Docusaurus concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/authz.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/authz.md new file mode 100644 index 000000000..8c541034b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/authz.md @@ -0,0 +1,74 @@ +--- +title: CAS页面跳转应用ID认证接口 +--- + +## CAS页面跳转应用ID认证接口 + + +**接口地址**:`/sign/authz/cas/{id}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数应用ID

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/_category_.json new file mode 100644 index 000000000..20bc03617 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "REST认证接口", + "position": 4, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important Docusaurus concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/serviceTicket.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/serviceTicket.md new file mode 100644 index 000000000..abbb66fd6 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/serviceTicket.md @@ -0,0 +1,60 @@ +--- +title: ServiceTicket接口 +--- + +## CAS REST认证接口 + + +**接口地址**:`/sign/authz/cas/v1/tickets/{ticketGrantingTicket}` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

通过TGT获取ST

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ticketGrantingTicket|ticketGrantingTicket|path|true|string|| +|password||formData|false|string|| +|service||formData|false|string|| +|renew||formData|false|string|| +|username||formData|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|201|Created|| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/ticketGrantingTicket.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/ticketGrantingTicket.md new file mode 100644 index 000000000..bce9093e4 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/ticketGrantingTicket.md @@ -0,0 +1,55 @@ +--- +title: ticketGrantingTicket接口 +--- + +## CAS REST认证接口 + + +**接口地址**:`/sign/authz/cas/v1/tickets/{ticketGrantingTicket}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

检查TGT状态

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ticketGrantingTicket|ticketGrantingTicket|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/ticketGrantingTicketdelete.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/ticketGrantingTicketdelete.md new file mode 100644 index 000000000..a2f15ba0f --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/ticketGrantingTicketdelete.md @@ -0,0 +1,55 @@ +--- +title: 注销TGT状态接口 +--- + +## CAS REST认证接口 + + +**接口地址**:`/sign/authz/cas/v1/tickets/{ticketGrantingTicket}` + + +**请求方式**:`DELETE` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

注销TGT状态

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ticketGrantingTicket|ticketGrantingTicket|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/tickets.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/tickets.md new file mode 100644 index 000000000..e4acde2a4 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/tickets.md @@ -0,0 +1,58 @@ +--- +title: CAS REST认证接口 +--- + +## CAS REST认证接口 + + +**接口地址**:`/sign/authz/cas/v1/tickets` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

通过用户名密码获取TGT

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|password||formData|false|string|| +|service||formData|false|string|| +|username||formData|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|201|Created|| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/users.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/users.md new file mode 100644 index 000000000..cd104afa6 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/casrest/users.md @@ -0,0 +1,58 @@ +--- +title: 用户名密码登录接口 +--- + +## CAS REST认证接口 + + +**接口地址**:`/sign/authz/cas/v1/users` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

用户名密码登录接口

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|password||formData|false|string|| +|service||formData|false|string|| +|username||formData|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|201|Created|| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/login.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/login.md new file mode 100644 index 000000000..a697eff1b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/login.md @@ -0,0 +1,74 @@ +--- +title: CAS页面跳转service认证接口 +--- + +## CAS页面跳转service认证接口 + + +**接口地址**:`/sign/authz/cas/login` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数service

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|service|service|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/logout.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/logout.md new file mode 100644 index 000000000..e443746cc --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/cas/logout.md @@ -0,0 +1,74 @@ +--- +title: CAS注销接口 +--- + +## CAS注销接口 + + +**接口地址**:`/sign/authz/cas/logout` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

CAS注销接口

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|service|service|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/extendapi.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/extendapi.md new file mode 100644 index 000000000..f46c4e85b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/extendapi.md @@ -0,0 +1,75 @@ +--- +title: ExtendApi接口 +sidebar_position: 6 +--- + +## ExtendApi认证地址接口 + + +**接口地址**:`/sign/authz/api/{id}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

参数应用ID

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/formbased.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/formbased.md new file mode 100644 index 000000000..aa8059652 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/formbased.md @@ -0,0 +1,75 @@ +--- +title: FormBased接口 +sidebar_position: 7 +--- + +## FormBased认证地址接口 + + +**接口地址**:`/sign/authz/formbased/{id}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

参数应用ID

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/jwt.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/jwt.md new file mode 100644 index 000000000..f04188feb --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/jwt.md @@ -0,0 +1,75 @@ +--- +title: JWT接口 +sidebar_position: 4 +--- + +## JWT应用ID认证接口 + + +**接口地址**:`/sign/authz/jwt/{id}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

应用ID

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/login.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/login.md new file mode 100644 index 000000000..2e057f270 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/login.md @@ -0,0 +1,73 @@ +--- +title: 登录接口 +sidebar_position: 8 +--- + +## 登录接口 + + +**接口地址**:`/sign/login` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

用户登录地址

+ + + +**请求参数**: + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/logout.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/logout.md new file mode 100644 index 000000000..c123c95d1 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/logout.md @@ -0,0 +1,75 @@ +--- +title: 单点注销接口 +sidebar_position: 9 +--- + +## 单点注销接口 + + +**接口地址**:`/sign/force/logout` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

redirect_uri跳转地址

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|redirect_uri|redirect_uri|query|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/_category_.json new file mode 100644 index 000000000..fa5f71206 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "OAuth2接口", + "position": 1, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important Docusaurus concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/authorize.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/authorize.md new file mode 100644 index 000000000..6d67b021e --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/authorize.md @@ -0,0 +1,77 @@ +--- +title: 认证接口 +sidebar_position: 1 +--- + +## OAuth 2.0 认证接口 + + +**接口地址**:`/sign/authz/oauth/v20/authorize` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数client_id,response_type,redirect_uri等

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|parameters|parameters|query|true||object| +|complete||query|false|boolean|| +|model|model|query|false|object|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/authz.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/authz.md new file mode 100644 index 000000000..ac1ddbc21 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/authz.md @@ -0,0 +1,75 @@ +--- +title: 认证ID接口 +sidebar_position: 2 +--- + +## OAuth 2.0 认证ID接口 + + +**接口地址**:`/sign/authz/oauth/v20/{id}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数应用ID,自动完成跳转认证拼接

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/check_token.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/check_token.md new file mode 100644 index 000000000..71ad7d6f0 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/check_token.md @@ -0,0 +1,56 @@ +--- +title: Token检查接口 +sidebar_position: 6 +--- + +## OAuth 2.0 token检查接口 + + +**接口地址**:`/sign/authz/oauth/v20/check_token` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数token

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|token|token|query|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +object +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/me.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/me.md new file mode 100644 index 000000000..607e993bf --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/me.md @@ -0,0 +1,57 @@ +--- +title: 用户信息接口 +sidebar_position: 4 +--- + +## OAuth 2.0 用户信息接口 + + +**接口地址**:`/sign/api/oauth/v20/me` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数access_token

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|access_token|access_token|query|false|string|| +|authorization|authorization|header|false|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```javascript + +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/oidcuserinfo.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/oidcuserinfo.md new file mode 100644 index 000000000..2c992c649 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/oidcuserinfo.md @@ -0,0 +1,56 @@ +--- +title: OIDC 用户信息接口 +sidebar_position: 5 +--- + +## OIDC 用户信息接口 + + +**接口地址**:`/sign/api/connect/v10/userinfo` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递Authorization参数access_token

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|Authorization|Authorization|header|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/token.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/token.md new file mode 100644 index 000000000..f4674081c --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/oauth2/token.md @@ -0,0 +1,162 @@ +--- +title: 获取AccessToken接口 +sidebar_position: 3 +--- + +## OAuth 2.0 获取AccessToken接口 + + +**接口地址**:`/sign/authz/oauth/v20/token` + + +**请求方式**:`GET` `POST` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数token等

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|parameters|parameters|query|true||object| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|OAuth2AccessToken| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|additionalInformation||object|| +|expiration||string(date-time)|string(date-time)| +|expired||boolean|| +|expiresIn||integer(int32)|integer(int32)| +|oauth2Exception||OAuth2Exception|OAuth2Exception| +|  additionalInformation||object|| +|  cause||Throwable|Throwable| +|    cause||Throwable|Throwable| +|    localizedMessage||string|| +|    message||string|| +|    stackTrace||array|StackTraceElement| +|      className||string|| +|      fileName||string|| +|      lineNumber||integer|| +|      methodName||string|| +|      nativeMethod||boolean|| +|    suppressed||array|Throwable| +|  httpErrorCode||integer(int32)|| +|  localizedMessage||string|| +|  message||string|| +|  oauth2ErrorCode||string|| +|  stackTrace||array|StackTraceElement| +|    className||string|| +|    fileName||string|| +|    lineNumber||integer|| +|    methodName||string|| +|    nativeMethod||boolean|| +|  summary||string|| +|  suppressed||array|Throwable| +|    cause||Throwable|Throwable| +|    localizedMessage||string|| +|    message||string|| +|    stackTrace||array|StackTraceElement| +|      className||string|| +|      fileName||string|| +|      lineNumber||integer|| +|      methodName||string|| +|      nativeMethod||boolean|| +|    suppressed||array|Throwable| +|refreshToken||OAuth2RefreshToken|OAuth2RefreshToken| +|scope||array|| +|tokenType||string|| +|value||string|| + + +**响应示例**: +```javascript +{ + "additionalInformation": {}, + "expiration": "", + "expired": true, + "expiresIn": 0, + "oauth2Exception": { + "additionalInformation": {}, + "cause": { + "cause": { + "cause": {}, + "localizedMessage": "", + "message": "", + "stackTrace": [ + { + "className": "", + "fileName": "", + "lineNumber": 0, + "methodName": "", + "nativeMethod": true + } + ], + "suppressed": [ + {} + ] + }, + "localizedMessage": "", + "message": "", + "stackTrace": [ + { + "className": "", + "fileName": "", + "lineNumber": 0, + "methodName": "", + "nativeMethod": true + } + ], + "suppressed": [ + {} + ] + }, + "httpErrorCode": 0, + "localizedMessage": "", + "message": "", + "oauth2ErrorCode": "", + "stackTrace": [ + { + "className": "", + "fileName": "", + "lineNumber": 0, + "methodName": "", + "nativeMethod": true + } + ], + "summary": "", + "suppressed": [ + {} + ] + }, + "refreshToken": {}, + "scope": [], + "tokenType": "", + "value": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/saml/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/saml/_category_.json new file mode 100644 index 000000000..4a3a24d07 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/saml/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "SAML接口", + "position": 3, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important Docusaurus concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/saml/idpinit.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/saml/idpinit.md new file mode 100644 index 000000000..037262803 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/saml/idpinit.md @@ -0,0 +1,75 @@ +--- +title: SAML 2.0 IDP Init接口 +sidebar_position: 1 +--- + +## SAML 2.0 IDP Init接口 + + +**接口地址**:`/sign/authz/saml20/idpinit/{appid}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数应用ID

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|appid|appid|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/saml/logout.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/saml/logout.md new file mode 100644 index 000000000..1f870d53e --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/saml/logout.md @@ -0,0 +1,72 @@ +--- +title: SAML单点注销地址接口 +sidebar_position: 3 +--- + +## SAML单点注销地址接口 + + +**接口地址**:`/sign/logout/saml` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**: + + +**请求参数**: + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/saml/metadata.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/saml/metadata.md new file mode 100644 index 000000000..fa3bc6b20 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/saml/metadata.md @@ -0,0 +1,56 @@ +--- +title: SAML 2.0 元数据接口 +sidebar_position: 4 +--- + +## SAML 2.0 元数据接口 + + +**接口地址**:`/sign/metadata/saml20/mxk_metadata_{appid}.xml` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`application/xml` + + +**接口描述**:

参数Idp_Metadata_应用ID

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|appid|appid|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/saml/spinit.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/saml/spinit.md new file mode 100644 index 000000000..d3754be53 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/saml/spinit.md @@ -0,0 +1,75 @@ +--- +title: SAML 2.0 SP Init接收接口 +sidebar_position: 2 +--- + +## SAML 2.0 SP Init接收接口 + + +**接口地址**:`/sign/authz/saml20/{appid}` + + +**请求方式**:`GET` `POST` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数应用ID

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|appid|appid|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/ticket.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/ticket.md new file mode 100644 index 000000000..07325dce0 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/ticket.md @@ -0,0 +1,54 @@ +--- +title: 在线ticket验证接口 +--- + +## 在线ticket验证接口 + + +**接口地址**:`/sign/onlineticket/validate` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**: + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ticket|ticket|query|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +暂无 + + +**响应示例**: +```text +string +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/timeout.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/timeout.md new file mode 100644 index 000000000..5ecdb6513 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/timeout.md @@ -0,0 +1,72 @@ +--- +title: 登录超时接口 +sidebar_position: 10 +--- + +## 登录超时接口 + + +**接口地址**:`/sign/timeout` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**: + + +**请求参数**: + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/tokenbased.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/tokenbased.md new file mode 100644 index 000000000..7809e2be0 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/api/tokenbased.md @@ -0,0 +1,75 @@ +--- +title: TokenBased接口 +sidebar_position: 5 +--- + +## TokenBased认证接口 + + +**接口地址**:`/sign/authz/tokenbased/{id}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

传递参数应用ID

+ + + +**请求参数**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|true|string|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|ModelAndView| +|204|No Content|| +|401|Unauthorized|| +|403|Forbidden|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|empty||boolean|| +|model||object|| +|modelMap||object|| +|reference||boolean|| +|status|可用值:ACCEPTED,ALREADY_REPORTED,BAD_GATEWAY,BAD_REQUEST,BANDWIDTH_LIMIT_EXCEEDED,CHECKPOINT,CONFLICT,CONTINUE,CREATED,DESTINATION_LOCKED,EXPECTATION_FAILED,FAILED_DEPENDENCY,FORBIDDEN,FOUND,GATEWAY_TIMEOUT,GONE,HTTP_VERSION_NOT_SUPPORTED,IM_USED,INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR,I_AM_A_TEAPOT,LENGTH_REQUIRED,LOCKED,LOOP_DETECTED,METHOD_FAILURE,METHOD_NOT_ALLOWED,MOVED_PERMANENTLY,MOVED_TEMPORARILY,MULTIPLE_CHOICES,MULTI_STATUS,NETWORK_AUTHENTICATION_REQUIRED,NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE,NOT_EXTENDED,NOT_FOUND,NOT_IMPLEMENTED,NOT_MODIFIED,NO_CONTENT,OK,PARTIAL_CONTENT,PAYLOAD_TOO_LARGE,PAYMENT_REQUIRED,PERMANENT_REDIRECT,PRECONDITION_FAILED,PRECONDITION_REQUIRED,PROCESSING,PROXY_AUTHENTICATION_REQUIRED,REQUESTED_RANGE_NOT_SATISFIABLE,REQUEST_ENTITY_TOO_LARGE,REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT,REQUEST_URI_TOO_LONG,RESET_CONTENT,SEE_OTHER,SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT,TOO_EARLY,TOO_MANY_REQUESTS,UNAUTHORIZED,UNAVAILABLE_FOR_LEGAL_REASONS,UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE,UPGRADE_REQUIRED,URI_TOO_LONG,USE_PROXY,VARIANT_ALSO_NEGOTIATES|string|| +|view||View|View| +|  contentType||string|| +|viewName||string|| + + +**响应示例**: +```javascript +{ + "empty": true, + "model": {}, + "modelMap": {}, + "reference": true, + "status": "", + "view": { + "contentType": "" + }, + "viewName": "" +} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/_category_.json new file mode 100644 index 000000000..e60e46f2b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "学院", + "position": 7, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important Docusaurus concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/algorithm.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/algorithm.md new file mode 100644 index 000000000..2a8d11c29 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/algorithm.md @@ -0,0 +1,3 @@ +--- +layout: zh/default +--- \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/_category_.json new file mode 100644 index 000000000..29aa795d0 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "单点登录协议", + "position": 1, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important Docusaurus concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/cas.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/cas.md new file mode 100644 index 000000000..1b72ae3ce --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/cas.md @@ -0,0 +1,58 @@ +--- +title: CAS协议 +sidebar_position: 3 +--- +## CAS简介 + +CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点: + +CAS的目标是允许用户访问多个应用程序只提供一次用户凭据(如用户名和密码)。它还允许Web应用程序对用户进行身份验证,而不必获取用户的安全凭证,比如密码。 + +
    +
  1. 一个开放的,文档齐全的协议。
  2. +
  3. 开源的JAVA服务器组件。
  4. +
  5. CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
  6. +
  7. 与uPortal, BlueSocket, TikiWiki, Mule, Liferay, Moodle等等能很好集成。
  8. +
  9. 文档社区化和实现的支持。
  10. +
  11. 具有广泛的客户群的支持。
  12. +
+ +扩展阅读参看:官方技术说明CAS官方网站(en) | CAS维基百科(en) + +## CAS体系结构 +CAS 体系包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。 + +![cas1](/images/cas/1.png) + +## CAS原理 +CAS 最基本的协议过程: + +![cas1](/images/cas/2.png) + +SSO单点登录访问流程主要有以下步骤: + +1. 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。 + +2. 定向认证:SSO客户端会重定向用户请求到SSO服务器。 + +3. 用户认证:用户身份认证。 + +4. 发放票据:SSO服务器会产生一个随机的Service Ticket。 + +5. 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。 + +6. 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。 + +CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 3 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份合适,以确保 Service Ticket 的合法性。 + +在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。 + +另外,CAS 协议中还提供了 Proxy (代理)模式,以适应更加高级、复杂的应用场景,具体介绍可以参考 CAS 官方网站上的相关文档。 + +## CAS中3个术语 + +Ticket Granting ticket (TGT) :可以认为是CAS Server根据用户名密码生成的一张票,存在Server端 + +Ticket-granting cookie (TGC) :其实就是一个Cookie,存放用户身份信息,由Server发给Client端 + +Service ticket (ST) :由TGT生成的一次性票据,用于验证,只能用一次。相当于Server发给Client一张票,然后Client拿着这个票再来找Server验证,看看是不是Server签发的。 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/formbased.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/formbased.md new file mode 100644 index 000000000..e8eed2343 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/formbased.md @@ -0,0 +1,43 @@ +--- +title: FormBased代填 +sidebar_position: 7 +--- + +## FormBased介绍 + +HTTP+HTML FormBased(基于表单)的认证,目前一般简单的基于表单的认证,是一种登录技术,即一个网站使用一个Web表单收集,并随后进行身份验证;认证的凭证信息来源于用户代理,通常web浏览器。 (请注意,短语“基于表单的认证”是不明确的。请参阅进一步解释基于表单的认证。) + +## 交互概要 + +该技术的实现步骤是: +
    +
  1. 一个未经身份验证的用户代理通过HTTP协议从网站请求一个网页。
  2. +
  3. 该网站返回一个HTML网页的未经验证的用户代理。该网页包含提示用户为他们的用户名和密码,以及标有“登录”或“提交”按钮基于HTML的Web表单最低限度。
  4. +
  5. 用户填写自己的用户名和密码,然后按下提交按钮。
  6. +
  7. 所述用户代理发送的web表单数据(包括用户名和密码)到Web服务器。
  8. +
  9. 网站实现中,Web服务器上运行时,执行对网络的形式的数据部分的验证和确认操作。如果成功,该网站考虑用户代理进行认证。
  10. +
+ +## 采纳建议 + +HTTP + HTML基于表单的认证,可以说是万维网上采用当今最流行的用户认证技术。几乎所有维基,论坛,银行/财经网站,电子商务网站,网络搜索引擎,门户网站,和其他常见的Web服务器应用程序都选择了这种认证技术。 + + +这种普及显然是由于网站管理员或他们的雇主想要细粒度地控制征求用户凭据的表现和行为,而默认弹出对话框(用于HTTP基本访问身份验证或摘要接入认证),许多Web浏览器提供不允许精确的剪裁。所需的精确度可以通过公司的要求(如品牌)或实施问题的动机(如网站之类的软件对于MediaWiki,phpBB的,Drupal的,WordPress的默认配置)。无论理由,任何企业品牌或用户体验的调整不能从这个认证过程的几个安全考虑分散。 + +## 安全方面注意事项 +
    +
  1. 用户凭据传递了密文到web网站,除非采取诸如就业传输层安全(TLS)的监听。
  2. +
  3. 该技术基本上是特设在于有效地没有任何用户代理和所述网络服务器之间的交互,除HTTP之外的与HTML本身是标准化。通过该网站所使用的实际的认证机制是,默认,未知的用户和用户代理。形式本身,包括可编辑字段的数量,和期望的内容物,完全实现和部署相关的。
  4. +
  5. 这种技术本身临时的,否则犯罪分子极易伪装成可信任方在认证过程中。
  6. +
+ +## 代码实现 + +```xml +
+ + + +
+``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/jwtintros.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/jwtintros.md new file mode 100644 index 000000000..ead48e1b5 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/jwtintros.md @@ -0,0 +1,139 @@ +--- +title: JWT协议 +sidebar_position: 4 +--- +## JSON Web Token介绍 + +JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地将信息作为JSON对象传输。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用HMAC算法)或使用RSAECDSA的公用/专用密钥对对JWT进行签名。 + +尽管可以对JWT进行加密以在各方之间提供保密性,但我们将重点关注已签名的令牌。签名的令牌可以验证其中包含的声明的完整性,而加密的令牌则将这些声明隐藏在其他方的面前。当使用公钥/私钥对对令牌进行签名时,签名还证明只有持有私钥的一方才是对其进行签名的一方。 + +扩展阅读参看:官方技术说明 JWT + +## 什么时候使用JSON Web Token + +以下是JSON Web令牌有用的一些情况: + +授权:这是使用JWT的最常见方案。一旦用户登录,每个后续请求将包括JWT,从而允许用户访问该令牌允许的路由,服务和资源。单一登录是当今广泛使用JWT的一项功能,因为它的开销很小并且可以在不同的域中轻松使用。 + +信息交换:JSON Web令牌是在各方之间安全地传输信息的好方法。因为可以对JWT进行签名(例如,使用公钥/私钥对),所以您可以确定发件人是他们所说的人。此外,由于签名是使用标头和有效负载计算的,因此您还可以验证内容是否遭到篡改。 + +## JSON Web Token结构 + +JSON Web Token以紧凑的形式由三部分组成,这些部分由点(.)分隔,分别是: + +Header(标头) + +Payload(有效载荷) + +Signature(签名) + +因此,JWT通常如下所示。 + +```json xxxxx.yyyyy.zzzzz``` + +让我们分解不同的部分。 + +### Header(标头) + +标头通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法,例如HMAC SHA256或RSA。 + +例如: + +```json +{ + "alg": "HS256", + "typ": "JWT" +} +``` + +然后,此JSON被Base64Url编码以形成JWT的第一部分。 + +### Payload(有效载荷) + +令牌的第二部分是有效负载,其中包含声明。声明是有关实体(通常是用户)和其他数据的声明。索赔有以下三种类型:注册的,公共的和私人索赔。 + +已注册的权利要求:这些是一组非强制性的但建议使用的预定义权利要求,以提供一组有用的,可互操作的权利要求。其中一些是: iss(发布者), exp(到期时间), sub(主题), aud(受众群体)等。 + +请注意,声明名称仅是三个字符,因为JWT是紧凑的。 + +公开声明:使用JWT的人员可以随意定义这些声明。但是为避免冲突,应在 IANA JSON Web令牌注册表中定义它们,或将其定义为包含抗冲突名称空间的URI。 + +私人权利:这些都是使用它们同意并既不是当事人之间建立共享信息的自定义声明注册或公众的权利要求。 + +有效负载示例可能是: +```json +{ + "sub": "1234567890", + "name": "John Doe", + "admin": true +} +``` +然后,对有效负载进行Base64Url编码,以形成JSON Web令牌的第二部分。 + +请注意,对于已签名的令牌,此信息尽管可以防止篡改,但任何人都可以读取。除非将其加密,否则请勿将机密信息放入JWT的有效负载或报头元素中。 + +### Signature(签名) + +要创建签名部分,您必须获取编码的标头,编码的有效载荷,机密,标头中指定的算法,并对其进行签名。 + +例如,如果要使用HMAC SHA256算法,则将通过以下方式创建签名: +```json +HMACSHA256( + base64UrlEncode(header) + "." + + base64UrlEncode(payload), + secret) +``` +签名用于验证消息在此过程中没有更改,并且对于使用私钥进行签名的令牌,它还可以验证JWT的发送者是它所说的真实身份。 + +### 结合一起 + +输出是三个由点分隔的Base64-URL字符串,可以在HTML和HTTP环境中轻松传递这些字符串,与基于XML的标准(例如SAML)相比,它更紧凑。 + +下面显示了一个JWT,它已对先前的标头和有效负载进行了编码,并用一个秘密进行了签名。 编码的JWT + +![jwt_encoded-jwt3](/images/jwt/encoded-jwt3.png) + +如果您想使用JWT并将这些概念付诸实践,则可以使用jwt.io Debugger解码,验证和生成JWT。JWT.io调试器 + +![jwt_legacy-app-auth-5](/images/jwt/legacy-app-auth-5.png) + +## JSON Web Token工作机制 + +在身份验证中,当用户使用其凭据成功登录时,将返回JSON Web令牌。由于令牌是凭据,因此必须格外小心以防止安全问题。通常,令牌的保留时间不应超过要求的时间。 + +由于缺乏安全性,您也不应该将敏感的会话数据存储在浏览器中。 + +每当用户想要访问受保护的路由或资源时,用户代理通常应使用授权AuthorizationBearer承载模式标头中发送JWT 。标头的内容应如下所示: +```json +Authorization: Bearer [token] +``` +在某些情况下,这可以是无状态授权机制。服务器的受保护路由将在Authorization标头中检查有效的JWT ,如果存在,则将允许用户访问受保护的资源。如果JWT包含必要的数据,则可以减少查询数据库中某些操作的需求,尽管这种情况并非总是如此。 + +如果令牌是在Authorization标头中发送的,则跨域资源共享(CORS)不会成为问题,因为它不使用cookie。 + +下图显示了如何获取JWT并将其用于访问API或资源: + +![jwt_grant](/images/jwt/client-credentials-grant.png) + +JSON Web令牌如何工作 + +应用程序或客户端向授权服务器请求授权。这是通过不同的授权流程之一执行的。例如,典型的符合OpenID Connect的 Web应用程序将/oauth/authorize使用授权代码流通过端点。 +授予授权后,授权服务器会将访问令牌返回给应用程序。 +该应用程序使用访问令牌来访问受保护的资源(例如API)。 +请注意,使用签名的令牌,令牌中包含的所有信息都会暴露给用户或其他方,即使他们无法更改它。这意味着您不应将机密信息放入令牌中。 + +## 如何使用JSON Web Token + +让我们谈谈与Simple Web Tokens(SWT)和Security Assertion Markup Language Tokens安全性声明标记语言令牌(SAML)相比,JSON Web Tokens(JWT)的优势。 + +由于JSON不如XML冗长,因此在编码时JSON的大小也较小,从而使JWT比SAML更为紧凑。这使得JWT是在HTML和HTTP环境中传递的不错的选择。 + +在安全方面,只能使用HMAC算法由共享机密对SWT进行对称签名。但是,JWT和SAML令牌可以使用X.509证书形式的公用/专用密钥对进行签名。与签名JSON的简单性相比,使用XML数字签名对XML进行签名而不引入模糊的安全漏洞是非常困难的。 + +JSON解析器在大多数编程语言中都很常见,因为它们直接映射到对象。相反,XML没有自然的文档到对象映射。与SAML断言相比,这使使用JWT更加容易。 + +关于用法,JWT是在Internet规模上使用的。这强调了在多个平台(尤其是移动平台)上对JSON Web令牌进行客户端处理的简便性。 + +![jwt_comparing-jwt-vs-saml2](/images/jwt/comparing-jwt-vs-saml2.png) +比较已编码的JWT和已编码的SAML的长度 编码的JWT和编码的SAML的长度比较 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/oauth2.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/oauth2.md new file mode 100644 index 000000000..5a4485699 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/oauth2.md @@ -0,0 +1,114 @@ +--- +title: OAuth2.0协议 +sidebar_position: 1 +--- +## 什么是OAuth2 + +OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。 + +OAuth2.0:对于用户相关的OpenAPI(例如获取用户信息,动态同步,照片,日志,分享等),为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显式的向用户征求授权。 + +采用OAuth2.0标准协议来进行用户身份验证和获取用户授权,相对于之前的OAuth1.0协议,其认证流程更简单和安全。 + +扩展阅读参看:OAuth标准(英文) | OAuth维基百科(中文) + +## 应用场景 + +第三方应用授权登录:在APP或者网页接入一些第三方应用时,时长会需要用户登录另一个合作平台,比如QQ,微博,微信的授权登录。 + +![oauth2qq](/images/oauth2/qq.jpg) + +原生app授权:app登录请求后台接口,为了安全认证,所有请求都带token信息,如果登录验证、请求后台数据。 + +前后端分离单页面应用(spa):前后端分离框架,前端请求后台数据,需要进行oauth2安全认证,比如使用vue、react后者h5开发的app。 + +## 名词定义 + +(1) Third-party application:第三方应用程序,本文中又称"客户端"(client),比如打开知乎,使用第三方登录,选择qq登录,这时候知乎就是客户端。 + +(2)HTTP service:HTTP服务提供商,本文中简称"服务提供商",即上例的qq。 + +(3)Resource Owner:资源所有者,本文中又称"用户"(user),即登录用户。 + +(4)User Agent:用户代理,本文中就是指浏览器。 + +(5)Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。 + +(6)Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。 + +## 运行流程 + +![oauth2flow](/images/oauth2/flow.jpg) + +(A)用户打开客户端以后,客户端要求用户给予授权。 + +(B)用户同意给予客户端授权。 + +(C)客户端使用上一步获得的授权,向认证服务器申请令牌。 + +(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。 + +(E)客户端使用令牌,向资源服务器申请获取资源。 + +(F)资源服务器确认令牌无误,同意向客户端开放资源。 + +## 四种授权模式 + +授权码模式(authorization code) + +简化模式(implicit) + +密码模式(resource owner password credentials) + +客户端模式(client credentials) + +### 授权码模式 + +授权码模式(authorization code)是功能最完整、流程最严密的授权模式。 +![oauth2_code](/images/oauth2/code.jpg) + +(1)用户访问客户端,后者将前者导向认证服务器,假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。 + +(2)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌:GET /oauth/token?response_type=code&client_id=test&redirect_uri=重定向页面链接。请求成功返回code授权码,一般有效时间是10分钟。 + +(3)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。POST /oauth/token?response_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=重定向页面链接。请求成功返回access Token和refresh Token。 + + +### 简化模式Implicit + +适用于公开的浏览器单页应用 + +![oauth2_implicit](/images/oauth2/implicit.jpg) + +Access Token直接从授权服务器返回(只有前端渠道) + +不支持refresh tokens + +假定资源所有者和公开客户应用在同一个设备上 + +最容易受安全攻击 + + +### 用户名密码 Resource Owner Credentials + +![oauth2_resource](/images/oauth2/resource.jpg) + +使用用户名密码登录的应用,例如桌面App + +使用用户名/密码作为授权方式从授权服务器上获取access token + +一般不支持refresh token + +假定资源拥有者和公开客户子啊相同设备上 + + +### 客户端凭证 Client Credentials + +![oauth2_client](/images/oauth2/client.jpg) + +适用于服务器见通信场景,机密客户代表它自己或者一个用户 + +只有后端渠道,使用客户凭证获取一个access token + +因为客户凭证可以使用对称或者非对称加密,该方式支持共享密码或者证书 + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/openid.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/openid.md new file mode 100644 index 000000000..77dde8893 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/openid.md @@ -0,0 +1,228 @@ +--- +title: OpenID Connect协议 +sidebar_position: 2 +--- +## OpenID Connect简介 +OpenID Connect是基于OAuth 2.0规范族的可互操作的身份验证协议。它使用简单的REST / JSON消息流来实现,和之前任何一种身份认证协议相比,开发者可以轻松集成。 + +OpenID Connect允许开发者验证跨网站和应用的用户,而无需拥有和管理密码文件。OpenID Connect允许所有类型的客户,包括基于浏览器的JavaScript和本机移动应用程序,启动登录流动和接收可验证断言对登录用户的身份。 + +扩展阅读参看:官方技术说明Connect标准(英文) | OpenID Connect维基百科(en) + + +## OpenID的历史是什么? +OpenID Connect是OpenID的第三代技术。首先是原始的OpenID,它不是商业应用,但让行业领导者思考什么是可能的。OpenID 2.0设计更为完善,提供良好的安全性保证。然而,其自身存在一些设计上的局限性,最致命的是其中依赖方必须是网页,但不能是本机应用程序;此外它还要依赖XML,这些都会导致一些应用问题。 + +OpenID Connect的目标是让更多的开发者使用,并扩大其使用范围。幸运的是,这个目标并不遥远,现在有很好的商业和开源库来帮助实现身份验证机制。 + +## OIDC基础 +简要而言,OIDC是一种安全机制,用于应用连接到身份认证服务器(Identity Service)获取用户信息,并将这些信息以安全可靠的方法返回给应用。 + +在最初,因为OpenID1/2经常和OAuth协议(一种授权协议)一起提及,所以二者经常被搞混。 + +OpenID是Authentication,即认证,对用户的身份进行认证,判断其身份是否有效,也就是让网站知道“你是你所声称的那个用户”; +OAuth是Authorization,即授权,在已知用户身份合法的情况下,经用户授权来允许某些操作,也就是让网站知道“你能被允许做那些事情”。 +由此可知,授权要在认证之后进行,只有确定用户身份只有才能授权。 +(身份验证)+ OAuth 2.0 = OpenID Connect + +OpenID Connect是“认证”和“授权”的结合,因为其基于OAuth协议,所以OpenID-Connect协议中也包含了client_id、client_secret还有redirect_uri等字段标识。这些信息被保存在“身份认证服务器”,以确保特定的客户端收到的信息只来自于合法的应用平台。这样做是目的是为了防止client_id泄露而造成的恶意网站发起的OIDC流程。 + +举个例子。某个用户使用Facebook应用“What online quiz best describes you?” ,该应用可以通过Facebook账号登录,则你可以在应用中发起请求到“身份认证服务器”(也就是Facebook的服务器)请求登录。这时你会看到如下界面,询问是否授权。 + +![openid_1](/images/openid/1.png) + +在OAuth中,这些授权被称为scope。OpenID-Connect也有自己特殊的scope--openid ,它必须在第一次请求“身份鉴别服务器”(Identity Provider,简称IDP)时发送过去。 + +## OIDC流程 +OAuth2提供了Access Token来解决授权第三方客户端访问受保护资源的问题;相似的,OIDC在这个基础上提供了ID Token来解决第三方客户端标识用户身份认证的问题。OIDC的核心在于在OAuth2的授权流程中,一并提供用户的身份认证信息(ID-Token)给到第三方客户端,ID-Token使用JWT格式来包装,得益于JWT(JSON Web Token)的自包含性,紧凑性以及防篡改机制,使得ID-Token可以安全的传递给第三方客户端程序并且容易被验证。应有服务器,在验证ID-Token正确只有,使用Access-Token向UserInfo的接口换取用户的更多的信息。 + +有上述可知,OIDC是遵循OAuth协议流程,在申请Access-Token的同时,也返回了ID-Token来验证用户身份。 + +### 相关定义 + +EU:End User,用户。 + +RP:Relying Party ,用来代指OAuth2中的受信任的客户端,身份认证和授权信息的消费方; + +OP:OpenID Provider,有能力提供EU身份认证的服务方(比如OAuth2中的授权服务),用来为RP提供EU的身份认证信息; + +ID-Token:JWT格式的数据,包含EU身份认证的信息。 + +UserInfo Endpoint:用户信息接口(受OAuth2保护),当RP使用ID-Token访问时,返回授权用户的信息,此接口必须使用HTTPS。 + +下面我们来看看OIDC的具体协议流程。 + +根据应用客户端的不同,OIDC的工作模式也应该是不同的。和OAuth类似,主要看是否客户端能保证client_secret的安全性。 + +如果是JS应用,其所有的代码都会被加载到浏览器而暴露出来,没有后端可以保证client_secret的安全性,则需要是使用默认模式流程(Implicit Flow)。 + +如果是传统的客户端应用,后端代码和用户是隔离的,能保证client_secret的不被泄露,就可以使用授权码模式流程(Authentication Flow)。 + +此外还有混合模式流程(Hybrid Flow),简而言之就是以上二者的融合。 + +OAuth2中还有口令模式和“应有访问模式”的方式来获取Access Token(关于OAuth2的内容,可以参见OAuth2.0 协议入门指南),为什么OIDC没有扩展这些方式呢? +"口令模式"是需要用户提供账号和口令给RP的,既然都已经有用户名和口令了,就不需要在获取什么用户身份了。至于“应有访问模式”,这种方式不需要用户参与,也就无需要认证和获取用户身份了。这也能反映授权和认证的差异,以及只使用OAuth2来做身份认证的事情是远远不够的,也是不合适的。 + +### 授权码模式流程 + +![openid_2](/images/openid/2.png) + +授权码模式流程 +和OAuth认证流程类似 + +RP发送一个认证请求给OP,其中附带client_id; + +OP对EU进行身份认证; + +OP返回响应,发送授权码给RP; + +RP使用授权码向OP索要ID-Token和Access-Token,RP验证无误后返回给RP; + +RP使用Access-Token发送一个请求到UserInfo EndPoint; UserInfo EndPoint返回EU的Claims。 + + +#### 基于Authorization Code的认证请求 +RP使用OAuth2的Authorization-Code的方式来完成用户身份认证,所有的Token都是通过OP的Token EndPoint(OAuth2中定义)来发放的。构建一个OIDC的Authentication Request需要提供如下的参数: + +scope:必须。OIDC的请求必须包含值为“openid”的scope的参数。 + +response_type:必选。同OAuth2。 + +client_id:必选。同OAuth2。 + +redirect_uri:必选。同OAuth2。 + +state:推荐。同OAuth2。防止CSRF, XSRF。 + +示例如下: + +```http +GET /authorize? + response_type=code + &scope=openid%20profile%20email + &client_id=s6BhdRkqt3 + &state=af0ifjsldkj + &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb HTTP/1.1 + Host: server.example.com +``` + +#### 基于Authorization Code的认证请求的响应 +在OP接收到认证请求之后,需要对请求参数做严格的验证,具体的规则参见http://openid.net/specs/openid-connect-core-1_0.html#AuthRequestValidation,验证通过后引导EU进行身份认证并且同意授权。在这一切都完成后,会重定向到RP指定的回调地址(redirect_uri),并且把code和state参数传递过去。比如: + +```http + HTTP/1.1 302 Found + Location: https://client.example.org/cb? + code=SplxlOBeZQQYbYS6WxSbIA + &state=af0ifjsldkj +``` + +#### 获取ID Token +RP使用上一步获得的code来请求Token EndPoint,这一步桶OAuth2,就不再展开细说了。然后Token EndPoint会返回响应的Token,其中除了OAuth2规定的部分数据外,还会附加一个id_token的字段。id_token字段就是上面提到的ID Token。例如: + +```json + HTTP/1.1 200 OK + Content-Type: application/json + Cache-Control: no-store + Pragma: no-cache + + { + "access_token": "SlAV32hkKG", + "token_type": "Bearer", + "refresh_token": "8xLOxBtZp8", + "expires_in": 3600, + "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ.ewogImlzc + yI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5 + NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZ + fV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5Nz + AKfQ.ggW8hZ1EuVLuxNuuIJKX_V8a_OMXzR0EHR9R6jgdqrOOF4daGU96Sr_P6q + Jp6IcmD3HP99Obi1PRs-cwh3LO-p146waJ8IhehcwL7F09JdijmBqkvPeB2T9CJ + NqeGpe-gccMg4vfKjkM8FcGvnzZUN4_KSP0aAp1tOJ1zZwgjxqGByKHiOtX7Tpd + QyHE5lcMiKPXfEIQILVq0pc_E2DzL7emopWoaoZTF_m0_N0YzFC6g6EJbOEoRoS + K5hoDalrcvRYLSrQAZZKflyuVCyixEoV9GfNQC3_osjzw2PAithfubEEBLuVVk4 + XUVrWOLrLl0nx7RkKU8NXNHq-rvKMzqg" + }``` + +其中看起来一堆乱码的部分就是JWT格式的ID-Token。在RP拿到这些信息之后,需要对id_token以及access_token进行验证(具体的规则参见http://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation和http://openid.net/specs/openid-connect-core-1_0.html#ImplicitTokenValidation)。至此,可以说用户身份认证就可以完成了,后续可以根据UserInfo EndPoint获取更完整的信息。 + +#### 安全令牌 ID-Token + +上面提到过OIDC对OAuth2最主要的扩展就是提供了ID-Token。下面我们就来看看ID-Token的主要构成: + +iss = Issuer Identifier:必须。提供认证信息者的唯一标识。一般是Url的host+path部分; + +sub = Subject Identifier:必须。iss提供的EU的唯一标识;最长为255个ASCII个字符; + +aud = Audience(s):必须。标识ID-Token的受众。必须包含OAuth2的client_id; + +exp = Expiration time:必须。ID-Token的过期时间; + +iat = Issued At Time:必须。JWT的构建的时间。 + +auth_time = AuthenticationTime:EU完成认证的时间。如果RP发送认证请求的时候携带max_age的参数,则此Claim是必须的。 + +nonce:RP发送请求的时候提供的随机字符串,用来减缓重放攻击,也可以来关联ID-Token和RP本身的Session信息。 + +acr = Authentication Context Class Reference:可选。表示一个认证上下文引用值,可以用来标识认证上下文类。 + +amr = Authentication Methods References:可选。表示一组认证方法。 + +azp = Authorized party:可选。结合aud使用。只有在被认证的一方和受众(aud)不一致时才使用此值,一般情况下很少使用。 + +```json +{ + "iss": "https://server.example.com", + "sub": "24400320", + "aud": "s6BhdRkqt3", + "nonce": "n-0S6_WzA2Mj", + "exp": 1311281970, + "iat": 1311280970, + "auth_time": 1311280969, + "acr": "urn:mace:incommon:iap:silver" + } +``` +另外ID Token必须使用JWT(JSON Web Token)进行签名和JWE(JSON Web Encryption)加密,从而提供认证的完整性、不可否认性以及可选的保密性。关于JWT的更多内容,请参看JSON Web Token - 在Web应用间安全地传递信息 + +### 默认模式流程 + +![openid_3](/images/openid/3.png) + +默认模式流程 +默认流程和OAuth中的类似,只不过也是添加了ID-Token的相关内容。 + +这里需要说明的是:OIDC的说明文档里很明确的说明了用户的相关信息都要使用JWT形式编码。在JWT中,不应该在载荷里面加入任何敏感的数据。如果传输的是用户的User ID。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。 + +但是现在工业界已经不推荐使用OAuth默认模式,而推荐使用不带client_Secret的授权码模式。 + +### 混合模式 +混合模式简而言之就是以上提到的两种模式的混合,不过也有一些小的改变,就是允许直接向客户端返回Access-Token。 + +业界普遍认为,后端传递Token(比如服务器之间通信)要比前端(比如页面之间)可靠,所以如果直接返回令牌的情况下会把令牌的过期时间设置较短,但是比较 + +UserInfo Endpoint +可能有的读者发现了,ID-Token只有sub是和EU相关的,这在一般情况下是不够的,必须还需要EU的用户名,头像等其他的资料,OIDC提供了一组公共的cliams,来提供更多用户的信息,这就是——UserIndo EndPoin。 + +在RP得到Access Token后可以请求此资源,然后获得一组EU相关的Claims,这些信息可以说是ID-Token的扩展,ID-Token中只需包含EU的唯一标识sub即可(避免ID Token过于庞大和暴露用户敏感信息),然后在通过此接口获取完整的EU的信息。此资源必须部署在TLS之上,例如: + +```http + GET /userinfo HTTP/1.1 + Host: server.example.com + Authorization: Bearer SlAV32hkKG +``` + +成功之后响应如下: + +```json + HTTP/1.1 200 OK + Content-Type: application/json + + { + "sub": "248289761001", + "name": "Jane Doe", + "given_name": "Jane", + "family_name": "Doe", + "preferred_username": "j.doe", + "email": "janedoe@example.com", + "picture": "http://example.com/janedoe/me.png" + } +``` +其中sub代表EU的唯一标识,这个claim是必须的,其他的都是可选的。 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/saml.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/saml.md new file mode 100644 index 000000000..7bba9fb9d --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/saml.md @@ -0,0 +1,89 @@ +--- +title: SAML2.0协议 +sidebar_position: 5 +--- +## SAML 介绍 + +SAML即安全断言标记语言,英文全称是Security Assertion Markup Language。它是一个基于XML的标准,用于在不同的安全域(security domain)之间用户身份验证和授权数据交换。在SAML标准定义了身份提供者(identity provider)和服务提供者(service provider),这两者构成了前面所说的不同的安全域。 SAML是OASIS组织安全服务技术委员会(Security Services Technical Committee)的产品。官方技术说明可参看OASIS Security Services (SAML) TC. + +使用SAML,在线服务供应商可以联系一个独立的网络身份认证提供者,谁是试图访问受保护的内容的用户进行身份验证。 + +联邦是指两个或更多可信的业务合作伙伴组成的团体,其遵照的业务和技术协议允许来自联邦合作伙伴(成员公司)的用户以一种安全可靠的方式,无缝地访问另一家合作伙伴的资源。在联邦业务模型中(其中,服务是联邦化的,或可以与业务合作伙伴共享),根据有关实体间达成的协议,一家公司的用户的身份将被转换,以合法访问另一家公司的Web站点,而另一家公司无需了解该用户的原始身份。 + + +IDP认证中心提供了一个基于SAML的单点登录(SSO)服务,作为身份提供者(Identity provider),控制用户名、密码和其他信息,用于识别,身份验证和授权用户的Web应用程序。 + +备注:SAML应用集成需完成应用集成申请,详见SAML相关内容。 + +通过SAML实现IDP 与其他合作伙伴的联邦身份认证。 + +## 流程说明图 + +![saml1](/images/saml/saml1.png) + +

SAML实现联邦身份认证各方职责

+ + + + + + + + + + + + + + + + + + + + +
IDP认证中心(Identity Provider/IDP)合作伙伴(Service Provider/SP)
用户身份认证安全断言判定
联邦身份安全断言联邦身份维护
用户账号管理服务提供和访问控制
+ + +IDP和SP预先完成证书的互信配置,SAML认证基于断言,断言基于证书的加密,传递过程是安全的,只有证书的持有者才能对断言进行解析 + +重要注意:SAML SSO解决方案仅适用于Web应用程序. + +扩展阅读参看:官方技术说明SAML标准(英文) | SAML维基百科(中文) + +## SP-Init SSO流程 + +![saml1](/images/saml/saml2.png) + + +用户试图访问IDP的合作伙伴应用。 + +合作伙伴应用生成一个SAML身份验证请求。SAML请求编码并嵌入到URL IDP的SSO服务。RelayState参数包含编码的合作伙伴应用程序,用户尝试访问的URL也被嵌入在SSO URL。这的RelayState参数,就是要一个不透明的标识符,不作任何修改或检查传回的。 + +合作伙伴发送重定向到用户的浏览器。重定向URL编码SAML身份验证请求的,应提交到IDP的SSO服务。 + +IDP的SAML请求进行解码,并提取两个谷歌的断言消费服务(ACS)和用户的目标URL(RelayState参数)的URL。 + +IDP的用户进行身份验证。IDP可以通过要求有效的登录凭据,或通过检查有效的会话对用户进行身份验证。 + +IDP生成一个SAML响应,其中包含身份验证的用户的用户名。按照SAML 2.0规范,这种反应是公共和私人合作伙伴的DSA / RSA密钥数字签名的 + +IDP SAML响应和RelayState参数进行编码,并将该信息返回到用户的浏览器。IDP提供了一种机制,使浏览器可以转发信息到合作伙伴的ACS。 + +合作伙伴的ACS使用IDP的公钥验证SAML响应。如果成功验证的响应,ACS将用户重定向的目标URL。 + +用户被重定向的目标URL,并记录在合作伙伴应用程序。 + +## IDP-Init SSO流程 + +![saml1](/images/saml/saml3.png) + +IDP的用户进行身份验证。IDP可以通过要求有效的登录凭据,或通过检查有效的会话对用户进行身份验证。 + +IDP生成一个SAML响应,其中包含身份验证的用户的用户名。按照SAML 2.0规范,这种反应是公共和私人合作伙伴的DSA / RSA密钥数字签名的。 + +IDP SAML响应和RelayState参数进行编码,并将该信息返回到用户的浏览器。IDP提供了一种机制,使浏览器可以转发信息到合作伙伴的ACS。 + +合作伙伴的ACS使用IDP的公钥验证SAML响应。如果成功验证的响应,ACS将用户重定向的目标URL。 + +用户被重定向的目标URL,并记录在合作伙伴应用程序。 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/tokenbased.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/tokenbased.md new file mode 100644 index 000000000..52ec64071 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/protocols/tokenbased.md @@ -0,0 +1,96 @@ +--- +title: TokenBased协议 +sidebar_position: 6 +--- +## TokenBased介绍 + +TokenBased(基于令牌)的认证,是一种简单的令牌的认证,即认证中心和应用共享凭证或者数字证书,认证中心使用HTTP POST的方式提交令牌到应用系统,应用系统并随后进行身份验证; + +## 交互概要 + +该技术的实现步骤是: +
    +
  1. 一个未经身份验证的用户通过浏览器访问应用系统。
  2. +
  3. 应用系统跳转到认证中心,请求认证。
  4. +
  5. 用户填写自己的用户名和密码,然后按下提交按钮。
  6. +
  7. 认证中心完成用户认证,生成令牌并提交到应用系统认证地址。
  8. +
  9. 应用系统使用共享凭证或者数字证书验证令牌,从令牌中获取用户认证信息。
  10. +
  11. 应用系统完成系统登录。
  12. +
+ +### 令牌加密或者签名方式 + +
    +
  1. 加密方式:DES、DESede、AES、Blowfish,默认采用DES。
  2. +
  3. 签名方式:服务端使用RSA数字证书私钥加密,客户端使用RSA数字证书公钥验证。
  4. +
+ +### 令牌格式 + +```json +{ + "randomId":"652ec5f5-fff2-4b8e-b88d-e7ff3a217bca", + "uid":"29e82574-b37a-46ab-bac1-5fecbd24b24b", + "username":"zhangs1020", + "email":"zhangs1020@connsec.com", + "windowsAccount":"ZHANGS1020", + "employeeNumber":"ZHANGS1020", + "departmentId":"1000212", + "department":"IT信息中心", + "displayName":"张三", + "at":"2015-03-11T15:17:03.855Z", + "expires":"2015-03-11T15:18:03.855Z" +} +``` + +randomId是即时生成的随机数
+at是当前认证的时间
+expires是过期的间隔
+其他的字段可在管理控制台配置 + +## 简单令牌 + +认证用户名@@认证时间(UTC时间),例如: + +```json +testUser@2010-01-01T01:01:01.001Z +``` + +### 令牌加密 + +加密步骤: +
    +
  1. 申请公共的秘钥。
  2. +
  3. 使用秘钥对产生的Token使用DES、DESede、AES、Blowfish进行加密,默认采用DES。
  4. +
  5. 对加密的数据进行BASE64URL编码。
  6. +
+ + +简单token加密结果:
+ +```json +Y00jv2TCCuk365uB2-nDCUdboygeYFoUfETC7BNXr73dQWwFNRrfYltczDQ5iWg8NTO-GsP--VlR6L-JyNhZSg +``` + +### 令牌签名 + +token的签名格式:BASE64URL(UTF8(data)).BASE64URL(UTF8(signature)),中间用"."分开,前半部分是数据,后半部分是签名书数据,例如:
+```json +eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk +``` + +## LTPA介绍 + +LTPA是Lightweight ThirdParty Authentication简称,轻量级第三方认证,支持在一个因特网域中的一组 Web 服务器之间使用单一登录的认证框架,即通过cookie来传输Token。 + +当服务器配置LTPA认证方式,用户通过浏览器成功登录,服务器会自动发送一个session cookie给浏览器,此cookie中包含一个加密和签名Security Token信息,应用服务器根据Security Token解析得到登录用户信息自动完成应用系统认证。 + +### 交互概要 + + 该技术的实现步骤是: +
    +
  1. 一个未经身份验证的用户通过浏览器访问应用系统,应用系统跳转到认证中心。
  2. +
  3. 认证中心完成用户登录,把Security Token发给浏览器,并跳转到应用系统。
  4. +
  5. 应用系统解析Security Token,得出用户登录信息。
  6. +
  7. 应用系统使用用户信息完成自身的登录。
  8. +
\ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/slo.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/slo.md new file mode 100644 index 000000000..6ff09497b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/slo.md @@ -0,0 +1,12 @@ +--- +sidebar_position: 2 +--- +# 单点注销 + +单点注销(Single Logout)是指用户在一个系统退出后,其所能单点登录访问的所有系统都同时退出。单点注销主要是为提高安全性,避免用户忘记退出所有应用而造成信息的泄密。 + + +IDP支持单点注销(SLO),即用户不仅仅从认证中心注销,同时也注销从认证中心访问的应用系统。 + + +其实现方式也非常简单,由于SSO和单点登录的应用都是分开的,使用不同的域名,只是通过认证中心在多个应用系统中传递身份和登录系统。因此,首先注销单点登录应用,然后修改每个应用系统都使用SSO的单点注销页面,SSO的退出页面会将用户登录的Session注销掉。 diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/sso.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/sso.md new file mode 100644 index 000000000..5cf8492b7 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/college/sso.md @@ -0,0 +1,29 @@ +--- +layout: zh/default +sidebar_position: 1 +--- +# 单点登录 + +单点登录(英语:Single sign-on,缩写为 SSO),中文译为单点登录,一种对于许多相互关连,但是又是各自独立的软件系统, 提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。 + + +## 介绍 +在日常生活中,很多人由于忘记某些网站的登录密码而烦恼,因为大多数用户都要记忆不少于10个用户名和相应密码。为了便于记忆,很多人都在不同的站点使用相同的用户名和密码,虽然这样可以减少负担,但是同时也降低了安全性,而且使用不同的站点同样要进行多次登录。同时,随着信息化飞速发展,大型企业和政府部门等都开始使用电子系统进行办公,而且整个办公系统由多个不同的子系统构成,如办公自动化(OA)系统,财务管理系统,档案管理系统,信息查询系统等。如果每个系统都使用独立的登录和验证机制,那么每天工作人员都要登录不同的系统进行办公。用户登录的频繁操作,降低了员工的工作效率,造成工作成本的浪费。而大量的密码和用户名的记忆时间长了也会出现问题,忘记密码或者混淆密码都会造成很大的麻烦。基于以上原因,为用户提供一个畅通的登录通道变得十分重要。 + + +单点登录(SingleSign-On,SSO)是一种帮助用户快捷访问网络中多个站点的安全通信技术。单点登录系统基于一种安全的通信协议,该协议通过多个系统之间的用户身份信息的交换来实现单点登录。使用单点登录系统时,用户只需要登录一次,就可以访问多个系统,不需要记忆多个口令密码。单点登录使用户可以快速访问网络,从而提高工作效率,同时也能帮助提高系统的安全性。 + + + +百度百科 :百度词条 + + +## 优势 + +用户只需登录一次,即可通过单点登录系统访问后台的多个 应用系统,二次登陆时无需重新输入用户名和密码。 + +减少了由登录产生的时间消耗,辅助了用户管理。 + +基于角色访问控制:根据用户的角色和URL实现访问控制功能 + +全面的日志审计:精确地记录用户的日志,可按日期、地址、用户、资源等信息对日志进行查询、统计和分析 diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/_category_.json new file mode 100644 index 000000000..01d9f33db --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "配置", + "position": 3, + "link": { + "type": "generated-index", + "description": "Configuration." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/captcha.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/captcha.md new file mode 100644 index 000000000..cfda3e2d0 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/captcha.md @@ -0,0 +1,188 @@ +--- +title: 图片验证码 +sidebar_position: 2 +--- +# 验证码 + +验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止用户用特定程序暴力破解方式进行不断的登陆尝试。 + + +## 文本验证码 + +![文本验证码](/images/authn/captcha_text.png) + + +## 算术验证码 + +![captcha_arithmetic](/images/authn/captcha_arithmetic.png) + +## 验证码配置 + +文件 +maxkey/application-https(http).properties + +当配置算术验证码时即 maxkey.login.captcha.type=arithmetic + +kaptcha的配置中必须为数字 + +kaptcha.textproducer.char.string=0123456789 + +```ini +#是否支持验证码 +maxkey.login.captcha=true +#text 文本, arithmetic 算术验证码 +maxkey.login.captcha.type=text +``` + +

验证码配置文件

+MaxKey使用kaptcha作为验证码的插件,详细可参考Kaptchar详细配置表 + +文件 +maxkey/kaptcha.properties + +默认配置如下 + +```ini +#宽度 +kaptcha.image.width=80 +#长度 +kaptcha.image.height=25 +kaptcha.border=no +kaptcha.obscurificator.impl=com.google.code.kaptcha.impl.ShadowGimpy +kaptcha.textproducer.font.size=23 +#生成字符,默认值为数字 +kaptcha.textproducer.char.string=0123456789 +#位数 +kaptcha.textproducer.char.length=4 +kaptcha.noise.impl=com.google.code.kaptcha.impl.NoNoise +``` + + + + +```ini +kaptcha.textproducer.char.string=0123456789 +``` + + +## Kaptchar详细配置表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Constant描述默认值
kaptcha.border图片边框,合法值:yes , noyes
kaptcha.border.color边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue.black
kaptcha.border.thickness边框厚度,合法值:>01
kaptcha.image.width图片宽200
kaptcha.image.height图片高50
kaptcha.producer.impl图片实现类com.google.code.kaptcha.impl.DefaultKaptcha
kaptcha.textproducer.impl文本实现类com.google.code.kaptcha.text.impl.DefaultTextCreator
kaptcha.textproducer.char.string文本集合,验证码值从此集合中获取abcde2345678gfynmnpwx
kaptcha.textproducer.char.length验证码长度5
kaptcha.textproducer.font.names字体Arial, Courier
kaptcha.textproducer.font.size字体大小40px.
kaptcha.textproducer.font.color字体颜色,合法值: r,g,b  或者 white,black,blue.black
kaptcha.textproducer.char.space文字间隔2
kaptcha.noise.impl干扰实现类com.google.code.kaptcha.impl.DefaultNoise
kaptcha.noise.color干扰 颜色,合法值: r,g,b 或者 white,black,blue.black
kaptcha.obscurificator.impl图片样式: 
水纹com.google.code.kaptcha.impl.WaterRipple 
鱼眼com.google.code.kaptcha.impl.FishEyeGimpy
阴影com.google.code.kaptcha.impl.ShadowGimpy
com.google.code.kaptcha.impl.WaterRipple
kaptcha.background.impl背景实现类com.google.code.kaptcha.impl.DefaultBackground
kaptcha.background.clear.from背景颜色渐变,开始颜色light grey
kaptcha.background.clear.to背景颜色渐变, 结束颜色white
kaptcha.word.impl文字渲染器com.google.code.kaptcha.text.impl.DefaultWordRenderer
kaptcha.session.keysession keyKAPTCHA_SESSION_KEY
kaptcha.session.datesession dateKAPTCHA_SESSION_DATE
\ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/druid_password.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/druid_password.md new file mode 100644 index 000000000..dddd20e66 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/druid_password.md @@ -0,0 +1,45 @@ +--- +title: Druid配置数据库加密 +sidebar_position: 9 +--- + +Druid 是一个 JDBC 组件库,包含数据库连接池、SQL Parser 等组件, 被大量业务和技术产品使用或集成,经历过最严苛线上业务场景考验,是你值得信赖的技术产品。 + +## 导入Druid依赖 +gradle.properties +``` +druidVersion =1.2.15 +druidspringbootstarterVersion =1.2.15 +``` + +build.gradle +``` +implementation group: 'com.alibaba', name: 'druid', version: "${druidVersion}" +implementation group: 'com.alibaba', name: 'druid-spring-boot-starter', version: "${druidspringbootstarterVersion}" +``` +版本根据实际情况进行更新,当前版本1.2.15 + +## 命令窗口中执行 + +```java +java -cp druid-1.2.15.jar com.alibaba.druid.filter.config.ConfigTools 数据库密码 +``` + +假设数据库密码是**maxkey**,命令如下 + +![druid_encrypt](/images/config/druid_encrypt.png) + +## 项目配置文件 +1、filters添加config + +2、配置解密,同时指定公钥 + +生成环境建议如下配置通过java-jar启动命令时指定spring.druid.publickey的值(java -jar xx.jar --spring.druid.publickey=公钥),避免通过yml获取到公钥,开发环境可将公钥配置在idea启动参数内。 + +```ini +spring.druid.publickey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIOu1Ew3t8xLDoaVs1byFllwf55yRqz1ekJviQ7wWsuYnOL4WWsIb7tUj9foiYt58kdua6rWcVBAsTjHHR4tLPECAwEAAQ== +spring.datasource.username=root +spring.datasource.password=F78ZV92w6MtSfMajYRqHDeorcColhpMiIokwfl2ecFLAhKS6gPMxzAEJgALtssonYNx0aDFQnQ0/ZjMhxeqL7w== +spring.datasource.filters=config +spring.datasource.connectionProperties=config.decrypt=true;config.decrypt.key=${spring.druid.publickey} +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/fgpwd.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/fgpwd.md new file mode 100644 index 000000000..24a80d9c8 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/fgpwd.md @@ -0,0 +1,34 @@ +--- +title: 忘记密码 +sidebar_position: 8 +--- +# 忘记密码 + +忘记密码一般都是通过2种方式找回:一种是通过预留电话号码发送验证码找回,另一个是通过设定邮箱找回。 + +## 重置密码步骤 + +主要步骤如下: + +1、在登录界面点击“忘记密码” + +![fgpwd-1](/images/authn/fgpwd-1.png) + +2、输入用户对应的邮箱或者手机号码,如果找到用户则发送邮件或者手机验证码 + +![fgpwd-2](/images/authn/fgpwd-2.png) + +3、重置密码,需要输入新的密码及验证码 +![fgpwd-3](/images/authn/fgpwd-3.png) + +4、重置成功,提示返回登录界面重新登录 + +![fgpwd-4](/images/authn/fgpwd-4.png) + +## 验证码 + +1、短信验证码 腾讯云短信/阿里云短信/网易云信/定制 + +2、电子邮件 + +![sms](/images/authn/sms.png) \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/google.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/google.md new file mode 100644 index 000000000..5011eb579 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/google.md @@ -0,0 +1,45 @@ +--- +title: 多因素认证 +sidebar_position: 3 +--- +# 多因素认证(MFA) + +双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统。双因素认证是一种采用时间同步技术的系统,采用了基于时间、事件和密钥三变量而产生的一次性密码来代替传统的静态密码。每个动态密码卡都有一个唯一的密钥,该密钥同时存放在服务器端,每次认证时动态密码卡与服务器分别根据同样的密钥,同样的随机参数(时间、事件)和同样的算法计算了认证的动态密码,从而确保密码的一致性,从而实现了用户的认证。就像我们去银行办卡送的口令牌. + +多因素认证(MFA),是一种计算机访问控制的方法,用户要通过两种以上的认证机制之后,才能得到授权,使用计算机资源。MFA的目的是建立一个多层次的防御,使未经授权的人访问计算机系统或网络更加困难,从而提高安全性。 + + +## TOTP或者HOTP支持 + +1、Google Authenticator + +2、Microsoft Authenticator + +3、FreeOTP + +4、支持TOTP或者HOTP协议 + + +优势:**使用简单、安全性高、低成本、无需携带额外设备** + + +## Google Authenticator支持 + +MaxKey支持谷歌验证器(Google Authenticator)双因素身份认证,步骤如下 + +1、下载Google Authenticator到手机 +![google1](/images/authn/google1.jpg) + + +2、登录到Maxkey,进入"安全设置"-->"时间令牌",如下图 + +![google2](/images/authn/google2.png) + +3、使用Google Authenticator扫描令牌的二维码 + +![google3](/images/authn/google3.jpg) + +4、退出MaxKey,进入到登录界面,"安全认证",输入用户名和密码,同时需要Google Authenticator产生的验证码登录,如下图 + +![google4](/images/authn/google4.png) + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/ha.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/ha.md new file mode 100644 index 000000000..9342755df --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/ha.md @@ -0,0 +1,112 @@ +--- +title: 高可用性 +sidebar_position: 1 +--- +# 高可用性 +High Availability + +## 通常架构 +Architecture +![微服务架构Microservice](/images/maxkey_ha.png) + +## 微服务架构 +Microservice Architecture + +![微服务架构Microservice](/images/maxkey_ha_micro.png) + + + +## 高可用性配置 + +### 环境准备 +准备两台服务器,并安装MaxKey + +### Redis缓存准备 + +安装Redis服务或者Redis集群 + +### 修改配置文件 +目录MaxKey-v*GA/maxkey/中以下文件 +``` +application-https(http).properties +``` +maxkey-web-maxkey*.jar中的 + +``` +application-https(http).properties。 +``` + +Redis配置 + +```ini +#redis +spring.redis.host=127.0.0.1 +spring.redis.port=6379 +spring.redis.password=password +spring.redis.timeout=10000 +spring.redis.jedis.pool.max-wait=1000 +spring.redis.jedis.pool.max-idle=200 +spring.redis.lettuce.pool.max-active=-1 +spring.redis.lettuce.pool.min-idle=0 +``` + +启动Sessions存储在Redis配置(v3.5.0之前版本) + +```ini +# Session store type. +spring.session.store-type=redis +# Session timeout. If a duration suffix is not specified, seconds is used. +server.servlet.session.timeout=1800 +# Sessions flush mode. +spring.session.redis.flush-mode=on_save +# Namespace for keys used to store sessions. +spring.session.redis.namespace=spring:session +``` + +### Nginx转发配置 + + 请参照Nginx官方网站完成配置 + + nginx-1.19.9关键转发配置如下 + +``` + #服务器的集群maxkeycluster ,weight是权重的意思,权重越大,分配的概率越大。 + upstream sso.maxkey.top{ + server 127.0.0.1:8080 weight=10; + #server 127.0.0.1:8082 weight=10; + ip_hash; + } + + server { + listen 443 ssl; + server_name localhost; + + ssl_certificate C:/IDES/nginx-1.19.9/maxkey.pem; + ssl_certificate_key C:/IDES/nginx-1.19.9/maxkey.key; + + ssl_session_cache shared:SSL:1m; + ssl_session_timeout 5m; + + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + + location / { + root html; + index index.html index.htm; + } + + #服务器集群路径 + location /maxkey/ { + proxy_pass http://sso.maxkey.top/maxkey/; + } + } +``` + + +### 证书签发 + +请参照如何用acme.sh申请证书 + +英文 + +中文 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/kerberos.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/kerberos.md new file mode 100644 index 000000000..c02b4f1fa --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/kerberos.md @@ -0,0 +1,19 @@ +--- +title: Kerberos认证 +sidebar_position: 6 +--- +# 基于Kerberos/SPNEGO/AD自动登录集成 + +MaxKey未提供基于Kerberos的认证,但是提供JWT的接入方式,可以通过Kerberos认证完成,然后使用JWT的实现MaxKey的自动登录。 + +建议参考 + +1)spring-security-kerberos的实现 + +https://github.com/spring-projects/spring-security-kerberos + +2)SPNEGO 实现 + +Integrated Windows Authentication and Authorization in Java + +http://spnego.sourceforge.net/ diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/ldap.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/ldap.md new file mode 100644 index 000000000..9dfb01716 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/ldap.md @@ -0,0 +1,11 @@ +--- +title: LDAP配置 +sidebar_position: 5 +--- +# LDAP登录集成 +MaxKey支持LDAP包括Active Directory、OpenLDAP和StandardLDAP(标准LDAP)。 + +管理系统 -> "配置管理" -> "LDAP配置" + +![ldap_config](/images/authn/ldap_config.png) + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/mfa.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/mfa.md new file mode 100644 index 000000000..96d7dfe5b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/mfa.md @@ -0,0 +1,18 @@ +--- +title: 双因素认证 +sidebar_position: 4 +--- +# 双因素认证(MFA) + +双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统。双因素认证是一种采用时间同步技术的系统,采用了基于时间、事件和密钥三变量而产生的一次性密码来代替传统的静态密码。每个动态密码卡都有一个唯一的密钥,该密钥同时存放在服务器端,每次认证时动态密码卡与服务器分别根据同样的密钥,同样的随机参数(时间、事件)和同样的算法计算了认证的动态密码,从而确保密码的一致性,从而实现了用户的认证。就像我们去银行办卡送的口令牌. + +多因素认证(MFA),是一种计算机访问控制的方法,用户要通过两种以上的认证机制之后,才能得到授权,使用计算机资源。MFA的目的是建立一个多层次的防御,使未经授权的人访问计算机系统或网络更加困难,从而提高安全性。 + + +## 双因素认证 + +1、短信认证 腾讯云短信/阿里云短信/网易云信/定制 + +2、电子邮件 + +![sms](/images/authn/sms.png) diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/social.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/social.md new file mode 100644 index 000000000..2c83cde31 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/conf/social.md @@ -0,0 +1,58 @@ +--- +title: 社交账号登录 +sidebar_position: 7 +--- +# 第三方账号登录 + +为了方便用户的登录,可以通过第三方的账号(例如新浪微博、微信、钉钉等)登录MaxKey,简单配置即可实现用户登录。 + +本文以新浪微博为例 + +![authn_s_1](/images/authn/authn_s_1.png) + +

登录流程

+ +![authn_s](/images/authn/authn_s.png) + +## 第三方认证配置 +在新浪微博开放平台https://open.weibo.com/申请接入,新浪配置如下 + +![authn_s_2](/images/authn/authn_s_2.png) + +![authn_s_3](/images/authn/authn_s_3.png) + +## 认证配置 +文件启用第三方登录启用 +maxkey/application-https(http).properties + +

+#enable social sign on
+maxkey.login.socialsignon=true
+
+ +## 后台参数配置 + +后台管理 -> "配置管理" ->"社交服务" +![authn_sa_1](/images/authn/authn_sa_1.png) + +选中 "微博" -> "编辑" ,微博的app key和app secret填入凭证和密钥 + +![authn_sa_2](/images/authn/authn_sa_2.png) + +## 账号绑定 +登录MaxKey,并绑定新浪微博账号 + +![authn_s_4](/images/authn/authn_s_4.png) + +## 登录测试 + +退出后,进入登录界面,点击新浪微博图标,跳转到新浪微博,输入用户名和密码后,直接登录MaxKey,即MaxKey信任了微博账号, + + +## 第三方支持 + +MaxKey使用JustAuth作为第三方OAuth2登录认证库,认证所支持的第三方,请见JustAuth官方说明 + + + + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/dev/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/dev/_category_.json new file mode 100644 index 000000000..139df6c57 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/dev/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "开发指南", + "position": 6, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important Docusaurus concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/dev/development.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/dev/development.md new file mode 100644 index 000000000..b4efcfbb1 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/dev/development.md @@ -0,0 +1,623 @@ +--- +layout: zh/default +--- +# 开发指南 + + + +## 开发工具及相关软件 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
软件版本备注
JDK1.8 +JAVA运行及开发工具包
Node.jsv 16.15.0 LTS +Node.js开发工具包
eclipse-jee2022-09 +推荐JAVA开发工具
Visual Studio CodeVersion 1.73.1 +推荐前端开发工具
MySQL8.0.21 +数据库服务器
Gradle7.5+ 代码构建
Tomcat/tomcat-embed9 +应用服务器(内置)
Kafka2.5.0 +用户生命周期管理同步消息中间件(可选)
RocketMQ4.9.0 +用户生命周期管理同步消息中间件(可选)
Redis6 +高速缓存内存数据库(可选)
OpenLDAP2.2 +企业目录服务器(可选)
+ +## 项目代码目录 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MaxKey一级目录二级目录三级目录说明
README.md关于MaxKey项目
LICENSEApache License v2许可证
NOTICEMaxKey版权声明
ReleaseNotes.txtGA版本发布记录描述
config构建方式配置Jar,Docker,Standard
maxkey-authentications登录认证
maxkey-authentication-captcha登录认证-验证码
maxkey-authentication-core登录认证-核心功能
maxkey-authentication-otp登录认证-令牌和一次性口令
maxkey-authentication-provider登录认证-认证服务
maxkey-authentication-social登录认证-社交账号
maxkey-common通用基础包和工具类
maxkey-core基础包
maxkey-identitys身份管理
maxkey-identity-restREST身份管理接口
maxkey-identity-scimSCIM2.0身份管理接口
maxkey-synchronizers身份同步器
maxkey-synchronizer同步器接口
maxkey-synchronizer-activedirectory微软Active Directory同步器
maxkey-synchronizer-feishu飞书同步器
maxkey-synchronizer-ldap标准LDAP同步器
maxkey-synchronizer-dingtalk钉钉同步器
maxkey-synchronizer-workweixin企业微信同步器
maxkey-lib使用jar包
maxkey-persistence数据库持久化和实时数据同步
maxkey-protocols认证协议实现
maxkey-protocol-authorize认证协议及单点注销实现
maxkey-protocol-casCAS认证协议实现
maxkey-protocol-extendapi扩展API实现
maxkey-protocol-formbasedFormbased实现,桌面认证实现开发浏览器插件实现
maxkey-protocol-jwtJWT实现
maxkey-protocol-oauth-2.0OAuth 2.x,OpenID Connect实现
maxkey-protocol-saml-2.0SAML 2.0实现
maxkey-protocol-tokenbasedtokenbased实现
maxkey-web-frontendweb前端
maxkey-web-app认证服务前端
maxkey-web-mgt-app管理服务前端
maxkey-websweb服务
maxkey-web-maxkey认证系统
maxkey-web-mgt管理系统
maxkey-gataway基于Spring Cloud套件的网关服务
shellscriptWindow和LINUX启动脚本
sql数据库MYSQL脚本,GA版本对应SQL
checkstyle编码规范配置
build.gradle默认工程构建及版本控制
build_cnf.gradle工程构建配置脚本
gradle.properties版本参数配置
settings.gradle项目引入
gradlegradle的配置
release.bat标准和Jar构建版本
release_docker.batdocker构建版本
setEnvVars.batJDK及Gradle路径配置,开发人员配置
release_cnf_docker.bat构建Docker配置
release_cnf_jar.bat构建Jar配置
release_cnf_standard.bat构建Standard配置
+ +## 开发环境启动 + +1)MaxKey统一认证系统 + +maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyApplication.java + +2)MaxKey身份安全管理系统 + +maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtApplication.java + +3)MaxKey统一认证前端 + +maxkey-web-frontend/maxkey-web-app +```powershell +yarn start +``` + +4)MaxKey身份安全管理前端 + +maxkey-web-frontend/maxkey-web-mgt-app +```powershell +yarn start +``` + +## 项目构建 + +### 标准构建 + +1.配置环境变量 +```powershell +setEnvVars.bat + +set JAVA_HOME=D:\JavaIDE\jdk1.8.0_91 + +set GRADLE_HOME=D:\IDE\gradle-7.2 +``` + +2.启动构建 + +```powershell +gradlew build -x test或者release.bat +``` + +3.构建结果 + +构建包路径 + +MaxKey/build/maxkey-jars + +依赖包路径 + +MaxKey/build/MaxKey-v(version)GA + + +### Docker构建 + +1.Docker 构建配置 + +```powershell +release_cnf_docker.bat +``` + +2.启动构建 + +```powershell +gradlew build jib -x test或者release_docker.bat +``` + +3.构建的结果 + +maxkey-web-manage/ + +maxkey-web-maxkey/ + + +### SpringBoot构建 + +1.SpringBoot Jar 构建配置 + +```powershell +release_cnf_jar.bat +``` + +2.启动构建 + +gradlew build -x test或者release.bat + + +3.构建的结果 + +maxkey-webs/maxkey-web-manage/ + +maxkey-webs/maxkey-web-maxkey/ + + + +### 前端构建Build + +1)MaxKey统一认证前端 + +maxkey-web-frontend/maxkey-web-app + +```powershell +ng build --prod --base-href /maxkey/ +``` + +2)MaxKey身份安全管理前端 + +maxkey-web-frontend/maxkey-web-mgt-app + +```powershell +ng build --prod --base-href /maxkey-mgt/ +``` + +## 问题及解决 + +``` +“A cycle was detected in the build path of project: XXX” +``` + +解决方法: + +Eclipse Menu -> Window -> Preferences... -> Java -> Compiler -> Building -> Building path problems -> Circular dependencies -> 将Error改成Warning + +问题2 + +``` +Access restriction +``` + +解决方案: + +Eclipse Menu -> Window -> Preferences... -> Java -> Compiler -> Errors/Warnings界面的Deprecated and restricted API下。把Forbidden reference (access rules): 的规则由默认的Error改为Warning即可。 + + +问题3 +```powershell + yarn start + ``` + +``` +CategoryInfo : SecurityError: ,PSSecurityException +FullyQualifiedErrorId : UnauthorizedAccess +``` + +解决方案: +```powershell +Set-ExecutionPolicy RemoteSigned -Scope Process +``` + + +

v3.3开发指南

\ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/dev/development_v3.3.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/dev/development_v3.3.md new file mode 100644 index 000000000..9f7c0ad3e --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/dev/development_v3.3.md @@ -0,0 +1,531 @@ +--- +layout: zh/default +--- +# 开发指南v3.3 + +## 开发工具及相关软件 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
软件版本备注
JDK1.8 +JAVA运行及开发工具包
eclipse-jee2021-09 +推荐JAVA开发工具
Gradle7.2+ 代码构建
Tomcat/tomcat-embed 9 +应用服务器
MySQL8.0.21 +数据库服务器
Kafka2.5.0 +用户生命周期管理同步中间件
Redis6 +高速缓存内存数据库
OpenLDAP2.2 +企业目录服务器
+ +## 项目代码目录 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MaxKey一级目录二级目录三级目录说明
README.md关于MaxKey项目
LICENSEApache License v2许可证
NOTICEMaxKey版权声明
ReleaseNotes.txtGA版本发布记录描述
config构建方式配置Jar,Docker,Standard
maxkey-authentications登录认证
maxkey-authentication-captcha登录认证-验证码
maxkey-authentication-core登录认证-核心功能
maxkey-authentication-otp登录认证-令牌和一次性口令
maxkey-authentication-social登录认证-社交账号
maxkey-common通用基础包和工具类
maxkey-core基础包
maxkey-identitys身份管理
maxkey-identity-restREST身份管理接口
maxkey-identity-scimSCIM2.0身份管理接口
maxkey-synchronizers身份同步器
maxkey-synchronizer同步器接口
maxkey-synchronizer-activedirectory微软Active Directory同步器
maxkey-synchronizer-feishu飞书同步器
maxkey-synchronizer-ldap标准LDAP同步器
maxkey-synchronizer-dingtalk钉钉同步器
maxkey-synchronizer-workweixin企业微信同步器
maxkey-lib使用jar包
maxkey-persistence数据库持久化和Kafka同步
maxkey-protocols认证协议实现
maxkey-protocol-authorize认证协议及单点注销实现
maxkey-protocol-casCAS认证协议实现
maxkey-protocol-extendapi扩展API实现
maxkey-protocol-formbasedFormbased实现,桌面认证实现开发浏览器插件实现
maxkey-protocol-jwtJWT实现
maxkey-protocol-oauth-2.0OAuth 2.x,OpenID Connect实现
maxkey-protocol-saml-2.0SAML 2.0实现
maxkey-protocol-tokenbasedtokenbased实现
maxkey-websweb服务
maxkey-boot-monitor基于Spring Boot Admin监控
maxkey-web-maxkey认证系统
maxkey-web-mgt管理系统
maxkey-web-resources静态资源
shellscriptWindow和LINUX启动脚本
sql数据库MYSQL脚本,GA版本对应SQL
checkstyle编码规范配置
build.gradle默认工程构建及版本控制
build_cnf.gradle工程构建配置脚本
gradle.properties版本参数配置
settings.gradle项目引入
gradlegradle的配置
release.bat标准和Jar构建版本
release_docker.batdocker构建版本
setEnvVars.batJDK及Gradle路径配置,开发人员配置
release_cnf_docker.bat构建Docker配置
release_cnf_jar.bat构建Jar配置
release_cnf_standard.bat构建Standard配置
eclipsePluginApply.bat设置IDE
+ +## 开发环境启动 + +MaxKey统一认证系统 + +maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyApplication.java + +MaxKey身份安全管理系统 + +maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtApplication.java + +## 项目构建 + +### 标准构建 + +1.配置环境变量 + +setEnvVars.bat + +set JAVA_HOME=D:\JavaIDE\jdk1.8.0_91 + +set GRADLE_HOME=D:\IDE\gradle-7.2 + + +2.启动构建 + +gradlew build -x test或者release.bat + + +3.构建结果 + +构建包路径 + +MaxKey/build/maxkey-jars + +依赖包路径 + +MaxKey/build/MaxKey-v(version)GA + + +### Docker构建 + +1.Docker 构建配置 + +release_cnf_docker.bat + +2.启动构建 + +gradlew build jib -x test或者release_docker.bat + +3.构建的结果 + +maxkey-web-manage/ + +maxkey-web-maxkey/ + + +### SpringBoot构建 + +1.SpringBoot Jar 构建配置 + +release_cnf_jar.bat + +2.启动构建 + +gradlew build -x test或者release.bat + + +3.构建的结果 + +maxkey-webs/maxkey-web-manage/ + +maxkey-webs/maxkey-web-maxkey/ + + + +## 问题及解决 +问题1 + +“A cycle was detected in the build path of project: XXX” + +解决方法: + +Eclipse Menu -> Window -> Preferences... -> Java -> Compiler -> Building -> Building path problems -> Circular dependencies -> 将Error改成Warning + +问题2 + +Access restriction + +解决方案: + +Eclipse Menu -> Window -> Preferences... -> Java -> Compiler -> Errors/Warnings界面的Deprecated and restricted API下。把Forbidden reference (access rules): 的规则由默认的Error改为Warning即可。 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/glossary.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/glossary.md new file mode 100644 index 000000000..5e1ce1a37 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/glossary.md @@ -0,0 +1,331 @@ +--- +sidebar_position: 11 +--- +# 词汇表 + +专业术语词汇表Glossary + +解释本文档所用到的专业术语。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
简称(ShortName)en(英文)zh(中文名称)
SSOSingle sign-on单点登录
IAMIdentity and Access Management身份识别与访问管理
IdMIdentity management身份管理
AMAccess Management访问管理
ACAccess control访问控制
FIdIdentity Federation联邦身份
FIdMFederated Identity Management联邦身份管理
AuthzAuthorization 授权
AuthnAuthentication认证
IDaasIdentity Management as a Service身份管理即服务
SAMLSecurity Assertion Markup Language安全断言标记语言
OAuthOAuth为用户资源的授权提供了一个安全的、开放而又简易的标准
OAuth 2.0OAuth 2.0OAuth1a的升级
OpenID Connect(OIDC)OpenID ConnectOpenID 的升级,基于OAuth 2.0
OpenIDOpenID 以用户为中心的数字身份识别框架,它具有开放、分散、自由等特性
CASCentral Authentication Service 中央认证服务,Yale 大学发起的一个开源项目
SCIMSystem for Cross-Domain Identity Management跨域系统身份管理
SPMLService Provisioning Markup Language服务供应标记语言
STSSecurity Token Service安全令牌服务
WS-SecurityWeb Services SecurityWeb服务安全
WS-FederationWeb Services Federation基于Web服务的联邦身份验证规范
TokenToken令牌
KerberosKerberos一种网络认证协议
CAPTCHACAPTCHA验证字/验证码
X.509X.509数字证书的格式
PKIPublic Key Infrastructure公钥基础设施
PMIPrivilege Management Infrastructure授权管理基础设施
RBACRole-Based Access Control基于角色的访问控制
ABACAttribute-Based Access Control基于属性的访问控制
PBACPolicy-Based Access Control基于策略的访问控制
XACMLXtensible Access Control Markup Language可扩展的访问控制标记语言
IdPIdentity Provider身份提供者
SPService Provider服务提供者
CPClaims Provider声明提供者/IdP
RPRelying Party依赖提供者/SP
Account ProvisioningAccount Provisioning账号供应
OTPOne Time Password一次性密码
TFATwo-Factor Authentication双因素认证
LDAPLightweight Directory Access Protocol轻量级目录访问协议
Directory ServiceDirectory Service目录服务
ADActive Directory微软活动目录
ADFSActive Directory Federation Services基于微软活动目录的联邦服务
XMPPExtensible Messaging and Presence Protocol可扩展消息处理现场协议
XKMSXML Key Management ServiceXML密钥管理服务
XDASDistributed Audit Service分布式审计服务
JDBCJava Database ConnectivityJava数据库连接
JNDIJava Naming and Directory InterfaceJava命名和目录接口
APIApplication Programming Interface应用程序编程接口
Web ServicesWeb ServicesWeb服务
SOAPSimple Object Access Protocol简单对象访问协议
WSDLWeb Services Description LanguageWeb服务描述语言
RESTRepresentational state transfer表征状态转移
RESTfulRESTful Web API一个使用HTTP并遵循REST原则的Web服务
HTTPHypertext Transfer Protocol超文本传输协议
HTTPSHypertext Transfer Protocol Secure安全HTTP
SMTPSimple Mail Transfer Protocol简单邮件传输协议
SDKSoftware Development Kit软件开发包
IDEIntegrated Development Environment集成开发环境
AdapterAdapter适配器,用于增强服务的功能,提供额外的服务
ConnectorConnector连接器,用于本地连接/同步数据到其他服务
HTTPHeaderHTTPHeaderHTTP请求头
JITJust-in-Time实时/即时
\ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/im/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/im/_category_.json new file mode 100644 index 000000000..5cc77c870 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/im/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "身份管理", + "position": 5, + "link": { + "type": "generated-index", + "description": "身份管理." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/im/connectors.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/im/connectors.md new file mode 100644 index 000000000..a927f208b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/im/connectors.md @@ -0,0 +1,96 @@ +--- +title: 身份连接器 +sidebar_position: 3 +--- +# 身份连接器 + +连接器把MaxKey的机构和账号同步到下游系统 + +## 连接器Connector + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
类型连接器官方地址
LDAPMicrosoft Active Directory
LDAPOpenLDAP
LDAPStandard LDAP Server
Instant Messenger企业微信
Instant Messenger钉钉
Instant Messenger飞书
Instant Messenger华为WeLink
SCIMSCIM 2
JDBClengleng/pig访问
JDBC若依/RuoYi访问
JDBC芋道源码/ruoyi-vue-pro访问
JDBC江离/Cloud-Platform访问
JDBCstylefeng/Guns访问
JDBCJEECG官方/jeecg-boot访问
JDBC小诺/Snowy访问
\ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/im/im.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/im/im.md new file mode 100644 index 000000000..a9adffffc --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/im/im.md @@ -0,0 +1,30 @@ +--- +title: 身份管理 +sidebar_position: 1 +--- +# 身份管理 + +## 身份管理是什么 +**帐户** + +计算机处理有关人的数据记录。此类记录包含为其创建和管理帐户的系统所需的技术信息。 + +**数字身份** + +由一个数字主体对其自身提出的一组主张的表现。 确认是你! + +您是否曾经被公司雇用,进入组织或刚刚创建了新的OA帐户?公司,组织和云实体使用需要您的数据才能正常运行的应用程序:用户名,密码,电子邮件,名字,姓氏等。 + +这些信息从哪里来?当需要启用更多应用程序时会发生什么?而且,如果您获得晋升并获得了已经可以访问的应用程序的更多权利该怎么办?最重要的是,当您退出或他们轻轻放开您时会发生什么? + +简而言之,身份管理在整个“ 身份生命周期”中负责管理身份数据 。 + + +![用户生命周期管理](/images/im/identityLifecycle.png) + +## 身份管理架构 + +基于**MQ(Message Queue消息中间件)**和MaxKey身份连接器(**Connector**)的管理架构 + +![身份管理架构](/images/im/maxkey_im.png) + diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/im/mgt_ui.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/im/mgt_ui.md new file mode 100644 index 000000000..34aa1ecf9 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/im/mgt_ui.md @@ -0,0 +1,19 @@ +--- +title: 身份管理UI +sidebar_position: 2 +--- + +# 管理界面 + +## 实时报表 + + +![实时报表](/images/maxkey_mgt_rpt.png) + +## 用户管理 + +![用户管理](/images/maxkey_mgt_users.png) + +## 应用管理 + +![用户管理](/images/maxkey_mgt_apps.png) diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/_category_.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/_category_.json new file mode 100644 index 000000000..2e29f7240 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "安装部署", + "position": 2, + "link": { + "type": "generated-index", + "description": "5 minutes to learn the most important Docusaurus concepts." + } +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_docker.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_docker.md new file mode 100644 index 000000000..5b7d9c535 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_docker.md @@ -0,0 +1,122 @@ +--- +title: Docker部署 +sidebar_position: 3 +--- +## 介绍 +Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。 + +本教程介绍在Docker中如何快速配置和部署MaxKey。 + +MaxKey官方镜像仓库:访问 + +## 前提条件 +在此之前请提前安装Docker + +## Docker部署 +LINUX 7 基于Docker部署 + +### 创建docker网络连接 + +```bash +docker network create maxkey.top +``` + +### Docker文件下载 + +把 https://gitee.com/dromara/MaxKey/tree/main/docker 或者https://github.com/dromara/MaxKey/tree/main/docker目录上传到/root目录下 + +### 启动MySQL服务 +```bash +docker pull mysql:8.0.27 + +docker run -p 3306:3306 \ +-v ./docker-mysql/data:/var/lib/mysql \ +-v ./docker-mysql/logs:/var/log/mysql \ +-v ./docker-mysql/conf.d:/etc/mysql/conf.d \ +-v ./docker-mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d \ +--name mysql \ +--hostname mysql \ +--network maxkey.top \ +-e MYSQL_ROOT_PASSWORD=maxkey \ +-d mysql:8.0.27 +``` + +### 启动MaxKey服务 + +请把DATABASE_HOST为实际地址 + +```bash +docker pull maxkeytop/maxkey:latest + +docker run -p 9527:9527 \ +-e DATABASE_HOST=mysql \ +-e DATABASE_PORT=3306 \ +-e DATABASE_NAME=maxkey \ +-e DATABASE_USER=root \ +-e DATABASE_PWD=maxkey \ +--name maxkey \ +--hostname maxkey \ +--network maxkey.top \ +-d maxkeytop/maxkey:latest +``` + +### 启动MaxKey管理服务 + +请把DATABASE_HOST为实际地址 + +```bash +docker pull maxkeytop/maxkey-mgt:latest + +docker run -p 9526:9526 \ +-e DATABASE_HOST=mysql \ +-e DATABASE_PORT=3306 \ +-e DATABASE_NAME=maxkey \ +-e DATABASE_USER=root \ +-e DATABASE_PWD=maxkey \ +--name maxkey-mgt \ +--hostname maxkey-mgt \ +--network maxkey.top \ +-d maxkeytop/maxkey-mgt:latest +``` + + +### 启动MaxKey认证前端服务 + +```bash +docker pull maxkeytop/maxkey-frontend:latest + +docker run -p 8527:8527 \ +--name maxkey-frontend \ +--hostname maxkey-frontend \ +--network maxkey.top \ +-d maxkeytop/maxkey-frontend:latest +``` + +### 启动MaxKey管理前端服务 + +```bash +docker pull maxkeytop/maxkey-mgt-frontend:latest + +docker run -p 8526:8526 \ +--name maxkey-mgt-frontend \ +--hostname maxkey-mgt-frontend \ +--network maxkey.top \ +-d maxkeytop/maxkey-mgt-frontend:latest +``` + + +### 启动MaxKey代理服务 + +进入docker-nginx + +```bash +cd docker-nginx + +docker build -f Dockerfile -t maxkeytop/maxkey-nginx . + +docker run -p 80:80 \ +--name maxkey-nginx \ +--hostname maxkey-mgt-frontend \ +--network maxkey.top \ +-d maxkeytop/maxkey-nginx +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_docker_compose.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_docker_compose.md new file mode 100644 index 000000000..a24d77a99 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_docker_compose.md @@ -0,0 +1,26 @@ +--- +title: Docker Compose部署 +sidebar_position: 2 +--- +## 介绍 +Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。 + +本教程介绍在Docker中如何快速配置和部署MaxKey。 + +MaxKey官方镜像仓库:访问 + +## 前提条件 +在此之前请提前安装Docker + +## Docker Compose部署 +LINUX 7 基于Docker Compose快速部署 + +### 上传Docker配置文件 + +把 https://gitee.com/dromara/MaxKey/tree/main/docker 或者https://github.com/dromara/MaxKey/tree/main/docker目录上传到/root目录下 + + +### 启动MaxKey服务 +```bash +docker-compose up --build -d +``` \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_docker_v3.3.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_docker_v3.3.md new file mode 100644 index 000000000..e72b51251 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_docker_v3.3.md @@ -0,0 +1,106 @@ +--- +title: Docker部署v3.3.x +sidebar_position: 7 +--- + +## 介绍 +Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。 + +本教程介绍在Docker中如何快速配置和部署MaxKey。 + +MaxKey官方镜像仓库:访问 + +## 前提条件 +在此之前请提前安装Docker + +## Docker部署 +LINUX 7 基于Docker部署 + +### 创建MySQL数据文件和日志文件目录 + +```bash +mkdir /root/mysql/data + +mkdir /root/mysql/logs +``` + +### Docker文件下载 + +把 https://gitee.com/dromara/MaxKey/tree/v3.3.x/docker 或者https://github.com/dromara/MaxKey/tree/v3.3.x/docker目录上传到/root目录下 + +### 启动MySQL服务 +```bash +docker pull mysql:8.0.27 + +docker run -p 3306:3306 \ +-v /root/mysql/data:/var/lib/mysql \ +-v /root/mysql/logs:/var/log/mysql \ +-v /root/docker-mysql:/etc/mysql/conf.d \ +-v /root/docker-mysql/sql:/docker-entrypoint-initdb.d \ +--name mysql \ +-e MYSQL_ROOT_PASSWORD=maxkey \ +-d mysql:8.0.27 +``` + +### 启动MaxKey服务 + +请把DATABASE_HOST为实际地址 + +```bash +docker pull maxkeytop/maxkey:3.3.3 + +docker run -p 443:443 \ +-e DATABASE_HOST=192.168.0.102 \ +-e DATABASE_PORT=3306 \ +-e DATABASE_NAME=maxkey \ +-e DATABASE_USER=root \ +-e DATABASE_PWD=maxkey \ +--name maxkey \ +-d maxkeytop/maxkey:3.3.3 +``` + +### 启动MaxKey管理服务 + +请把DATABASE_HOST为实际地址 + +```bash +docker pull maxkeytop/maxkey-mgt:3.3.3 + +docker run -p 9527:9527 \ +-e DATABASE_HOST=192.168.0.102 \ +-e DATABASE_PORT=3306 \ +-e DATABASE_NAME=maxkey \ +-e DATABASE_USER=root \ +-e DATABASE_PWD=maxkey \ +--name maxkey-mgt \ +-d maxkeytop/maxkey-mgt:3.3.3 +``` + +## Docker Compose快速部署 +LINUX 7 基于Docker Compose快速部署 + +### 创建MySQL数据文件和日志文件目录 + +```bash +mkdir /root/mysql/data + +mkdir /root/mysql/logs +``` + +### 上传并修改Docker配置文件 + +把 https://gitee.com/dromara/MaxKey/tree/v3.3.x/docker 或者https://github.com/dromara/MaxKey/tree/v3.3.x/docker目录上传到/root目录下 + +以下配置文件中DATABASE_HOST为实际地址 +```bash + docker-compose.yml + + docker-maxkey/Dockerfile + + docker-maxkey-mgt/Dockerfile +``` + +### 启动MaxKey服务 +```bash +docker-compose up --build -d +``` diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_linux.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_linux.md new file mode 100644 index 000000000..506fa6b0d --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_linux.md @@ -0,0 +1,259 @@ +--- +title: LINUX部署 +sidebar_position: 4 +--- + +# LINUX 7 版本 + +## JDK版本 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
推荐版本更新至地址
Oracle JDK 8December 2030访问
Eclipse Temurin 8December 2030访问
OracleJDK 17October 2029访问
Eclipse Temurin 17October 2029访问
+ +Oracle Java SE 支持路线图 + +## JDK 安装 + +### 下载地址 + +Eclipse Temurin 8 x64 RPM Package + +假设当前安装目录/root + +```bash +curl -L "https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u332-b09/OpenJDK8U-jdk_x64_linux_hotspot_8u332b09.tar.gz" -H "Cookie: oraclelicense=accept-securebackup-cookie" -H "Connection: keep-alive" -O +``` + +### 解压缩及安装 + +```bash +tar -zxf OpenJDK8U-jdk_x64_linux_hotspot_8u332b09.tar.gz +``` + +完成后本地目录 + +``` +jdk8u332-b09 +``` + +## 安装配置MySQL 8.0 + +### 安装MySQL 8.0 +假如本地安装过mariadb,请先卸载 + +#### 安装MySQL官方的yum repository + +```bash +curl -L "https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm" -O +``` + +#### 下载rpm包: + +```bash +yum -y install mysql80-community-release-el7-3.noarch.rpm +``` + +#### 安装MySQL服务 + +```bash +yum -y install mysql-community-server +``` + +#### 安装MySQL问题 + +``` +Failing package is: mysql-community-libs-compat-8.0.28-1.el7.x86_64 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql +``` + +解决方案 + +```bash +rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 +``` + +### 调整配置 + +编辑 /etc/my.cnf 文件 + +```ini +character-set-server=utf8 +lower_case_table_names=1 +``` + +### 启动mysql服务 +```bash + systemctl start mysqld + + --停止 + + systemctl stop mysqld --无需执行 +``` + +### 登录MySQL + + 第一次启动MySQL后,就会有临时密码,这个默认的初始密码在/var/log/mysqld.log文件中,我们可以用这个命令来查看: + +```bash + grep "password" /var/log/mysqld.log +``` + +### 设置访问权限及密码 +```bash + +mysql -u root -p; + +输入密码 + +``` + +```sql +--以下步骤可能要求先修改初始化密码为复杂密码 SET PASSWORD = 'UDF(ez/8Lufi'; + +set global validate_password.policy=0; --改变密码等级 + +set global validate_password.length=4; --改变密码最小长度 + +SET PASSWORD = 'maxkey'; + +use mysql; + +alter user 'root'@'localhost' identified with mysql_native_password by 'maxkey'; + +flush privileges ; + +---修改root用户的访问权限为‘%’ + +update user set host='%' where user='root'; + +flush privileges ; + +``` + +### 设置开机启动 + +``` +chkconfig --add mysqld +chkconfig mysqld on +``` + +查看开机启动设置是否成功 + +``` + chkconfig --list | grep mysql* + + # mysqld 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭停止 +``` + + +## MaxKey安装 + +### 把MaxKey上传到Linux服务器 + +### 数据导入 + +MaxKey对应的版本SQL文件,参见 + +https://gitee.com/dromara/MaxKey/tree/master/sql/v3.5.0.ga/ + +登陆LINUX MYSQL并创建schema maxkey,字符集utf8,数据文件导入到maxkey schema中, + +```bash + +mysql -u root -p; + +输入密码 +``` + +```sql +CREATE DATABASE IF NOT EXISTS `maxkey` /*!40100 DEFAULT CHARACTER SET utf8 */ /*!80016 DEFAULT ENCRYPTION='N' */; + +USE `maxkey`; + +-- 使用source命令,后面参数为脚本文件(如这里用到的.sql),其中v3.5.0是对应的版本号 + +source your sql path/maxkey_v3.5.0.GA.sql; + +source your sql path/maxkey_v3.5.0.GA_data.sql + +``` + + +### 配置hosts + +hosts配置文件目录 + +``` +vi /etc/hosts +``` + +新增如下内容 + +``` +127.0.0.1 sso.maxkey.top +127.0.0.1 mgt.maxkey.top +127.0.0.1 tokenbased.demo.maxkey.top +127.0.0.1 cas.demo.maxkey.top +127.0.0.1 oauth.demo.maxkey.top +``` + +### 启动 + +修改set_maxkey_env.sh以下参数,/root/为安装路径 + +``` +JAVA_HOME=/root/jdk8u332-b09 + +export JAVA_HOME=/root/jdk8u332-b09 +``` + + +```bash + ./start_maxkey_db.sh & #自行编写 + + ./start_maxkey.sh & + + ./start_maxkey_mgt.sh & + + ./start_maxkey_demo.sh & +``` + +## 前端服务部署 + +安装nginx,参考windows版本配置,再把windows版本前端文件放入对应的nginx目录下 + +## 代理服务部署 + +安装nginx,参考windows版本的代理配置 diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_rainbond.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_rainbond.md new file mode 100644 index 000000000..c233246cd --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_rainbond.md @@ -0,0 +1,72 @@ +--- +title: Rainbond快速部署 +sidebar_position: 6 +--- + +## Rainbond简介 + +[Rainbond](https://github.com/goodrain/rainbond) 是云原生且易用的云原生应用管理平台。云原生应用交付的最佳实践,简单易用。专注于以应用为中心的理念。赋能企业搭建云原生开发云、云原生交付云。 + +**对于企业:** Rainbond 是开箱即用的云原生平台,借助 Rainbond 可以快速完成企业研发和交付体系的云原生转型。 + +**对于开发者:** 基于 Rainbond 开发、测试和运维企业业务应用,开箱即用的获得全方位的云原生技术能力。包括但不仅限于持续集成、服务治理、架构支撑、多维度应用观测、流量管理。 + +**对于项目交付:** 基于 Rainbond 搭建产品版本化管理体系,搭建标准化客户交付环境,使传统的交付流程可以自动化、简单化和可管理。 + +Rainbond 帮助企业解决如下四类应用管理场景: + +**云原生应用研发与组装** —〉**应用模型分发** —〉**应用模型安装/升级** —〉**应用智能运维** + +> 它非常适合 2B 软件厂商和行业集成商使用,也适合中小型 2C 软件厂商。 + +## 通过Rainbond应用商店快速安装MaxKey + +* 在开源应用商店中搜索 `MaxKey`,点击安装 + +![image-20210924143027246](https://i.loli.net/2021/09/24/oi8G2eVf1B97UDP.png) + +* 部署完成后的拓扑图 + +* maxkey-web-maxkey 是认证服务 + +* maxkey-web-mgt 是管理服务 + + > 账号密码均是:admin maxkey + +![image-20210924143842909](https://i.loli.net/2021/09/24/xbdDGjAIvuVMXOf.png) + +## MaxKey能做什么 + +* MaxKey是认证平台,可将公司内部的服务平台对接至MaxKey,进行统一登录。比如可以将公司内部的 `GitLab` `禅道` `Jenkins` 等支持单点登录协议的服务平台。 +* 本文将通过对接 `禅道` 实现统一登录。 + +### 通过Rainbond应用商店快速安装禅道 + +* 在开源应用商店中搜索 `禅道`,点击进行安装。 + +![image-20210924145650319](https://i.loli.net/2021/09/24/3VeDYIg6nm5lGrx.png) + +* 安装完成后,访问 [禅道 ](https://www.zentao.net/book)进行初始化设置。 + + > Mysql密码在组件的依赖中获取。 + +* 进入禅道后,点击 后台 > 二次开发 > 应用 > 添加应用。 + * 名称:自定义 + * 代号:maxkey + * 免密登录:开启 + * IP:无限制 + +### 配置MaxKey实现统一登录 + +* 进入MaxKey管理服务中,进入应用管理页,编辑 `禅道项目管理`,进入编辑页面。 +* 需修改: + * 登录地址:禅道登录地址 + * 秘钥:填写上一步在禅道中添加应用时的秘钥 + + + +![image-20210924151018815](https://i.loli.net/2021/09/24/EfArgPO168YmMzS.png) + +* 进入 MaxKey认证服务中,点击`禅道项目管理`,即可跳转至禅道页面并自动登录。 + +![maxkey-zentao](https://static.goodrain.com/images/maxkey-zentao.gif) diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_windows.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_windows.md new file mode 100644 index 000000000..4aa3804db --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/deploy_windows.md @@ -0,0 +1,222 @@ +--- +title: Windows部署 +sidebar_position: 5 +--- + +# 介绍 + +为了你更好的使用 MaxKey,本教程介绍在 Windows 中如何快速配置和使用 MaxKey。 + +## 软件下载 +访问下载MaxKey并解压到C:盘。 + +## 目录结构 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号目录/文件备注
1MaxKey单点登陆认证系统介绍-CE-***.pdf系统介绍
2getting-started.html快速使用文档
3LICENSE许可证
4NOTICE许可证NOTICE
5jdk/jre运行时JDK
6lib公共包
7maxkey认证服务,端口9527
8maxkey_frontend认证前端服务,端口8527
9maxkey_mgt管理服务,端口9526
10maxkey_mgt_frontend管理前端服务,端口8526
11nginx-1.20.1-proxynginx反向代理服务,端口80
12mysql_***MySQL数据库,端口3306
13maxkey_demo样例,端口9521
14start_maxkey.bat启动认证服务器
15start_maxkey_frontend.bat启动认证前端服务器
16start_maxkey_mgt.bat启动管理服务器
17start_maxkey_mgt_frontend.bat启动管理前端服务器
18start_maxkey_db.bat启动数据库
19start_maxkey_proxy.bat启动代理服务器
20start_maxkey_demo.bat启动样例
21set_maxkey_env.bat环境设置脚本
+ +## 安装部署 + +### 配置 +hosts配置文件目录 +``` +C:\Windows\System32\drivers\etc +``` +新增如下内容 +``` +127.0.0.1 sso.maxkey.top +127.0.0.1 mgt.maxkey.top +127.0.0.1 tokenbased.demo.maxkey.top +127.0.0.1 cas.demo.maxkey.top +127.0.0.1 oauth.demo.maxkey.top +``` + +### 服务启动 +1)启动数据库 +```bash +start_maxkey_db.bat +``` + +2)启动认证服务 + +```bash +start_maxkey.bat +``` + +3)启动管理服务 + +``` +start_maxkey_mgt.bat +``` + +4)启动认证前端服务 + +``` +start_maxkey_frontend.bat +``` + +5)启动管理前端服务 + +``` +start_maxkey_mgt_frontend.bat +``` + +6)启动代理 + +``` +start_maxkey_proxy.bat +``` + +7)启动样例 + +``` +start_maxkey_demo.bat +``` + +### 应用访问 + +在完成安装部署后,打开浏览器,访问以下地址 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号名称访问地址
1认证平台http://sso.maxkey.top/maxkey/
2管理平台http://mgt.maxkey.top/maxkey-mgt/
3集成指南http://doc.maxkey.top/
4账户密码admin/maxkey
diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/tutorial.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/tutorial.md new file mode 100644 index 000000000..f26c23ee2 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/install/tutorial.md @@ -0,0 +1,219 @@ +--- +title: 快速使用 +sidebar_position: 1 +--- +# 介绍 +为了你更好的使用MaxKey,本教程介绍在Windows中如何快速配置和使用MaxKey。 + +## 软件下载 +访问下载MaxKey并解压到C:盘。 + +## 目录结构 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号目录/文件备注
1MaxKey单点登陆认证系统介绍-CE-***.pdf系统介绍
2getting-started.html快速使用文档
3LICENSE许可证
4NOTICE许可证NOTICE
5jdk/jre运行时JDK
6lib公共包
7maxkey认证服务,端口9527
8maxkey_frontend认证前端服务,端口8527
9maxkey_mgt管理服务,端口9526
10maxkey_mgt_frontend管理前端服务,端口8526
11nginx-1.20.1-proxynginx反向代理服务,端口80
12mysql_***MySQL数据库,端口3306
13maxkey_demo样例,端口9521
14start_maxkey.bat启动认证服务器
15start_maxkey_frontend.bat启动认证前端服务器
16start_maxkey_mgt.bat启动管理服务器
17start_maxkey_mgt_frontend.bat启动管理前端服务器
18start_maxkey_db.bat启动数据库
19start_maxkey_proxy.bat启动代理服务器
20start_maxkey_demo.bat启动样例
21set_maxkey_env.bat环境设置脚本
+ +## 配置hosts + +hosts配置文件目录 + +``` +C:\Windows\System32\drivers\etc +``` + +新增如下内容 + +``` +127.0.0.1 sso.maxkey.top +127.0.0.1 mgt.maxkey.top +127.0.0.1 tokenbased.demo.maxkey.top +127.0.0.1 cas.demo.maxkey.top +127.0.0.1 oauth.demo.maxkey.top +``` + +## 服务启动 +1)启动数据库 + +``` +start_maxkey_db.bat +``` + +2)启动认证服务 + +``` +start_maxkey.bat +``` + +3)启动管理服务 + +``` +start_maxkey_mgt.bat +``` + +4)启动认证前端服务 + +``` +start_maxkey_frontend.bat +``` + +5)启动管理前端服务 + +``` +start_maxkey_mgt_frontend.bat +``` + +6)启动代理 + +``` +start_maxkey_proxy.bat +``` + +7)启动样例 + +``` +start_maxkey_demo.bat +``` + +## 应用访问 +在完成安装部署后,打开浏览器,访问以下地址 + + + + + + + + + + + + + + + + + + + + + + + +
序号名称访问地址
1认证平台http://sso.maxkey.top/maxkey/
2管理平台http://mgt.maxkey.top/maxkey-mgt/
3账户密码admin/maxkey
+ +## Docker Compose部署 + +Docker Compose部署 diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/intro.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/intro.md new file mode 100644 index 000000000..b669a71cb --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/intro.md @@ -0,0 +1,156 @@ +--- +title: MaxKey概述 +sidebar_position: 1 +--- + +## MaxKey概述 +MaxKey单点登录认证系统,谐音为马克思的钥匙寓意是最大钥匙,是业界领先的IAM身份管理和认证产品;支持OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM等标准协议;提供安全、标准和开放的用户身份管理(IDM)、身份认证(AM)、单点登录(SSO)、资源管理和权限管理等。 + +官方QQ:1054466084 + +邮箱EMAIL: support@maxsso.net +
+ +代码托管 GitHub | 码云(Gitee) +
+ + +>**单点登录(Single Sign On)**简称为**SSO** +> +>用户只需要登录认证中心一次就可以访问所有相互信任的应用系统,无需再次登录,主要功能: +> +>1.所有应用系统共享一个身份认证系统 +> +>2.所有应用系统能够识别和提取ticket信息 + + + +## 标准协议 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号协议支持
1 OAuth 2.x/OpenID Connect
2 SAML 2.0
3 JWT
4 CAS
5 FormBased
6 TokenBased(Post/Cookie)
7 ExtendApi
8 EXT
+ + + +## 登录支持 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号登录方式类型
1 图片验证码字母/数字/算术
2 双因素认证 短信或者邮件动态验证码
3 短信认证腾讯云短信/阿里云短信/网易云信
4 TOTP或者HOTP动态口令Google/Microsoft Authenticator/FreeOTP/支持TOTP或者HOTP
5 Windows域认证Kerberos/SPNEGO/AD域
6 LDAP认证OpenLDAP/ActiveDirectory/标准LDAP服务器
7 社交账号微信/QQ/微博/钉钉/Google/Facebook/其他
8 扫码登录企业微信/钉钉/飞书扫码登录
+ + + +## 优势 + +1. 提供标准的认证接口以便于其他应用集成SSO,安全的移动接入,安全的API、第三方认证和互联网认证的整合。 + +2. 提供用户生命周期管理,支持SCIM 2协议;开箱即用的连接器(Connector)实现身份供给同步。 + +3. 简化微软Active Directory域控、标准LDAP服务器机构和账号管理,密码自助服务重置密码。 + +4. 认证多租户功能,支持集团下多企业独立管理或企业下不同部门数据隔离的,降低运维成本。 + +5. 认证中心具有平台无关性、环境多样性,支持Web、手机、移动设备等, 如Apple iOS,Andriod等,将认证能力从B/S到移动应用全面覆盖。 + +6. 基于Java EE平台,微服务架构,采用Spring、MySQL、Tomcat、Redis、MQ等开源技术,扩展性强。 + +7. 开源、安全、自主可控,许可证 Apache 2.0 License & MaxKey版权声明。 + + +## 最有价值开源项目 + + \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/sso_safety.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/sso_safety.md new file mode 100644 index 000000000..3936e758f --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/sso_safety.md @@ -0,0 +1,130 @@ +--- +title: 系统安全性 +sidebar_position: 8 +--- + +# 系统安全性 + +![安全性](/images/authn/safety.png) + +## 二次密码登录 + +单点登录使用户能在一个入口完成登录后,一般情况下用户在点击应用图标时,直接通过相应的协议,登录到应用系统;但是有时要针对特定的用户、特定的应用进行二次密码校验的功能,防止关键系统的登录,导致的信息敏感泄露,比如财务系统或者个人工资账单,在实际工作中经常出现工作代理的情况,即使出现单点登录的密码泄露,二次密码也很好地保护敏感应用系统; + +## 单点退出 + +单点退出是指用户在一个系统退出后,其所能单点登录访问的所有系统都同时退出。单点退出主要是为提高安全性,避免用户忘记退出所有应用而造成信息的泄密。 +其实现方式也非常简单,由于SSO和单点登录的应用都是分开的,使用不同的域名,只是通过认证协议帮助用户在多个应用系统中传递身份和登录系统。因此,首先注销单点登录应用,然后修改每个应用系统都使用MaxKey的单点退出页面,单点登录的退出页面会将用户登录的Session注销掉。 + +## 会话超时设计 + +为节约服务端资源,并基于安全性考虑,对于长时间没有活动的客户端其会话将被自动终结。同时,为保证用户的单点登录不受影响,其所有超时都在MaxKey端集中控制,即MaxKey的会话超时时间比集成的应用系统会话超时时间略长。例如希望实现用户不活动30分钟就终止会话,则将MaxKey的不活动超时时间设置成30分钟,集成应用的不活动超时时间设置成40分钟。 +如果用户登录后打开多个应用,并一直只访问某个应用,而其他应用长时间没有被访问导致应用会话超时,用户再次点击该已超时的应用时,用户会被应用要求重新登录。为避免这种情况,应用检测到用户会话超时后需将用户重定向到登录页面,MaxKey此时再次实现单点登录,登录成功后应用可重新将用户定向到期之前访问的URL或者该应用的首页。 + +## 防暴力破解 + +由于认证系统需对互联网提供服务,为避免互联网中恶意的暴力破解,系统需提供防暴力破解能力。防暴力破解的关键是提供一种机制,能阻止计算机用穷举法试探用户口令。 +目前一种广泛使用的防暴力破解技术是CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart),即在登录界面除用户名+口令之外再增加一个扭曲的数字或字母字段,让用户输入,这种字段人很容易看懂,但是计算机却很难识别,从而避免计算机用穷举法猜测用户密码,这种技术的应用在互联网应用上经常可以看到。 + +## 连续登陆次失败策 + +使用连续多次登录失败即锁定帐号一定时间的设置,例如如果某个帐号连续6次登录失败就锁定该帐号两小时,这种方式也可以避免暴力破解。 + +## 静态密码策略 + +对密码进行限制无非是为了强制用户设置一个更加安全的密码,密码策略主要有以下几种: + +(1)密码必须符合复杂性要求 + +(2)密码长度最小值 + +(3)密码最长使用期限 + +(4)密码最短使用期限 + +(5)强制密码历史 + +(6)使用可还原的加密存储密码 + +## 双因素身份认证 + +双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统。双因素认证是一种采用时间同步技术的系统,采用了基于时间、事件和密钥三变量而产生的一次性密码来代替传统的静态密码。每个动态密码卡都有一个唯一的密钥,该密钥同时存放在服务器端,每次认证时动态密码卡与服务器分别根据同样的密钥,同样的随机参数(时间、事件)和同样的算法计算了认证的动态密码,从而确保密码的一致性,从而实现了用户的认证。就像我们去银行办卡送的口令牌. +多因素认证(MFA),是一种计算机访问控制的方法,用户要通过两种以上的认证机制之后,才能得到授权,使用计算机资源。MFA的目的是建立一个多层次的防御,使未经授权的人访问计算机系统或网络更加困难,从而提高安全性。 + +## 密码存储 + +基于Spring Security实现密码加密和验证,规则是通过对密码明文添加```{noop}```前缀 + +MaxKey默认密码加密策略BCrypt,用户表(userinfo)->密码字段(password),存储方式```{类型}密文``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
类型密码
plain 明文
bcrypt默认
pbkdf2PBKDF2
md4MD4
md5MD5
sha1SHA-1
sha256SHA-256
sha384SHA-384
sha512SHA-512
sm3国产哈希算法GM/T 0004-2012
ldapLDAP
+ +### bcrypt 编码算法 +bcrypt使用的是布鲁斯·施内尔在1993年发布的 Blowfish 加密算法。bcrypt 算法将salt随机并混入最终加密后的密码,验证时也无需单独提供之前的salt,从而无需单独处理salt问题。加密后的格式一般为: + +``` +$2a$10$/bTVvqqlH9UiE0ZJZ7N2Me3RIgUCdgMheyTgV0B4cMCSokPa.6oCa +``` +其中:$是分割符,无意义;2abcrypt加密版本号;10cost的值;而后的前22位是salt值;再然后的字符串就是密码的密文了。 + +### bcrypt 特点 +bcrypt有个特点就是非常慢。这大大提高了使用彩虹表进行破解的难度。也就是说该类型的密码暗文拥有让破解者无法忍受的时间成本。同时对于开发者来说也需要注意该时长是否能超出系统忍受范围内。通常是MD5的数千倍。 +同样的密码每次使用bcrypt编码,密码暗文都是不一样的。 也就是说你有两个网站如果都使用了bcrypt 它们的暗文是不一样的,这不会因为一个网站泄露密码暗文而使另一个网站也泄露密码暗文。 +所以从bcrypt的特点上来看,其安全强度还是非常有保证的。 + + +### 不推荐使用md5 +首先md5 不是加密算法,是哈希摘要。以前通常使用其作为密码哈希来保护密码。由于彩虹表的出现,md5 和sha1之类的摘要算法都已经不安全了。如果有不相信的同学 可以到一些解密网站 如 cmd5 网站尝试解密 你会发现 md5 和 sha1 是真的非常容易被破解。 \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/sso_slo.md b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/sso_slo.md new file mode 100644 index 000000000..c5a351e12 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_docs/version-3.5.x/sso_slo.md @@ -0,0 +1,106 @@ +--- +title: 单点注销 +sidebar_position: 9 +--- +## 单点注销 + +单点注销(Single Logout)是指用户在一个系统退出后,其所能单点登录访问的所有系统都同时退出。单点注销主要是为提高安全性,避免用户忘记退出所有应用而造成信息的泄密。 + + +IDP支持单点注销(SLO),即用户不仅仅从认证中心注销,同时也注销从认证中心访问的应用系统。 + + +其实现方式也非常简单,由于SSO和单点登录的应用都是分开的,使用不同的域名,只是通过认证中心在多个应用系统中传递身份和登录系统。因此,首先注销单点登录应用,然后修改每个应用系统都使用SSO的单点注销页面,SSO的退出页面会将用户登录的Session注销掉。 + +## 单点注销过程 + +1,应用系统先完成本系统注销,注销完成后调用认证中心的单点注销地址。 + + +2,修改应用单点注销完成后的地址为https://sso.maxkey.top/maxkey/force/logout,参数reLoginUrl为注销完成后访问地址。 + + + +## 单点注销机制 +MaxKey在登录完成后,会生成在线令牌,该令牌存储在Cookie和服务器中,当单点登录是会向应用传递在线令牌,应用通过判断令牌的状态检查当前用户是否在线,如果令牌失效,则应用自动注销,达到单点注销的功能。 + + +### IDP主动注销 +MaxKey注销时向SP发送注销请求,请求包含注销的令牌,SP获取注销的令牌,通知客户端进行注销 + +基于CAS的单点登录,在单点登录时SP记住MaxKey的ticket,当MaxKey单点注销时向SP发送参数为logoutRequest,请求内容入下 + +```xml + + %s + %s + +``` + +基于MaxKey在线token注销机制,在单点登录时MaxKey会把在线token发送给SP,SP需要存储该令牌,当MaxKey单点注销时向SP发送请求 + + + + + + + + + + + + + + + + + + + + + + + +
序号参数备注
1requestlogoutRequest
2id随机id
3principal登录用户名
4issueInstant登出时间
5ticket当前在线ticket
+ + +### SP接口注销 +SP向MaxKey的接口定时发送请求,检查令牌的有效性,如果令牌失效,则应用退出登录,验证在线token地址sign/onlineticket/validate,参数为ticket为令牌id + +### Cookie有效性注销 +登录完成后在线令牌存储在.maxkey.top的域名下,Cookie名称为online_ticket,SP应用和MaxKey使用**子域名.maxkey.top**,应用根据令牌有效性判断是否注销。 + + +### 关闭浏览器注销 +MaxKey注销,然后在注销的界面使用javascript关闭浏览器。 + + +## 实现机制比较 + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号机制适应场景
1IDP主动注销SP实现接口用于MaxKey调用
2SP接口注销对MaxKey请求频繁有一定压力
3Cookie有效性注销同域,实现简单
4注销MaxKey并关闭浏览器关闭整个浏览器
+ \ No newline at end of file diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_sidebars/version-3.5.x-sidebars.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_sidebars/version-3.5.x-sidebars.json new file mode 100644 index 000000000..caea0c03b --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versioned_sidebars/version-3.5.x-sidebars.json @@ -0,0 +1,8 @@ +{ + "tutorialSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ] +} diff --git a/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versions.json b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versions.json new file mode 100644 index 000000000..f68038157 --- /dev/null +++ b/summer-ospp/2025/doc_ossp/maxkey-docs/maxkey-docs/versions.json @@ -0,0 +1,3 @@ +[ + "3.5.x" +]