add ospp docs

This commit is contained in:
xiaoyvhuv 2025-08-26 23:04:49 +08:00
parent 1f8520c650
commit 3766cc04ce
718 changed files with 36738 additions and 0 deletions

View File

@ -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=<Your GitHub username> 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.

View File

@ -0,0 +1,164 @@
---
sidebar_position: 1
title: 概述
---
## MaxKey概述
<b>MaxKey</b>单点登录认证系统,谐音为马克思的钥匙寓意是最大钥匙,是<b>业界领先的IAM身份管理和认证产品</b>支持OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM等标准协议提供<i>安全、标准和开放</i>的用户身份管理(IDM)、身份认证(AM)、单点登录(SSO)、资源管理和权限管理等。
官方QQ**1054466084**
邮箱EMAIL: <b>support@maxsso.net</b>
代码托管 <a href="https://github.com/dromara/MaxKey" target="_blank"><b>GitHub</b></a> | <a href="https://gitee.com/dromara/MaxKey" target="_blank"><b>码云(Gitee)</b></a>
### 什么是单点登录
>**单点登录(Single Sign On)**简称为**SSO**
>
>用户只需要登录认证中心一次就可以访问所有相互信任的应用系统,无需再次登录,主要功能:
>
>1.所有应用系统共享一个身份认证系统
>
>2.所有应用系统能够识别和提取ticket信息
## 标准协议
<table border="0" class="table table-striped table-bordered ">
<tbody>
<tr class="a">
<th>序号</th>
<th>协议</th>
<th>支持</th>
</tr>
<tr class="b">
<td>1 </td>
<td>OAuth 2.x/OpenID Connect</td>
<td></td>
</tr>
<tr class="a">
<td>2 </td>
<td>SAML 2.0 </td>
<td></td>
</tr>
<tr class="b">
<td>3 </td>
<td>JWT</td>
<td></td>
</tr>
<tr class="a">
<td>4 </td>
<td>CAS</td>
<td></td>
</tr>
<tr class="b">
<td>5 </td>
<td>FormBased</td>
<td></td>
</tr>
<tr class="a">
<td>6 </td>
<td>TokenBased(Post/Cookie)</td>
<td></td>
</tr>
<tr class="b">
<td>7 </td>
<td>ExtendApi</td>
<td></td>
</tr>
<tr class="a">
<td>8 </td>
<td>EXT</td>
<td></td>
</tr>
</tbody>
</table>
![单点登录](/images/authz.png)
## 登录支持
<table border="0" class="table table-striped table-bordered ">
<tbody>
<tr class="a">
<th>序号</th>
<th>登录方式</th>
<th>类型</th>
</tr>
<tr class="b">
<td>1 </td>
<td>图片验证码</td>
<td>字母/数字/算术</td>
</tr>
<tr class="a">
<td>2 </td>
<td>双因素认证 </td>
<td>短信或者邮件动态验证码</td>
</tr>
<tr class="b">
<td>3 </td>
<td>短信认证</td>
<td>腾讯云短信/阿里云短信/网易云信 </td>
</tr>
<tr class="a">
<td>4 </td>
<td>TOTP或者HOTP动态口令</td>
<td>Google/Microsoft Authenticator/FreeOTP/支持TOTP或者HOTP</td>
</tr>
<tr class="b">
<td>5 </td>
<td>Windows域认证</td>
<td>Kerberos/SPNEGO/AD域</td>
</tr>
<tr class="b">
<td>6 </td>
<td>LDAP认证</td>
<td>OpenLDAP/ActiveDirectory/标准LDAP服务器</td>
</tr>
<tr class="a">
<td>7 </td>
<td>社交账号</td>
<td>微信/QQ/微博/钉钉/Google/Facebook/其他</td>
</tr>
<tr class="b">
<td>8 </td>
<td>扫码登录</td>
<td>企业微信/钉钉/飞书扫码登录</td>
</tr>
</tbody>
</table>
![认证模型](/images/authn.png)
## 产品优势
1. 提供标准的认证接口以便于其他应用集成SSO安全的移动接入安全的API、第三方认证和互联网认证的整合。
2. 提供用户生命周期管理支持SCIM 2协议开箱即用的连接器(Connector)实现身份供给同步。
3. 简化微软Active Directory域控、标准LDAP服务器机构和账号管理密码自助服务重置密码。
4. 认证多租户功能,支持集团下多企业独立管理或企业下不同部门数据隔离的,降低运维成本。
5. 认证中心具有平台无关性、环境多样性支持Web、手机、移动设备等, 如Apple iOSAndriod等将认证能力从B/S到移动应用全面覆盖。
6. 基于Java EE平台微服务架构采用Spring、MySQL、Tomcat、Redis、MQ等开源技术扩展性强。
7. 开源、安全、自主可控,许可证 Apache 2.0 License & <a href="https://maxkey.top/zh/about/licenses.html" target="_blank">MaxKey版权声明</a>
## 项目版本路线图
![项目版本路线图](/images/roadmap.jpg)
## 最有价值开源项目
Gitee-最有价值开源项目
![Gitee-最有价值开源项目](/images/gitee_mvp.png)

View File

@ -0,0 +1,66 @@
---
title: 新闻动态
---
# 新闻动态
关于Authing.cn在百度搜索关键字“MaxKey单点登录认证系统”侵权的进展通告-[2022/07/16] <a href="/about/news/licenses_zqjy_2207" target="_blank">查看</a>
MaxKey 单点登录认证系统前后端分离 v3.5.1GA 发布[2022/06/01] <a href="https://www.oschina.net/news/199127/maxkey-3-5-ga-released" target="_blank">查看</a>
MaxKey 单点登录认证系统前后端分离 v3.5.0GA 发布[2022/05/11] <a href="https://www.oschina.net/news/195215/maxkey-3-5-0-ga" target="_blank">查看</a>
MaxKey 单点登录认证系统 v3.5.0 RC 发布[2022/05/01] <a href="https://www.oschina.net/news/193842/maxkey-3-5-0-rc-released" target="_blank">查看</a>
MaxKey 单点登录认证系统 v3.3.0 GA 发布[2022/03/03] <a href="https://www.oschina.net/news/184825" target="_blank">查看</a>
MaxKey 单点登录认证系统 v3.2.0 GA 发布[2022/02/17] <a href="https://www.oschina.net/news/182808/maxkey-3-3-2-ga" target="_blank">查看</a>
关于Authing.cn在百度搜索关键字“MaxKey单点登录认证系统”侵权的通告-[2021/12/15] <a href="/about/news/licenses_zqjy" target="_blank">查看</a>
MaxKey 单点登录认证系统 v3.1.0 GA 发布[2021/11/03] <a href="https://www.oschina.net/news/167060/maxkey-3-1-0-ga-released" target="_blank">查看</a>
MaxKey 单点登录认证系统微服务架构 v3.0.0GA 发布[2021/09/29] <a href="https://www.oschina.net/news/162238/maxkey-3-0-0-ga" target="_blank">查看</a>
MaxKey 单点登录认证系统 v2.9.0 GA 发布[2021/08/24] <a href="https://www.oschina.net/news/157023/maxkey-2-9-0-ga" target="_blank">查看</a>
MaxKey 单点登录认证系统 v 2.8.1GA 发布 [2021/06/25] <a href="https://www.oschina.net/news/147646/maxkey-2-8-1-ga" target="_blank">查看</a>
MaxKey 单点登录认证系统 v2.7.0GA 发布 [2021/04/15] <a href="https://www.oschina.net/news/137556/maxkey-2-7-0-ga" target="_blank">查看</a>
Dromara 开源社区再次新增两个 GVP 项目 [2021/03/16] <a href="https://www.oschina.net/news/133311/dromara-news" target="_blank">查看</a>
MaxKey单点登录认证系统 v 2.6.0GA 发布 [2021/03/05] <a href="https://www.oschina.net/news/131947/maxkey-2-6-0-ga" target="_blank">查看</a>
MaxKey单点登录认证系统 v2.5.0GA 发布 [2021/02/06] <a href="https://www.oschina.net/search?scope=news&q=maxkey&days=0&onlytitle=0&sort_by_time=1" target="_blank">查看</a>
MaxKey单点登录认证系统 v2.4.0GA 发布 [2021/01/01] <a href="https://www.oschina.net/search?scope=news&q=maxkey&days=0&onlytitle=0&sort_by_time=1" target="_blank">查看</a>
单点登录认证系统 MaxKey v2.3.0GA 发布 [2020/11/11] <a href="https://www.oschina.net/news/120328/maxkey-2-3-0-released" target="_blank">查看</a>
单点登录认证系统 MaxKey v2.2.0GA 发布 [2020/09/24] <a href="https://my.oschina.net/u/4420055/blog/4641359" target="_blank">查看</a>
单点登录认证系统 MaxKey v2.2.0RC 发布 [2020/09/04] <a href="https://www.oschina.net/news/118371/maxkey-2-2-0-rc-released" target="_blank">查看</a>
六个高Star开源项目让你更懂OAuth和单点登录 [2020/08/17] <a href="https://www.bilibili.com/read/cv7206185/" target="_blank">查看</a>
MaxKey官方网站全新改版 [2020/08/06] <a href="https://www.maxkey.top" target="_blank">MaxKey.top</a>
单点登录认证系统 MaxKey v2.1.0GA 发布 [2020/08/01] <a href="https://www.oschina.net/news/117724/maxkey-2-1-0-ga-released" target="_blank">查看</a>
单点登录认证系统 MaxKey v2.0.0GA 发布 [2020/07/13] <a href="https://www.oschina.net/news/117142/maxkey-2-0-0-ga-released" target="_blank">查看</a>
单点登录认证系统 MaxKey v2.0.0RC1 发布 [2020/06/01] <a href="https://www.oschina.net/news/116082/maxkey-2-0-0-rc1-released" target="_blank">查看</a>
开源sso单点登陆系统推荐,MaxKey社区努力进步中 [2020/05/20]<a href="https://blog.csdn.net/netsec_steven/article/details/106230338">查看</a>
单点登录认证系统 MaxKey v1.4.0GA 发布 [2020/05/01] <a href="https://www.oschina.net/news/115416/maxkey-1-4-0-ga" target="_blank">查看</a>
还得看 JavaGitee 4月最火 Java 项目大盘点 [2020/04/07]<a href="https://www.bilibili.com/read/cv6029156" target="_blank">查看</a>
单点登录认证系统 MaxKey v1.3.0GA 发布 [2020/04/04] <a href="https://www.oschina.net/news/114633/maxkey-1-3-0-ga" target="_blank">查看</a>
单点登录认证系统 MaxKey v1.2.0GA 发布 [2020/02/18] <a href="https://my.oschina.net/u/4420055/blog/3167682" target="_blank">查看</a>
MaxKey单点登录认证系统 oschina收录时间 [2019-12-09]<a href="https://www.oschina.net/p/maxkey" target="_blank">查看</a>
MaxKey单点登录认证系统开源重构 [2019-02-07]

View File

@ -0,0 +1,243 @@
---
title: 项目团队
className: ./css/custom.css
---
## 项目团队
一个成功的项目需要许多人扮演许多角色。有些成员编写代码或文档,而另一些成员作为测试人员有价值,可以提交补丁和建议。
项目团队由成员和贡献者组成。成员可以直接访问项目的源代码并积极发展代码库。贡献者通过向成员提交补丁和建议来改善项目。该项目的贡献者数量是无限的。今天就参与。非常感谢该项目的所有贡献。
## 团队成员
以下是具有提交特权的开发者列表,这些开发者以一种或另一种方式直接对项目做出了贡献。
<table border="0" class="table table-striped table-bordered ">
<thead>
<th>名称</th><th >头像(CodeID)</th><th>组织</th><th>角色</th><th>时区</th>
</thead>
<tbody>
<tr>
<td>shimingxy</td>
<td>
<a href ="https://github.com/shimingxy">
<img width="64px" src="https://avatars.githubusercontent.com/u/1563377?v=4"/>
</a></td>
<td>MaxKeyTop</td>
<td>PMC Chair</td>
<td>Asia/北京</td>
</tr>
<tr>
<td>shibanglin</td>
<td>
<a href ="#">
<img width="64px" src="https://avatars.githubusercontent.com/u/71626778?v=4"/>
</a>
</td>
<td>MaxKeyTop</td>
<td>PMC Member</td>
<td>Asia/北京</td>
</tr>
<tr>
<td>fucan1017</td>
<td>
<a href ="#">
<img width="64px" src="https://avatars.githubusercontent.com/u/71626778?v=4"/>
</a>
</td>
<td>MaxKeyTop</td>
<td>PMC Member</td>
<td>Asia/北京</td>
</tr>
<tr>
<td>Coloey</td>
<td>
<a href ="https://github.com/Coloey">
<img width="64px" src="https://avatars.githubusercontent.com/u/71813516?v=4"/>
</a>
</td>
<td>MaxKeyTop</td>
<td>PMC Member</td>
<td>Asia/北京</td>
</tr>
<tr>
<td>apacheBright</td>
<td>
<a href ="https://github.com/apacheBright">
<img width="64px" src="https://avatars.githubusercontent.com/u/27547000?v=4"/>
</a>
</td>
<td>MaxKeyTop</td>
<td>PMC Member</td>
<td>Asia/北京</td>
</tr>
<tr>
<td>FranisiL</td>
<td>
<a href ="https://github.com/FranisiL">
<img width="64px" src="https://avatars.githubusercontent.com/u/45416982?v=4"/>
</a>
</td>
<td>MaxKeyTop</td>
<td>PMC Member</td>
<td>Asia/北京</td>
</tr>
<tr>
<td>Garrett.Xia</td>
<td>
<a href ="https://github.com/randomNaming">
<img width="64px" src="https://avatars.githubusercontent.com/u/42424717?v=4"/>
</a>
</td>
<td>MaxKeyTop</td>
<td>PMC Member</td>
<td>Asia/北京</td>
</tr>
</tbody>
</table>
## 贡献者
以下其他人员通过建议,补丁或文档的方式为该项目做出了贡献。
<table border="0" class="table table-striped table-bordered ">
<thead>
<th>名称</th><th >头像(CodeID)</th><th>组织</th><th>角色</th><th>时区</th><th>问题</th>
</thead>
<tbody>
<tr>
<td>stdnt-xiao</td>
<td>
<a href ="https://github.com/stdnt-xiao">
<img width="64px" src ="https://avatars.githubusercontent.com/u/20313983?v=4"/>
</a>
</td>
<td></td>
<td>contributor</td>
<td>Asia/北京</td>
<td>Docker和docker-compose部署的优化</td>
</tr>
<tr>
<td>QQ793732900(恍然如梦)</td>
<td>
<img width="64px" src="https://sqimg.qq.com/qq_product_operations/im/qqlogo/imlogo_b.png"/>
</td>
<td></td>
<td>contributor</td>
<td>Asia/北京</td>
<td>解决Maxkey在Chrome “您的连接不是私密连接” 问题</td>
</tr>
<tr>
<td>xiazhenyou</td>
<td>
<a href ="https://github.com/xiazhenyou">
<img width="64px" src ="https://avatars.githubusercontent.com/u/58844127?v=4"/>
</a>
</td>
<td></td>
<td>contributor</td>
<td>Asia/北京</td>
<td>MaxKey-SpringBoot4CAS-demo</td>
</tr>
<tr>
<td>要懂得舍得(pcore)</td>
<td><a href ="https://gitee.com/pcore">
<img width="64px" src="https://portrait.gitee.com/uploads/avatars/user/385/1157580_pcore_1600243694.png!avatar200"/>
</a>
</td>
<td></td>
<td>contributor</td>
<td>Asia/北京</td>
<td>一键登录</td>
</tr>
<tr>
<td>yutel</td>
<td>
<a href ="https://gitee.com/yutel">
<img width="64px" src ="https://portrait.gitee.com/uploads/avatars/user/6/18222_yutel_1578915201.png!avatar200"/>
</a>
</td>
<td></td>
<td>contributor</td>
<td>Asia/北京</td>
<td>退出功能优化</td>
</tr>
<tr>
<td>alanland</td>
<td>
<a href ="https://gitee.com/alanland">
<img width="64px" src ="https://avatars.githubusercontent.com/u/2202150?v=4"/>
</a>
</td>
<td></td>
<td>contributor</td>
<td>Asia/北京</td>
<td>Docker支持</td>
</tr>
<tr>
<td>MemoryF</td>
<td>
<a href ="https://github.com/MemoryF">
<img width="64px" src="https://avatars.githubusercontent.com/u/26829986?v=4"/>
</a>
</td>
<td></td>
<td>contributor</td>
<td>Asia/北京</td>
<td>前后端分离注销问题</td>
</tr>
<tr>
<td>caffebabee</td>
<td>
<a href ="https://gitee.com/caffebabee">
<img width="64px" src="https://portrait.gitee.com/uploads/avatars/user/1724/5174685_caffebabee_1578981752.png!avatar200"/>
</a>
</td>
<td></td>
<td>contributor</td>
<td>CN</td>
<td></td>
</tr>
<tr>
<td>tzk007</td>
<td>
<a href ="https://gitee.com/tzk007">
<img width="64px" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAYAAAA4qEECAAAAAXNSR0IArs4c6QAAAdtJREFUeF7t1DFqAgEUhOG3loL3EO9kZ2fnXSytbDzL9p5EwUZISAKBNHHgsb+G/NbjG/Zz3KGq3srP5AKD0JMbfxYIzTgLDTkLLTQlAPX4jhYaEoBqXLTQkABU46KFhgSgGhctNCQA1bhooSEBqMZFCw0JQDUuWmhIAKpx0UJDAlCNixYaEoBqXLTQkABU46KFhgSgGhf9X6DP53OtVqtJH/dyudR2u63j8Thpz2/Hn75ooaHfXmgIehzHWi6XD9tms1nN5/Maho8/4dfndrvV/X5/+N3r9Vq73a5Op9PD7FSBp7860gdbr9e13+9rsVh8f+VwONRms0lPPDUnNMQvtNA/BXx1QIsQWuhIwHd0xNQPCd03jC4IHTH1Q0L3DaMLQkdM/ZDQfcPogtARUz8kdN8wuiB0xNQPCd03jC4IHTH1Q0L3DaMLQkdM/ZDQfcPogtARUz8kdN8wuiB0xNQPCd03jC4IHTH1Q0L3DaMLQkdM/ZDQfcPowp+Bjp7mhUNCQz+O0EJDAlCNixYaEoBqXLTQkABU46KFhgSgGhctNCQA1bhooSEBqMZFCw0JQDUuWmhIAKpx0UJDAlCNixYaEoBqXLTQkABU46KFhgSgGhctNCQA1bhoCPodtfwsELZbAskAAAAASUVORK5CYII="/>
</a>
</td>
<td></td>
<td>contributor</td>
<td>CN</td>
<td>MAC 启动时获取OS信息报错修复</td>
</tr>
<tr>
<td>whensuc</td>
<td>
<a href ="https://gitee.com/whensuc">
<img width="64px" src="https://portrait.gitee.com/uploads/avatars/user/574/1722891_whensuc_1651024696.png!avatar200"/>
</a>
</td>
<td></td>
<td>contributor</td>
<td>CN</td>
<td>修正redis连接不释放</td>
</tr>
<tr>
<td>JLLeitschuh</td>
<td>
<a href ="https://github.com/JLLeitschuh">
<img width="64px" src="https://avatars.githubusercontent.com/u/1323708?v=4"/>
</a>
</td>
<td></td>
<td>contributor</td>
<td>Boston, MA</td>
<td>vuln-fix: Temporary File Information Disclosure</td>
</tr>
</tbody>
</table>
## 其他贡献者
https://github.com/dromara/MaxKey/graphs/contributors

View File

@ -0,0 +1,98 @@
---
title: 项目许可证
---
## 概况
<p>通常,为项目列出的许可证是项目本身的许可证,而不是依赖项。</p>
## 项目许可证
<h4>Apache License, Version 2.0</h4>
<a href="http://www.apache.org/licenses/LICENSE-2.0" name="Apache_License_Version_2.0">
http://www.apache.org/licenses/LICENSE-2.0
</a>
```
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 许可证的拷贝,在分发的衍生作品的源代码中,<b>必须保留本作品源码中的所有版权、专利、商标和归属声明</b>
公司在使用 Apache License Version 2.0 授权的开源软件,<b>进行分发的过程中,不应隐瞒或故意忽略提及对此软件的使用</b>
## 版权声明
必须保留本作品及源码中的所有版权、专利、商标和归属声明,请遵守开源许可证,合规使用开源产品,避免法律纠纷。
## 第三方依赖声明
参见<a href="/about/dependency">项目依赖</a>
## 违反开源协议新闻
<a href="/about/news/licenses_zqjy_2207" target="_blank">关于Authing.cn在百度搜索关键字“MaxKey单点登录认证系统”侵权的进展通告-2022年07月16日</a>
<br/>
<a href="https://www.oschina.net/news/201007" target="_blank">开源项目维权成功案例: spug 开源运维平台成功维权-2022年06月28日</a>
<br/>
<a href="https://blog.csdn.net/csdnopensource/article/details/125447214" target="_blank">删库跑路、“投毒”、改协议,开源有哪几大红线千万不能踩?-2022年06月24日</a>
<br/>
<a href="https://blog.csdn.net/csdnnews/article/details/124837759" target="_blank">GPL 法律之战:它是自由软件许可证,更具合同效力-2022年05月18日</a>
<br/>
<a href="https://www.oschina.net/news/180750/volcengine-apache-skywalking" target="_blank">违规再分发 SkyWalking火山引擎回应并道歉-2022年01月29日</a>
<br/>
<a href="/about/news/licenses_zqjy" target="_blank">关于Authing.cn在百度搜索关键字“MaxKey单点登录认证系统”侵权的通告-2021年12月15日</a>
<br/>
<a href="https://www.oschina.net/news/159435" target="_blank">首例!违反 GPL 协议致侵权,被判赔偿 50 万元-2021年09月09日</a>
<br/>
<a href="https://www.oschina.net/news/159429" target="_blank">Apache Doris 声明 | 你们想知道的一切,都在这里了-2021年09月09日</a>
<br/>
<a href="https://www.oschina.net/news/135377/spug-announce" target="_blank">致老男孩教育的维权声明 - Spug 运维-2021年03月31日</a>
<br/>
<a href="https://segmentfault.com/a/1190000022973105" target="_blank">博云违反 Apache 2.0 开源协议被要求整改,开源协议到底应该如何遵守?-2020年06月19日</a>
<br/>
<a href="https://www.oschina.net/news/100440/what-is-a-repo-license" target="_blank">开源作者痛斥京东重量级项目抄袭-2018年09月30日</a>

View File

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

View File

@ -0,0 +1,614 @@
---
title: 开源产品对比
---
<h2>MaxKey和Keycloak/CAS对比</h2>
<table border="0" class="table table-striped table-bordered ">
<thead>
<th>模块</th><th>功能</th><th>MaxKey</th><th>Keycloak</th><th>Apereo&nbsp;CAS</th>
</thead>
<tbody>
<tr>
<td>标准协议</td>
<td>OpenID Connect 1.0</td>
<td></td>
<td></td>
<td>插件</td>
</tr>
<tr>
<td>标准协议</td>
<td>OAuth v2.0/2.1</td>
<td></td>
<td></td>
<td>插件</td>
</tr>
<tr>
<td>标准协议</td>
<td>SAML V2.0</td>
<td></td>
<td></td>
<td>插件</td>
</tr>
<tr>
<td>标准协议</td>
<td>CAS 1.0/2.0/3.0</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>标准协议</td>
<td>JWT</td>
<td></td>
<td>定制</td>
<td>定制</td>
</tr>
<tr>
<td>标准协议</td>
<td>TOKEN令牌支持</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>标准协议</td>
<td>密码代填(FORMBASED)支持</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>标准协议</td>
<td>API扩展支持</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>标准协议</td>
<td>扩展定制支持</td>
<td></td>
<td>定制</td>
<td>定制</td>
</tr>
<tr>
<td colspan="5"></td>
</tr>
<tr>
<td>认证服务</td>
<td>用户登录</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>用户登录-图片验证码</td>
<td></td>
<td>定制</td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>用户登录-短信验证码</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>用户登录-TOTP动态令牌</td>
<td></td>
<td>定制</td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>用户登录-邮件验证码</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>用户登录-社交账号登陆</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>用户登录-企业微信、钉钉扫码登陆</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>用户登录-双因素认证</td>
<td></td>
<td>定制</td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>用户登录-Active Directory用户登录</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>用户登录-OpenLDAP用户登录</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>用户登录-Windows域认证</td>
<td>企业版</td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>登录注销</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td> 应用访问权限控制</td>
<td></td>
<td></td>
<td>定制</td>
</tr>
<tr>
<td>认证服务</td>
<td>密码修改</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>密码过期修改</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>首次登陆密码修改</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>找回密码</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>安全配置</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>用户信息修改</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>社交账号绑定</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>主题切换</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td>时间令牌</td>
<td></td>
<td>插件</td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td> 应用账号管理</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td> 多种设备支持</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td> 用户登录日志</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td> 应用访问日志</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>认证服务</td>
<td> 管理日志</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td colspan="5"></td>
</tr>
<tr>
<td>管理服务</td>
<td>机构管理</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>管理服务</td>
<td>用户管理</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>管理服务</td>
<td>账号管理</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>管理服务</td>
<td>应用管理</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>管理服务</td>
<td>访问控制-角色管理</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>管理服务</td>
<td>访问控制-角色成员管理</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>管理服务</td>
<td>访问控制-访问控制管理</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>管理服务</td>
<td>权限管理-资源管理</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>管理服务</td>
<td>权限管理-权限管理</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>管理服务</td>
<td>配置管理-同步器管理</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>管理服务</td>
<td>配置管理-适配器管理</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>管理服务</td>
<td>配置管理-密码策略</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>管理服务</td>
<td>管理端单点登录</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td colspan="5"></td>
</tr>
<tr>
<td>生命周期管理</td>
<td>REST接口机构和用户同步</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>生命周期管理</td>
<td>SCIM2接口机构和用户同步</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>生命周期管理</td>
<td>消息同步支持</td>
<td>企业版</td>
<td></td>
<td></td>
</tr>
<tr>
<td >生命周期管理</td><td colspan="5">同步器把存在上游系统的机构和账号同步到MaxKey</td>
</tr>
<tr>
<td>生命周期管理</td>
<td>Active Directory同步器</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>生命周期管理</td>
<td>标准LDAP同步器</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>生命周期管理</td>
<td>企业微信同步器</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>生命周期管理</td>
<td>钉钉同步器</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td >生命周期管理</td><td colspan="5">连接器把MaxKey的机构和账号同步到下游系统</td>
</tr>
<tr>
<td>生命周期管理</td>
<td>Active Directory连接器</td>
<td>企业版</td>
<td></td>
<td></td>
</tr>
<tr>
<td>生命周期管理</td>
<td>标准LDAP连接器</td>
<td>企业版</td>
<td></td>
<td></td>
</tr>
<tr>
<td>生命周期管理</td>
<td>企业微信连接器</td>
<td>企业版</td>
<td></td>
<td></td>
</tr>
<tr>
<td>生命周期管理</td>
<td>钉钉连接器</td>
<td>企业版</td>
<td></td>
<td></td>
</tr>
<tr>
<td>生命周期管理</td>
<td>飞书连接器</td>
<td>企业版</td>
<td></td>
<td></td>
</tr>
<tr>
<td>生命周期管理</td>
<td>华为WeLink连接器</td>
<td>企业版</td>
<td></td>
<td></td>
</tr>
<tr>
<td colspan="5"></td>
</tr>
<tr>
<td>日志审计</td>
<td>统计报表</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>日志审计</td>
<td>管理日志审计</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>日志审计</td>
<td>登录日志审计</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>日志审计</td>
<td>应用访问日志审计</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>日志审计</td>
<td>连接器日志审计</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>日志审计</td>
<td>同步器日志审计</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td colspan="5"></td>
</tr>
<tr>
<td>其他</td>
<td>JAVA SDK<br/>.NET SDK</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>其他</td>
<td>支持多平台<br/>Windows<br/>LINUX<br/>UNIX</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>其他</td>
<td>支持主流浏览器:<br/>Google Chrome <br/>Mozilla Firefox <br/> Internet Explorer 10 <br/>Microsoft Edge <br/></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>其他</td>
<td>支持PC、平板PAD、手机Moblie</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>其他</td>
<td>开发集成指南</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td colspan="5"></td>
</tr>
<tr>
<td>客户服务</td>
<td>产品文档及安装配置(集群)</td>
<td><div class="icon">开源社区</div></td>
<td><div class="icon">开源社区</div></td>
<td><div class="icon">开源社区</div></td>
</tr>
<tr>
<td>客户服务</td>
<td>版本升级及BUG修复</td>
<td>开源社区</td>
<td>开源社区</td>
<td>开源社区</td>
</tr>
<tr>
<td>客户服务</td>
<td>在线技术支持</td>
<td>官方QQ</td>
<td></td>
<td></td>
</tr>
<tr>
<td>客户服务</td>
<td>集成解决方案咨询</td>
<td>企业版</td>
<td></td>
<td></td>
</tr>
<tr>
<td>客户服务</td>
<td>技术培训</td>
<td>企业版</td>
<td></td>
<td></td>
</tr>
<tr>
<td>客户服务</td>
<td>定制开发支持</td>
<td>企业版</td>
<td></td>
<td></td>
</tr>
<tr>
<td>客户服务</td>
<td>客户化界面定制</td>
<td>企业版</td>
<td></td>
<td></td>
</tr>
<tr>
<td>客户服务</td>
<td>紧急故障修复</td>
<td>企业版</td>
<td></td>
<td></td>
</tr>
<tr>
<td colspan="5"></td>
</tr>
<tr>
<td>团队</td>
<td>研发团队</td>
<td>国内✅</td>
<td>国外</td>
<td>国外</td>
</tr>
</tbody>
</table>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,297 @@
---
title: 开发路线图
---
## Roadmap
<table border="0" class="table table-striped table-bordered ">
<thead>
<tr class="a roadmap">
<th class="table-col1">时间</th>
<th class="table-col2">计划</th>
<th class="table-col3">状态</th>
</tr>
</thead>
<tbody>
<tr>
<td>2024Q2</td>
<td>权限管理优化</td>
<td></td>
</tr>
<tr>
<td>2024Q2</td>
<td>数据同步优化</td>
<td></td>
</tr>
<tr >
<td>2024Q1</td>
<td>增强身份管理 </td>
<td></td>
</tr>
</tbody>
</table>
## Roadmap-2023
<table border="0" class="table table-striped table-bordered ">
<thead>
<tr class="a roadmap">
<th class="table-col1">时间</th>
<th class="table-col2">计划</th>
<th class="table-col3">状态</th>
</tr>
</thead>
<tbody>
<tr>
<td>2023Q3</td>
<td>Java 17+</td>
<td></td>
</tr>
<tr >
<td>2023Q3</td>
<td>Jakarta EE 10+ </td>
<td></td>
</tr>
<tr>
<td>2023Q3</td>
<td>Spring Framework 6</td>
<td></td>
</tr>
<tr >
<td>2023Q3</td>
<td>Spring Boot 3 </td>
<td></td>
</tr>
</tbody>
</table>
## Roadmap-2022
<table border="0" class="table table-striped table-bordered ">
<thead>
<tr class="a roadmap">
<th class="table-col1">时间</th>
<th class="table-col2">计划</th>
<th class="table-col3">状态</th>
</tr>
</thead>
<tbody>
<tr>
<td>2022Q4</td>
<td>docker-compose部署优化</td>
<td></td>
</tr>
<tr >
<td>2022Q3</td>
<td>Spring Boot 2.7.x </td>
<td></td>
</tr>
<tr >
<td>2022Q2</td>
<td>前后端分离</td>
<td></td>
</tr>
<tr >
<td>2022Q2</td>
<td>会话管理</td>
<td></td>
</tr>
<tr >
<td>2022Q2</td>
<td>二级缓存优化</td>
<td></td>
</tr>
<tr >
<td>2022Q2</td>
<td>Ant Design of Angular</td>
<td></td>
</tr>
<tr >
<td>2022Q2</td>
<td>OpenID Connect optimize</td>
<td></td>
</tr>
<tr >
<td>2022Q1</td>
<td>JWT optimize</td>
<td></td>
</tr>
<tr >
<td>2022Q1</td>
<td>OAuth 2.1</td>
<td></td>
</tr>
</tbody>
</table>
## Roadmap-2021
<table border="0" class="table table-striped table-bordered ">
<thead>
<tr class="a roadmap">
<th class="table-col1">时间</th>
<th class="table-col2">计划</th>
<th class="table-col3">状态</th>
</tr>
</thead>
<tbody>
<tr>
<td>2021Q4</td>
<td>Zero trust scenario integration</td>
<td></td>
</tr>
<tr>
<td>2021Q4</td>
<td>腾讯iOA零信任产品适配</td>
<td></td>
</tr>
<tr>
<td>2021Q4</td>
<td>Bootstrap 5.x</td>
<td></td>
</tr>
<tr>
<td>2021Q4</td>
<td>SpringBoot 2.6.x</td>
<td></td>
</tr>
<tr>
<td>2021Q4</td>
<td>docker-compose支持</td>
<td></td>
</tr>
<tr>
<td>2021Q3</td>
<td>好雨科技Rainbond适配</td>
<td></td>
</tr>
<tr>
<td>2021Q3</td>
<td>Nacos支持</td>
<td></td>
</tr>
<tr >
<td>2021Q3</td>
<td>Maxkey-Cloud (micro service support)</td>
<td></td>
</tr>
<tr >
<td>2021Q3</td>
<td>Multi-Tenancy</td>
<td></td>
</tr>
<tr>
<td>2021Q2</td>
<td>国产数据库瀚高DB的适配</td>
<td></td>
</tr>
<tr>
<td>2021Q2</td>
<td>Microsoft Active Directory支持</td>
<td></td>
</tr>
<tr>
<td>2021Q2</td>
<td>SpringBoot 2.5.x</td>
<td></td>
</tr>
<tr>
<td>2021Q1</td>
<td>Swagger文档支持</td>
<td></td>
</tr>
</tbody>
</table>
## Roadmap-2020
<table border="0" class="table table-striped table-bordered ">
<thead>
<tr class="a roadmap">
<th class="table-col1">时间</th>
<th class="table-col2">计划</th>
<th class="table-col3">状态</th>
</tr>
</thead>
<tbody>
<tr >
<td>2020Q4</td>
<td>Docker部署支持</td>
<td></td>
</tr>
<tr >
<td>2020Q3</td>
<td>SAML 2.0优化</td>
<td></td>
</tr>
<tr >
<td>2020Q3</td>
<td>SCIM 2支持</td>
<td></td>
</tr>
<tr >
<td>2020Q3</td>
<td>SpringBoot 2.4.x</td>
<td></td>
</tr>
<tr>
<td>2020Q2</td>
<td>企业微信、钉钉、飞书扫码登录</td>
<td></td>
</tr>
<tr>
<td>2020Q2</td>
<td>RBAC 基于角色的访问控制</td>
<td></td>
</tr>
<tr >
<td>2020Q2</td>
<td>短信验证码支持</td>
<td></td>
</tr>
<tr >
<td>2020Q1</td>
<td>CAS 1.02.03.0支持</td>
<td></td>
</tr>
<tr >
<td>2020Q1</td>
<td>Bootstrap 4.x</td>
<td></td>
</tr>
<tr>
<td>2020Q1</td>
<td>密码策略支持</td>
<td></td>
</tr>
</tbody>
</table>
## Roadmap-2019
<table border="0" class="table table-striped table-bordered ">
<thead>
<tr class="a roadmap">
<th class="table-col1">时间</th>
<th class="table-col2">计划</th>
<th class="table-col3">状态</th>
</tr>
</thead>
<tbody>
<tr>
<td>2019Q4</td>
<td>SpringBoot 2.2.x</td>
<td></td>
</tr>
<tr>
<td>2019Q4</td>
<td>OAuth 2.0支持</td>
<td></td>
</tr>
<tr>
<td>2019Q4</td>
<td>SAML 2.0支持</td>
<td></td>
</tr>
<tr>
<td>2019Q4</td>
<td>JWT支持</td>
<td></td>
</tr>
</tbody>
</table>

View File

@ -0,0 +1,216 @@
---
title: 友情链接
---
# 友情链接
## Dromara成员
Dromara 致力于微服务云原生解决方案的组织。
<div class="row " >
<div class="friendly_links">
<a href="https://hutool.cn/" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/hutool.jpg"
title="🍬小而全的Java工具类库使Java拥有函数式语言般的优雅让Java语言也可以“甜甜的”。"/>
</a>
</div>
<div class="friendly_links">
<a href="https://sa-token.dev33.cn/" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/sa-token.png"
title="一个轻量级 java 权限认证框架,让鉴权变得简单、优雅!"/>
</a>
</div>
<div class="friendly_links">
<a href="https://hertzbeat.com/" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/hertzbeat_brand.jpg" title="易用友好的云监控系统"/>
</a>
</div>
<div class="friendly_links">
<a href="https://gitee.com/dromara/TLog" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/tlog2.png"
title="一个轻量级的分布式日志标记追踪神器10分钟即可接入自动对日志打标签完成微服务的链路追踪"/>
</a>
</div>
<div class=" friendly_links">
<a href="https://gitee.com/dromara/liteFlow" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/liteflow.png"
title="轻量,快速,稳定,可编排的组件式流程引擎"/>
</a>
</div>
</div>
<div class="row " >
<div class=" friendly_links">
<a href="https://gitee.com/dromara/hmily" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/hmily.png" title="高性能一站式分布式事务解决方案。"/>
</a>
</div>
<div class=" friendly_links">
<a href="https://gitee.com/dromara/myth" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/myth.png" title="可靠消息分布式事务解决方案。"/>
</a>
</div>
<div class=" friendly_links">
<a href="https://cubic.jiagoujishu.com/" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/cubic.png"
title="一站式问题定位平台以agent的方式无侵入接入应用完整集成arthas功能模块致力于应用级监控帮助开发人员快速定位问题"/>
</a>
</div>
<div class=" friendly_links">
<a href="http://forest.dtflyx.com/" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/forest-logo.png"
title="Forest能够帮助您使用更简单的方式编写Java的HTTP客户端" />
</a>
</div>
<div class=" friendly_links">
<a href="https://jpom.io/" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/jpom.png"
title="一款简而轻的低侵入式在线构建、自动部署、日常运维、项目监控软件"/>
</a>
</div>
</div>
<div class="row " >
<div class=" friendly_links">
<a href="https://su.usthe.com/" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/sureness.png"
title="面向 REST API 的高性能认证鉴权框架"/>
</a>
</div>
<div class=" friendly_links">
<a href="https://easy-es.cn/" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/easy-es2.png"
title="🚀傻瓜级ElasticSearch搜索引擎ORM框架"/>
</a>
</div>
<div class=" friendly_links">
<a href="https://gitee.com/dromara/northstar" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/northstar_logo.png"
title="Northstar盈富量化交易平台"/>
</a>
</div>
<div class=" friendly_links">
<a href="https://gitee.com/dromara/Raincat" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/raincat.png" title="强一致性分布式事务解决方案。"/>
</a>
</div>
<div class=" friendly_links">
<a href="https://plugins.sheng90.wang/fast-request/" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/fast-request.gif"
title="Idea 版 Postman为简化调试API而生"/>
</a>
</div>
</div>
<div class="row " >
<div class=" friendly_links">
<a href="https://www.jeesuite.com/" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/mendmix.png" title="开源分布式云原生架构一站式解决方案"/>
</a>
</div>
<div class=" friendly_links">
<a href="https://www.x-easypdf.cn" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/koalas-rpc2.png"
title="企业生产级百亿日PV高可用可拓展的RPC框架。"/>
</a>
</div>
<div class=" friendly_links">
<a href="https://async.sizegang.cn/" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/gobrs-async.png"
title="🔥 配置极简功能强大的异步任务动态编排框架"/>
</a>
</div>
<div class=" friendly_links">
<a href="https://dynamictp.cn/" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/dynamic-tp.png"
title="🔥🔥🔥 基于配置中心的轻量级动态可监控线程池"/>
</a>
</div>
<div class=" friendly_links">
<a href="https://www.x-easypdf.cn" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/x-easypdf.png"
title="一个用搭积木的方式构建pdf的框架基于pdfbox"/>
</a>
</div>
</div>
<div class="row " >
<div class=" friendly_links">
<a href="https://www.herodotus.cn/" target="_blank">
<img src="https://www.maxkey.top/doc/images/dromara/dante-cloud2.png"
title="Dante-Cloud 是一款企业级微服务架构和服务能力开发平台。"/>
</a>
</div>
<div class=" friendly_links">
</div>
<div class=" friendly_links">
</div>
<div class=" friendly_links">
</div>
<div class=" friendly_links">
</div>
</div>
<br/>
## 友情链接
为 MaxKey 提供各种帮助和支持的朋友们,我们一起共奋进
<div class="row ">
<div class=" friendly_links">
<img src="https://www.maxkey.top/doc/images/partners/gitee.png" title="gitee"/><br/>
<a href="https://gitee.com/" target="_blank"> gitee </a>
</div>
<div class=" friendly_links">
<img src="https://www.maxkey.top/doc/images/partners/ccflowAD_Smaill.png" title="驰骋BPM官网" /><br/>
<a href="http://ccflow.org/?from=MaxKey" target="_blank"> 驰骋BPM </a>
</div>
<div class=" friendly_links">
<img src="https://www.maxkey.top/doc/images/partners/denglu1.jpg" title="登录易®"/><br/>
<a href="https://www.denglu1.cn/?from=MaxKey" target="_blank"> 登录易</a>
</div>
<div class=" friendly_links">
<img src="https://www.maxkey.top/doc/images/partners/eolink.png"
title="广州银云信息科技有限公司"/><br/>
<a href="https://www.eolinker.com/?from=MaxKey" target="_blank">
Eolink
</a>
</div>
<div class=" friendly_links">
<img src="https://www.maxkey.top/doc/images/partners/aizuda.png" /><br/>
<a href="http://aizuda.com/?from=MaxKey" target="_blank">爱组搭AiZuDa</a>
</div>
</div>
<div class="row " >
<div class=" friendly_links">
<img src="https://www.maxkey.top/doc/images/partners/phalapi.png" title="phalapi"/><br/>
<a href="https://www.phalapi.net/" target="_blank">phalapi</a>
</div>
<div class=" friendly_links">
<img src="https://www.maxkey.top/doc/images/partners/uniadmin.jpg" title="uniadmin"/><br/>
<a href="https://uniadmin.jiangruyi.com/" target="_blank"> uniadmin</a>
</div>
<div class=" friendly_links">
<img src="https://www.maxkey.top/doc/images/partners/collectiveoauth.png" title="CollectiveOAuth"/><br/>
<a href="https://codoc.rthinkingsoft.cn/" target="_blank"> CollectiveOAuth </a>
</div>
<div class=" friendly_links">
<img src="https://www.maxkey.top/doc/images/partners/snowy_logo.png" title="Snowy"/><br/>
<a href="https://www.xiaonuo.vip/?from=MaxKey" target="_blank"> 小诺开源技术 </a>
</div>
<div class=" friendly_links">
<img src="https://www.maxkey.top/doc/images/partners/justauth.png" title="Justauth"/><br/>
<a href="https://justauth.wiki/?from=MaxKey" target="_blank"> Justauth </a>
</div>
</div>
<div class="row " >
<div class=" friendly_links">
</div>
<div class=" friendly_links">
</div>
<div class=" friendly_links">
</div>
<div class=" friendly_links">
</div>
<div class=" friendly_links">
</div>
</div>

View File

@ -0,0 +1,8 @@
{
"label": "关于",
"position": 1,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important Docusaurus concepts."
}
}

View File

@ -0,0 +1,7 @@
{
"label": "侵权通告",
"link": {
"type": "generated-index",
"description": "侵权通告."
}
}

View File

@ -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
<img src="/images/zqjy/1.png" alt=""/>
结果2
<img src="/images/zqjy/2.png" alt=""/>
结果3
<img src="/images/zqjy/3.png" alt=""/>
Authing北京蒸汽记忆科技有限公司旗下有产品和Dromara开源组织的MaxKey单点登录认证系统属于竞争关系Authing明知故犯误导了MaxKey单点登录认证系统的客户侵害了Dromara开源组织的权益触犯了《**中华人民共和国著作权法**》。
## 进展情况
2021年11月21日联系Authing的负责人通知其进行整改
<img src="/images/zqjy/4.jpg" alt=""/>
**2021年11月28日**问题并未得到解决。
**2021年11月29日**通过邮件《10910-关于maxkey单点登录认证系统关键字搜索的问题》告知百度公司存在的问题同时按照百度要求提交软件著作权并申请百度品牌保护保护的品牌为**MaxKey单点登录认证系统MaxKey单点登录**。
**截至2021年12月15日问题还未得到解决特发此通告。**

View File

@ -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
<img src="/images/zqjy2207/1.png" alt=""/>
结果2
<img src="/images/zqjy2207/2.png" alt=""/>
结果3
<img src="/images/zqjy2207/3.png" alt=""/>
Authing北京蒸汽记忆科技有限公司旗下有产品和Dromara开源组织的MaxKey单点登录认证系统属于竞争关系Authing明知故犯误导了MaxKey单点登录认证系统的客户侵害了Dromara开源组织的权益触犯了《**中华人民共和国著作权法**》。
## 进展情况
**2021年11月29日**通过邮件《10910-关于maxkey单点登录认证系统关键字搜索的问题》告知百度公司存在的问题同时按照百度要求提交软件著作权并申请百度品牌保护保护的品牌为**MaxKey单点登录认证系统MaxKey单点登录**。
**截至2022年07月16日问题任未得到解决特发此通告。**

View File

@ -0,0 +1,3 @@
module.exports = {
presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
};

View File

@ -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

View File

@ -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 `<!--` `truncate` `-->` comment to limit blog post size in the list view.
<!--truncate-->
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

View File

@ -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
<button onClick={() => alert('button clicked!')}>Click me!</button>
```
<button onClick={() => alert('button clicked!')}>Click me!</button>
:::

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

View File

@ -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.

View File

@ -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

View File

@ -0,0 +1,8 @@
{
"label": "单点登录",
"position": 6,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important Docusaurus concepts."
}
}

View File

@ -0,0 +1,139 @@
---
title: 常用应用列表
sidebar_position: 4
---
## 常用应用列表
MaxKey与常用应用集成持续更新。。。
<table border="0" class="table table-striped table-bordered ">
<thead>
<tr>
<th>应用名称</th><th>图标</th><th>类型</th><th>文档</th>
</tr>
</thead>
<tbody>
<tr>
<td>阿里云</td>
<td><img src="/images/inteapps/al_aly.gif" width="100px"/></td>
<td>SAAS(云服务)</td>
<td><a href="/docs/am/sso/saml_aly" target="_blank">集成指南</a></td>
</tr>
<tr>
<td>腾讯云</td>
<td><img src="/images/inteapps/tx_txy.gif" width="100px" /></td>
<td>SAAS(云服务)</td>
<td><a href="/docs/am/sso/saml_txy" target="_blank">集成指南</a></td>
</tr>
<tr>
<td>华为云</td>
<td><img src="/images/inteapps/hw_hwy.gif" width="100px" /></td>
<td>SAAS(云服务)</td>
<td></td>
</tr>
<tr>
<td>SalesForce</td>
<td><img src="/images/inteapps/salesforce_crm.gif" width="100px" /></td>
<td>SAAS(云服务)</td>
<td></td>
</tr>
<tr>
<td>腾讯企业邮箱</td>
<td><img src="/images/inteapps/tx_email.gif" width="100px" /></td>
<td>SAAS(云服务)</td>
<td></td>
</tr>
<tr>
<td>华为云速邮箱</td>
<td><img src="/images/inteapps/hw_ysmail.gif" width="100px" /></td>
<td>SAAS(云服务)</td>
<td></td>
</tr>
<tr>
<td>泛微OA</td>
<td><img src="/images/inteapps/weaver_oa.gif" width="100px" /></td>
<td>企业应用</td>
<td></td>
</tr>
<tr>
<td>O2OA</td>
<td><img src="/images/inteapps/o2oa.gif" width="100px" /></td>
<td>企业应用</td>
<td></td>
</tr>
<tr>
<td>GitLab</td>
<td><img src="/images/inteapps/gitlab.gif" width="100px" /></td>
<td>企业应用</td>
<td><a href="/docs/am/integration/gitlab" target="_blank">集成指南</a></td>
</tr>
<tr>
<td>JumpServer</td>
<td><img src="/images/inteapps/jumpserver.gif" width="100px" /></td>
<td>企业应用</td>
<td></td>
</tr>
<tr>
<td>ZABBIX</td>
<td><img src="/images/inteapps/zabbix.png" width="100px" /></td>
<td>企业应用</td>
<td></td>
</tr>
<tr>
<td>Kubernetes</td>
<td><img src="/images/inteapps/k8s.png" width="100px" /></td>
<td>企业应用</td>
<td></td>
</tr>
<tr>
<td>Apache Knox</td>
<td><img src="/images/inteapps/knox.png" width="100px" /></td>
<td>企业应用</td>
<td></td>
</tr>
<tr>
<td>Apache APISIX</td>
<td><img src="/images/inteapps/apisix.png" width="100px" /></td>
<td>企业应用</td>
<td></td>
</tr>
<tr>
<td>Jenkins</td>
<td><img src="/images/inteapps/jenkins.gif" width="100px" /></td>
<td>企业应用</td>
<td><a href="/docs/am/integration/jenkins" target="_blank">集成指南</a></td>
</tr>
<tr>
<td>Liferay Portal</td>
<td><img src="/images/inteapps/liferay.gif" width="100px" /></td>
<td>企业应用</td>
<td></td>
</tr>
<tr>
<td>Grafana</td>
<td><img src="/images/inteapps/grafana.png" width="100px" /></td>
<td>企业应用</td>
<td></td>
</tr>
<tr>
<td>禅道项目管理</td>
<td><img src="/images/inteapps/zentao_pm.gif" width="100px" /></td>
<td>企业应用</td>
<td><a href="/docs/am/integration/zentao" target="_blank">集成指南</a></td>
</tr>
<tr>
<td>Atlassian Confluence</td>
<td><img src="/images/inteapps/atlassian_confluence.png" width="100px" /></td>
<td>企业应用</td>
<td></td>
</tr>
<tr>
<td>Atlassian Jira</td>
<td><img src="/images/inteapps/atlassian_jira.png" width="100px" /></td>
<td>企业应用</td>
<td><a href="/docs/am/integration/jira" target="_blank">集成指南</a></td>
</tr>
</tbody>
</table>

View File

@ -0,0 +1,8 @@
{
"label": "应用集成",
"position": 3,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important concepts."
}
}

View File

@ -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 进⾏账户关联。
<img src="/doc/images/integration/gitlab/1.png" />
<img src="/doc/images/integration/gitlab/2.png" />
关联成功后, 即可使⽤登录⻚的 Oauth2 登录。
### 注意事项
Gitlab 必须要⼿动关联后, 才可单点登录。
https 需要配置 omiauth 的 provider_ignores_state:true 同时需要把 maxkey 的证书放到 gitlab 的
trusted-certs 下, 然后 重新配置 gitlab-ctl reconfigure 就好了。
## MaxKey 配置及登录验证
### 应⽤配置
进⼊后台"应⽤管理" ,编辑应⽤
<img src="/doc/images/integration/gitlab/3.png" />
进入"OAuth2.0 配置",配置如下
<img src="/doc/images/integration/gitlab/4.png" />
### 应⽤访问赋权
如果不在该列表内,可以“新增成员”
### 单点登录验证
重新登录 MaxKey点击"Gitlab"图标单点登录

View File

@ -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

View File

@ -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/
<img src="/doc/images/integration/jenkins/1.png" />
### 认证配置
配置认证服务, 进⼊Configure Global Security 具体配置⼊下
<img src="/doc/images/integration/jenkins/2.png" />
备注配置的URL为http://yourdomain/sign/authz/cas/
## MaxKey 配置及登录验证
### 应⽤配置
进⼊后台"应⽤管理" ,编辑应⽤
<img src="/doc/images/integration/jenkins/3.png" />
进入"CAS配置",配置如下
<img src="/doc/images/integration/jenkins/4.png" />
### 应⽤访问赋权
如果不在该列表内,可以“新增成员”
### 单点登录验证
重新登录MaxKey点击"Jenkins"图标单点登录

View File

@ -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
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxHttpHeaderSize="8192" SSLEnabled="true"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
// highlight-start
keystoreFile="D:/MaxKey/3party/Jira8.13.10/conf/maxkeyserver.keystore" keystorePass="maxkey"
// highlight-end
clientAuth="false" sslProtocol="TLS" useBodyEncodingForURI="true"/>
```
### 认证配置
配置认证服务进入Jira具体配置入下
<img src="/doc/images/integration/jira/1.png" />
<img src="/doc/images/integration/jira/2.png" />
<img src="/doc/images/integration/jira/3.png" />
基本URL更改为https://jira.maxkey.top:8443
<img src="/doc/images/integration/jira/4.png" />
<img src="/doc/images/integration/jira/5.png" />
备注:
单一登录发行者:http://yourdomain/sign/saml
身份提供者单一登录URL:http://yourdomain/sign/authz/saml20/{appid}
用户名映射:```{NameID}```
## MaxKey 配置及登录验证
### 应⽤配置
进⼊后台"应⽤管理" ,编辑应⽤
<img src="/doc/images/integration/jira/6.png" />
进入"SAML配置",配置如下
<img src="/doc/images/integration/jira/7.png" />
### 应⽤访问赋权
如果不在该列表内,可以“新增成员”
### 单点登录验证
重新登录MaxKey点击“Jira”图标单点登录

View File

@ -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本地安装
安装完成后目录
<img src="/doc/images/integration/zentao/1.png" />
运行start.exe
点击“服务”修改端口避免和maxkey冲突
<img src="/doc/images/integration/zentao/2.png" />
去掉”启用Apache用户访问验证”后“启动禅道”
<img src="/doc/images/integration/zentao/3.png" />
## 禅道配置免密登录禅道
https://www.zentao.net/book/zentaopmshelp/344.html
禅道11.5.1版本开始,增加第三方应用免密登录禅道的功能。
下面,我们来介绍一下免密登录的具体配置。
### 添加应用,开启免密登录
登录禅道,到后台--二次开发--应用,添加应用时开启免密登录。
只有免密登录,选择开启后方可使用。
<img src="/doc/images/integration/zentao/4.png" />
### 免密登录的签名机制
以图中红框内容为例假设你的禅道访问地址为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
<img src="/doc/images/integration/zentao/5.png" />
说明:
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 配置及登录验证
### 应⽤配置
进⼊后台"应⽤管理" ,编辑应⽤
<img src="/doc/images/integration/zentao/6.png" />
"API配置",配置如下
<img src="/doc/images/integration/zentao/7.png" />
"扩展配置",配置如下
<img src="/doc/images/integration/zentao/8.png" />
### 应⽤访问赋权
如果不在该列表内,可以“新增成员”
### 单点登录验证
重新登录MaxKey点击"Jenkins"图标单点登录

View File

@ -0,0 +1,8 @@
{
"label": "标准协议",
"position": 2,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important concepts."
}
}

View File

@ -0,0 +1,8 @@
{
"label": "CAS协议集成",
"position": 3,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important concepts."
}
}

View File

@ -0,0 +1,13 @@
---
sidebar_position: 1
title: CAS协议集成
---
# CAS应用集成
本文介绍CAS应用如何与MaxKey进行集成。
## 应用注册
应用在MaxKey管理系统进行注册注册的配置信息如下
![sso_cas_conf](/images/sso/sso_cas_conf.png)

View File

@ -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
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<display-name></display-name>
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<!-- cas server login url -->
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://sso.maxkey.top/sign/authz/cas/login</param-value>
</init-param>
<!-- cas client url, in end of url / is required -->
<init-param>
<param-name>serverName</param-name>
<param-value>http://cas.demo.maxkey.top:8080/</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
<!-- Cas10TicketValidationFilter Cas20ProxyReceivingTicketValidationFilter -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<!-- cas server Validation url -->
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://sso.maxkey.top/sign/authz/cas/</param-value>
</init-param>
<!-- cas client url -->
<init-param>
<param-name>serverName</param-name>
<param-value>http://cas.demo.maxkey.top:8080/</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
```
### 获取登录名及用户属性
```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();
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>Demo CAS</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="CAS Demo">
<link rel="shortcut icon" type="image/x-icon" href="<%=basePath %>/images/favicon.ico"/>
<style type="text/css">
body{
margin: 0;
margin-top: 0px;
margin-left: auto;
margin-right: auto;
padding: 0 0 0 0px;
font-size: 12px;
text-align:center;
float:center;
font-family: "Arial", "Helvetica", "Verdana", "sans-serif";
}
.container {
width: 990px;
margin-left: auto;
margin-right: auto;
padding: 0 10px
}
table.datatable {
border: 1px solid #d8dcdf;
border-collapse:collapse;
border-spacing:0;
width: 100%;
}
table.datatable th{
border: 1px solid #d8dcdf;
border-collapse:collapse;
border-spacing:0;
height: 40px;
}
table.datatable td{
border: 1px solid #d8dcdf;
border-collapse:collapse;
border-spacing:0;
height: 40px;
}
table.datatable td.title{
text-align: center;
font-size: 20px;
font-weight: bold;
}
</style>
</head>
<body>
<div class="container">
<table class="datatable">
<tr>
<td colspan="2" class="title">CAS Demo for MaxKey</td>
</tr>
<tr>
<td>CAS Logo</td>
<td> <img src="<%=basePath %>/images/cas.png"/></td>
</tr>
<tr>
<td width="50%">CAS Assertion</td>
<td><%=username %></td>
</tr>
<tr>
<td>CAS Has Attributes </td>
<td><%=!assertion.getPrincipal().getAttributes().isEmpty() %> size : <%=assertion.getPrincipal().getAttributes().size() %></td>
</tr>
<%
Map<String, Object> attMap = assertion.getPrincipal().getAttributes();
for (Entry<String, Object> 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");
}
%>
<tr>
<td>CAS <%=entry.getKey() %> </td>
<td><%=attributeValue %></td>
</tr>
<%}%>
</table>
</div>
</body>
</html>
```
## SpringBoot CAS配置
源代码地址
https://github.com/MaxKeyTop/MaxKey-SpringBoot4CAS-demo
demo分别写了三个请求:拦截请求 test1/index,test1/index1 以及不拦截请求test1/index2,
### 引入依赖包
```xml
<dependency>
<groupId>net.unicon.cas</groupId>
<artifactId>cas-client-autoconfig-support</artifactId>
<version>2.3.0-GA</version>
</dependency>
```
### 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<String,Object> attributes = casProfile.getAttributes();
Set<Map.Entry<String,Object>> 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

View File

@ -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 = """<!DOCTYPE html>
<html>
<head>
<title>Python CAS Demo</title>
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, minimum-scale=1.0">
</head>
<body>
<h1>Welcome to python-cas Flask MaxKey Demo</h1>
<p><a href="/cas/login">点击MaxKey登录[CAS]</a></p>
</body>
</html>
"""
return body
@app.route('/cas/profile')
def profile(method=['GET']):
if 'username' in session:
return '欢迎 %s. <a href="/cas/logout">Logout</a>' % session['username']
return 'Login required. <a href="/cas/login">退出登录</a>', 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. <a href="/cas/login">Login</a>'
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. <a href="/cas/login">Login</a>'
@app.route('/cas/ping')
def ping():
return 'pong'
```

View File

@ -0,0 +1,16 @@
---
sidebar_position: 7
---
# FormBased应用集成
本文介绍FormBased应用如何与MaxKey进行集成。
## 应用注册
应用在MaxKey管理系统进行注册注册的配置信息如下
![sso_form_yd_conf](/images/sso/sso_form_yd_conf.png)
## 认证定制
可以基于相关的信息定制其他的认证方式。

View File

@ -0,0 +1,8 @@
{
"label": "JWT协议集成",
"position": 5,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important concepts."
}
}

View File

@ -0,0 +1,13 @@
---
sidebar_position: 1
title: JWT协议集成
---
# JWT应用集成
本文介绍JWT应用如何与MaxKey进行集成。
## 应用注册
应用在MaxKey管理系统进行注册注册的配置信息如下
![sso_jwt_conf](/images/sso/sso_jwt_conf.png)

View File

@ -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();
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>JWT 1.0 Demo</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="JWT 1.0 Demo">
<link rel="shortcut icon" type="image/x-icon" href="<%=basePath %>/images/favicon.ico"/>
<script type="text/javascript" src="<%=basePath %>/jquery-3.5.0.min.js"></script>
<script type="text/javascript" src="<%=basePath %>/jsonformatter.js"></script>
<link type="text/css" rel="stylesheet" href="<%=basePath %>/demo.css"/>
</head>
<body>
<div class="container">
<table class="datatable">
<tr>
<td colspan="2" class="title">JSON Web Token (JWT) 1.0 Demo</td>
</tr>
<tr>
<td>JWT 1.0 Logo</td>
<td> <img src="<%=basePath %>/images/jwt.png" width="124px" height="124px"/></td>
</tr>
<tr>
<td>Issuer</td>
<td><%=jwtClaims.getIssuer() %></td>
</tr>
<tr>
<td>Subject</td>
<td><%=jwtClaims.getSubject()%></td>
</tr>
<tr>
<td>Audience</td>
<td><%=jwtClaims.getAudience() %></td>
</tr>
<tr>
<td>ExpirationTime</td>
<td><%=jwtClaims.getExpirationTime() %></td>
</tr>
<tr>
<td>JWTID</td>
<td style="word-wrap: break-word;"><%=jwtClaims.getJWTID() %></td>
</tr>
<tr>
<td>IssueTime</td>
<td style="word-wrap: break-word;"><%=jwtClaims.getIssueTime() %></td>
</tr>
<tr>
<td>Verify</td>
<td style="word-wrap: break-word;"><%=signedJWT.verify(rsaSSAVerifier) %></td>
</tr>
<tr>
<td>JWTClaims</td>
<td style="word-wrap: break-word;">
<textarea cols="68" rows="20" v-model="text2"><%=signedJWT.getPayload() %></textarea>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
FormatTextarea();
</script>
</body>
</html>
```

View File

@ -0,0 +1,46 @@
---
sidebar_position: 2
title: JWT PHP客户端集成
---
## JWT PHP客户端集成
### 引入依赖firebase/php-jwt
```php
composer require firebase/php-jwt
```
### 验证签名
```php
<?php
require 'vendor/autoload.php';
use \Firebase\JWT\JWT;
use \Firebase\JWT\Key;
$publicKey = <<<EOD
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvyfZwQuBLNvJDhmziUCF
uAfIv+bC6ivodcR6PfanTt8XLd6G63Yx10YChAdsDACjoLz1tEU56WPp/ee/vcTS
sEZT3ouWJYghuGI2j4XclXlEj0S7DzdpcBBpI4n5dr8K3iKY+3JUMZR1AMBHI50U
aMST9ZTZJAjUPIYxkhRdca5lWBo4wGUh1yj/80+Bq6al0ia9S5NTzNLaJ18jSxFq
Z79BAkBm+KjkP248YUk6WBGtYEAV5Fws4dpse4hrqJ3RRHiMZV1o1iTmPHz/l55Z
SDP3vpYf6iKqKzoK2RmdjfH5mGpbc4+PclTs4GKfwZ7cWfrny6B7sMnQfzujCH99
6QIDAQAB
-----END PUBLIC KEY-----
EOD;
$jwt = $_POST["jwt"];
echo "jwt:\n" .$jwt. "\n";
$decoded = JWT::decode($jwt, new Key($publicKey, 'RS256'));
/*
* NOTE: This will now be an object instead of an associative array.
* To get an associative array, you will need to cast it as such:
*/
$decoded_array = (array) $decoded;
echo "Decode:\n" . print_r($decoded_array, true) . "\n";
?>
```

View File

@ -0,0 +1,8 @@
{
"label": "OAuth2协议集成",
"position": 1,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important concepts."
}
}

View File

@ -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接口标准
<table border="0" class="table table-striped table-bordered ">
<tr>
<th> <strong>接口 </strong> </th>
<th> <strong>说明 </strong> </th>
<th> <strong>详细说明 </strong> </th>
</tr>
<tr>
<td> /authz/oauth/v20/authorize </td>
<td> 请求用户授权Token </td>
<td> http://sso.maxkey.top/sign接收app sso认证请求,<br/>client_id为需要认证的应用的id;</td>
</tr>
<tr>
<td> /authz/oauth/v20/token </td>
<td> 获取授权过的 Access Token </td>
<td> 后台应用获取 code ,调用接口进行 code 校验;<br/>校验成功获取访问 token </td>
</tr>
<tr>
<td> /api/oauth/v20/me </td>
<td> 授权用户信息查询接口 </td>
<td> 通过访问 token 获取登录用户信息 </td>
</tr>
</table>
### 授权接口
/authz/oauth/v20/authorize
请求用户授权Token
<table border="0" class="table table-striped table-bordered ">
<tr>
<th> 接口名称 </th>
<th> 请求用户授权Token </th>
</tr>
<tr>
<td> url </td>
<td> http://sso.maxkey.top/sign/authz/oauth/v20/authorize</td>
</tr>
<tr>
<td> 请求方式 </td>
<td> http get/post </td>
</tr>
</table>
<h5>请求参数</h5>
<table border="0" class="table table-striped table-bordered ">
<tr>
<th>参数 </th>
<th> 说明 </th>
</tr>
<tr>
<td> client_id </td>
<td> 注册应用时分配的client_id。 </td>
</tr>
<tr>
<td> redirect_uri </td>
<td>应用回调地址,注册时需要配置</td>
</tr>
<tr>
<td>grant_type</td>
<td>授权类型。</td>
</tr>
<tr>
<td>etc param</td>
<td>其他参数。</td>
</tr>
<tr>
<td colspan="2" align="left">
响应返回app应用程序包含请求参数如下
</td>
</tr>
<tr>
<td colspan="2" align="left">
http://app.maxkey.org/app/callback?code =PQ7q7W91a-oMsCeLvIaQm6bTrgtp7
</td>
</tr>
<tr>
<td>code</td>
<td>用于调用/authz/oauth/token接口获取授权后的访问token。</td>
</tr>
</table>
### 令牌接口
/authz/oauth/v20/token
通过/authz/oauth/v20/token用code换取访问token
<table border="0" class="table table-striped table-bordered ">
<tr>
<th> 接口名称 </th>
<th> token 接口 </th>
</tr>
<tr>
<td> url </td>
<td> http://sso.maxkey.top/sign/authz/oauth/v20/token </td>
</tr>
<tr>
<td> 请求方式 </td>
<td> http get/post </td>
</tr>
</table>
<h5>请求参数</h5>
<table border="0" class="table table-striped table-bordered ">
<tr>
<th>参数 </th>
<th> 说明 </th>
</tr>
<tr>
<td> client_id </td>
<td> 注册应用时分配的client_id。 </td>
</tr>
<tr>
<td> client_secret </td>
<td> 注册应用时分配的client_secret</td>
</tr>
<tr>
<td> redirect_uri </td>
<td>应用回调地址,注册时需要配置</td>
</tr>
<tr>
<td>code</td>
<td>调用authz/oauth/v20/authorize获得的code值。</td>
</tr>
<tr>
<td>grant_type</td>
<td>授权类型。Grant type</td>
</tr>
<tr>
<td>username</td>
<td>当grant_type=password时此参数表示直接认证用户名。</td>
</tr>
<tr>
<td>password</td>
<td>当grant_type=password时此参数表示直接认证用户密码。</td>
</tr>
<tr>
<td>etc param</td>
<td>其他参数</td>
</tr>
<tr align="left">
<td colspan="2" align="left">
实际请求如下:
```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
```
</td>
</tr>
<tr>
<td colspan="2" align="left">
返回数据
</td>
</tr>
<tr>
<td colspan="2" align="left">
A successful response to this request contains the following fields:
</td>
</tr>
<tr>
<td>access_token</td>
<td>用该token能调用SSO的API</td>
</tr>
<tr>
<td colspan="2">
成功返回JSON数据如下
```json
{
"access_token":"token_id",
"id_token":"id_token"
}
```
</td>
</tr>
</table>
### 用户属性接口
/api/oauth/v20/me
<table border="0" class="table table-striped table-bordered ">
<tr>
<th> 接口名称 </th>
<th> token 接口 </th>
</tr>
<tr>
<td> url </td>
<td>http://sso.maxkey.top/sign/api/oauth/v20/me</td>
</tr>
<tr>
<td> 请求方式 </td>
<td> http get/post </td>
</tr>
</table>
<h5>请求参数</h5>
<table border="0" class="table table-striped table-bordered ">
<tr>
<th>参数 </th>
<th> 说明 </th>
</tr>
<tr>
<td> access_token </td>
<td> 调用sso/ token获得的token值。 </td>
</tr>
<tr align="left">
<td colspan="2" align="left">
实际请求如下:
```http
POST /oauth/ userinfo HTTP/1.1
Host: sso.maxkey.org/openapi
Content-Type: application/x-www-form-urlencoded
access_token= PQ7q7W91a-oMsCeLvIaQm6bTrgtp7
```
</td>
</tr>
<tr>
<td colspan="2" align="left">
返回数据/ response data
</td>
</tr>
<tr>
<td colspan="2">
<p>成功返回JSON数据如下</p>
```json
{
"userid":"zhangs"
}
```
<br/>
zhangs是认证的用户ID
</td>
</tr>
</table>
OAuth认证接口属性列表
<table border="0" class="table table-striped table-bordered ">
<tr >
<th> 属性名(Attribute) </th>
<th> 描述 </th>
<th>数据类型</th>
</tr>
<tr>
<td>uid</td>
<td>uid</td>
<td>字符串</td>
</tr>
</table>
## OAuth2.0 错误码
MaxKey OAuth2.0实现中授权服务器在接收到验证授权请求时会按照OAuth2.0协议对本请求的请求头部.请求参数进行检验,若请求不合法或验证未通过,授权服务器会返回相应的错误信息,包含以下几个参数:
error: 错误码
error_description: 错误的描述信息
错误信息的返回方式有两种:
当请求授权Endpointhttp://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错误响应中的错误码定义如下表所示:
<table border="0" class="table table-striped table-bordered ">
<thead>
<th>编号</th><th>错误码(error)</th><th>描述(error_description)</th>
</thead>
<tbody>
<tr>
<td>1</td>
<td>empty_client_id</td>
<td>参数client_id为空</td>
</tr>
<tr>
<td>2</td>
<td>empty_client_secret</td>
<td>参数client_secret为空</td>
</tr>
<tr>
<td>3</td>
<td>empty_redirect_uri</td>
<td>参数redirect_uri为空</td>
</tr>
<tr>
<td>4</td>
<td>empty_response_type</td>
<td>参数response_type为空</td>
</tr>
<tr>
<td>5</td>
<td>empty_code</td>
<td>code为空</td>
</tr>
<tr>
<td>6</td>
<td>app_unsupport_sso</td>
<td>应用不支持sso登录</td>
</tr>
<tr>
<td>7</td>
<td>app_unsupport_oauth</td>
<td>应用不支持OAuth认证</td>
</tr>
<tr>
<td>8</td>
<td>invalid_client_id</td>
<td>非法的client_id</td>
</tr>
<tr>
<td>9</td>
<td>invalid_response_type</td>
<td>非法的response_type</td>
</tr>
<tr>
<td>10</td>
<td>invalid_scope</td>
<td>非法的scope</td>
</tr>
<tr>
<td>11</td>
<td>invalid_grant_type</td>
<td>非法的grant_type</td>
</tr>
<tr>
<td>12</td>
<td>redirect_uri_mismatch</td>
<td>非法的redirect_uri</td>
</tr>
<tr>
<td>13</td>
<td>unsupported_response_type</td>
<td>不支持传递的response_type</td>
</tr>
<tr>
<td>14</td>
<td>invalid_code</td>
<td>非法的code</td>
</tr>
<tr>
<td>15</td>
<td>unsupported_refresh_token</td>
<td>不支持refresh_token的方式</td>
</tr>
<tr>
<td>16</td>
<td>access_token_exprise</td>
<td>access_token过期</td>
</tr>
<tr>
<td>17</td>
<td>invalid_access_token</td>
<td>非法的access_token</td>
</tr>
<tr>
<td>18</td>
<td>invalid_refresh_token</td>
<td>非法的refresh_token</td>
</tr>
<tr>
<td>19</td>
<td>refresh_token_exprise</td>
<td>refresh_token过期</td>
</tr>
</tbody>
</table>

View File

@ -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);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>OAuth 2.0 SSO</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<a href="<%=authorizationUrl%>&approval_prompt=auto">oauth 2.0 sso</a>
</body>
</html>
```
### 获取令牌及用户信息
```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());
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>OAuth V2.0 Demo</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="OAuth V2.0 Demo">
<link rel="shortcut icon" type="image/x-icon" href="<%=basePath %>/images/favicon.ico"/>
<script type="text/javascript" src="<%=basePath %>/jquery-3.5.0.min.js"></script>
<script type="text/javascript" src="<%=basePath %>/jsonformatter.js"></script>
<link type="text/css" rel="stylesheet" href="<%=basePath %>/demo.css"/>
</head>
<body>
<div class="container">
<table class="datatable">
<tr>
<td colspan="2" class="title">OAuth V2.0 Demo</td>
</tr>
<tr>
<td width="50%">OAuth V2.0 Logo</td>
<td width="50%"> <img src="<%=basePath %>/images/oauth-2-sm.png" width="124px" height="124px"/></td>
</tr>
<tr>
<td>Login</td>
<td><%=userInfo.getUsername() %></td>
</tr>
<tr>
<td>DisplayName</td>
<td><%=userInfo.getDisplayName() %></td>
</tr>
<tr>
<td>Department</td>
<td><%=userInfo.getDepartment() %></td>
</tr>
<tr>
<td>JobTitle</td>
<td><%=userInfo.getJobTitle() %></td>
</tr>
<tr>
<td>email</td>
<td><%=userInfo.getEmail() %></td>
</tr>
<tr>
<td>ResponseString</td>
<td style="word-wrap: break-word;">
<textarea cols="68" rows="20" v-model="text2"><%=userInfo.getResponseString() %></textarea>
</td>
</tr>
</table>
<script type="text/javascript">
FormatTextarea();
</script>
</div>
</body>
</html>
```
## 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

View File

@ -0,0 +1,8 @@
{
"label": "OIDC协议集成",
"position": 2,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important concepts."
}
}

View File

@ -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 获取登录用户信息及签名信息,在程序中必须验证相关的签名信息。
<table border="0" class="table table-striped table-bordered ">
<tr>
<th> 接口名称 </th>
<th> OIDC授权用户信息查询接口 </th>
</tr>
<tr>
<td> url </td>
<td>https://sso.maxkey.org/sign/api/connect/v10/userinfo</td>
</tr>
<tr>
<td> 请求方式 </td>
<td> http get/post </td>
</tr>
</table>
<h5>请求参数</h5>
<table border="0" class="table table-striped table-bordered ">
<tr>
<th>参数 </th>
<th> 说明 </th>
</tr>
<tr>
<td> access_token </td>
<td> 调用sso/ token获得的token值。 </td>
</tr>
<tr align="left">
<td colspan="2" align="left">
实际请求如下:
```http
POST /oauth/userinfo HTTP/1.1
Host: sso.maxkey.org/openapi
Content-Type: application/x-www-form-urlencoded
access_token= PQ7q7W91a-oMsCeLvIaQm6bTrgtp7
```
</td>
</tr>
<tr>
<td colspan="2" align="left">
返回数据/ response data
</td>
</tr>
<tr>
<td colspan="2">
<p>成功返回JSON数据如下</p>
```json
{
userid : "zhangs"
}
```
<br/>
zhangs是认证的用户ID
</td>
</tr>
</table>
OAuth认证接口属性列表
<table border="0" class="table table-striped table-bordered ">
<tr >
<th> 属性名(Attribute) </th>
<th> 描述 </th>
<th>数据类型</th>
</tr>
<tr>
<td>uid</td>
<td>uid</td>
<td>字符串</td>
</tr>
</table>
其他请参照OAuth2

View File

@ -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);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>OIDC V1 SSO</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<a href="<%=authorizationUrl%>&approval_prompt=auto">OIDC V1 SSO</a>
</body>
</html>
```
### 登录验证
获取令牌、用户信息及验证签名 (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());
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>OpenID Connect 1.0 Demo</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="OpenID Connect 1.0 Demo">
<link rel="shortcut icon" type="image/x-icon" href="<%=basePath %>/images/favicon.ico"/>
<script type="text/javascript" src="<%=basePath %>/jquery-3.5.0.min.js"></script>
<script type="text/javascript" src="<%=basePath %>/jsonformatter.js"></script>
<link type="text/css" rel="stylesheet" href="<%=basePath %>/demo.css"/>
</head>
<body>
<div class="container">
<table class="datatable">
<tr>
<td colspan="2" class="title">OpenID Connect 1.0 Demo</td>
</tr>
<tr>
<td>OpenID Connect 1.0 Logo</td>
<td> <img src="<%=basePath %>/images/openid.png" width="124px" height="124px"/></td>
</tr>
<tr>
<td>Login</td>
<td><%=userInfo.getSub() %></td>
</tr>
<tr>
<td>DisplayName</td>
<td><%=userInfo.getName()%></td>
</tr>
<tr>
<td>Department</td>
<td><%=userInfo.getGender() %></td>
</tr>
<tr>
<td>email</td>
<td><%=userInfo.getEmail() %></td>
</tr>
<tr>
<td>ResponseString</td>
<td style="word-wrap: break-word;">
<textarea cols="68" rows="20" v-model="text2"><%=userInfo.getResponseString() %></textarea>
</td>
</tr>
<tr>
<td>Id_token</td>
<td style="word-wrap: break-word;"><%=accessToken.getId_token() %></td>
</tr>
<tr>
<td>Verify</td>
<td style="word-wrap: break-word;"><%=signedJWT.verify(rsaSSAVerifier) %></td>
</tr>
<tr>
<td>Issuer</td>
<td style="word-wrap: break-word;"><%=signedJWT.getJWTClaimsSet().getIssuer() %></td>
</tr>
<tr>
<td>JWTClaims</td>
<td style="word-wrap: break-word;">
<textarea cols="68" rows="20" v-model="text2"><%=signedJWT.getPayload() %></textarea>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
FormatTextarea();
</script>
</body>
</html>
```

View File

@ -0,0 +1,8 @@
{
"label": "SAML协议集成",
"position": 4,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important concepts."
}
}

View File

@ -0,0 +1,23 @@
---
sidebar_position: 1
title: SAML阿里云集成
---
# SAML阿里云集成
本文介绍阿里云使用SAML如何与MaxKey进行集成。
<h2>应用注册</h2>
1)首先需要注册<a href="https://www.aliyun.com/" target="_blank" >阿里云</a>并开通SAML认证功能下载阿里云SAML元数据具体说明文档请参照
访问控制 &gt; 单点登录管理SSO &gt; <a href="https://helpcdn.aliyun.com/document_detail/93684.html?spm=a2c4g.11186623.3.2.39a64d7bn76ODT" target="_blank" >SSO概览 </a>
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元数据上传到阿里云参照阿里云文档

View File

@ -0,0 +1,5 @@
---
sidebar_position: 3
---
# SAMLSalesForce集成
TODO

View File

@ -0,0 +1,21 @@
---
sidebar_position: 2
---
# SAML腾讯云集成
本文介绍腾讯云使用SAML如何与MaxKey进行集成。
<h2>应用注册</h2>
1)首先需要注册<a href="https://cloud.tencent.com/" target="_blank" >腾讯云</a>并开通SAML认证功能下载腾讯云SAML元数据具体说明文档请参照
文档中心&gt;访问管理&gt;用户指南&gt;<a href="https://cloud.tencent.com/document/product/598/30283" target="_blank" >身份提供商 </a>
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元数据上传到腾讯云参照腾讯云文档

View File

@ -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);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>SimpleBasedToken Demo</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="SimpleBasedToken Demo">
<link rel="shortcut icon" type="image/x-icon" href="<%=basePath %>/images/favicon.ico"/>
<link type="text/css" rel="stylesheet" href="<%=basePath %>/demo.css"/>
</head>
<body>
<div class="container">
<table class="datatable">
<tr>
<td colspan="2" class="title">SimpleBasedToken Demo</td>
</tr>
<tr>
<td>SimpleBasedToken Logo</td>
<td> <img src="<%=basePath %>images/simple.png" width="124px" height="124px"/></td>
</tr>
<tr>
<td>UserName</td>
<td><%=parseToken[0]%></td>
</tr>
<tr>
<td>Authentication at Time</td>
<td><%=parseToken[1]%></td>
</tr>
</table>
</div>
</body>
</html>
```
### 基于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);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>JsonBasedToken Demo</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="JsonBasedToken Demo">
<link rel="shortcut icon" type="image/x-icon" href="<%=basePath %>/images/favicon.ico"/>
<link type="text/css" rel="stylesheet" href="<%=basePath %>/demo.css"/>
</head>
<body>
<div class="container">
<table class="datatable">
<tr>
<td colspan="2" class="title">JsonBasedToken Demo</td>
</tr>
<tr>
<td>JsonBasedToken Logo</td>
<td> <img src="<%=basePath %>images/json.png" width="124px" height="124px"/></td>
</tr>
<tr>
<td>UID</td>
<td><%=tokenMap.get("uid") %></td>
</tr>
<tr>
<td>UserName</td>
<td><%=tokenMap.get("username") %></td>
</tr>
<tr>
<td>Department</td>
<td><%=tokenMap.get("department") %></td>
</tr>
<tr>
<td>Email</td>
<td><%=tokenMap.get("email") %></td>
</tr>
<tr>
<td>Authentication at Time</td>
<td><%=tokenMap.get("at")%></td>
</tr>
<tr>
<td>Expires</td>
<td><%=tokenMap.get("expires")%></td>
</tr>
</table>
</div>
</body>
</html>
```
### 基于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);
}
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>LTPA Demo</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="LTPA Demo">
<link rel="shortcut icon" type="image/x-icon" href="<%=basePath %>/images/favicon.ico"/>
<link type="text/css" rel="stylesheet" href="<%=basePath %>/demo.css"/>
</head>
<body>
<div class="container">
<table class="datatable">
<tr>
<td colspan="2" class="title">LTPA Demo</td>
</tr>
<tr>
<td>LTPA Logo</td>
<td> <img src="<%=basePath %>images/ltpa.png" width="124px" height="124px"/></td>
</tr>
<tr>
<td>UID</td>
<td><%=tokenMap.get("uid") %></td>
</tr>
<tr>
<td>UserName</td>
<td><%=tokenMap.get("username") %></td>
</tr>
<tr>
<td>Department</td>
<td><%=tokenMap.get("department") %></td>
</tr>
<tr>
<td>Email</td>
<td><%=tokenMap.get("email") %></td>
</tr>
<tr>
<td>Authentication at Time</td>
<td><%=tokenMap.get("at")%></td>
</tr>
<tr>
<td>Expires</td>
<td><%=tokenMap.get("expires")%></td>
</tr>
</table>
</div>
</body>
</html>
```

View File

@ -0,0 +1,16 @@
---
title: 单点登录UI
sidebar_position: 1
---
# 单点登录UI
## 登录视图
![登录视图](/images/maxkey_login.png)
## 应用视图
![应用视图](/images/maxkey_index.png)

View File

@ -0,0 +1,8 @@
{
"label": "API接口",
"position": 10,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important concepts."
}
}

View File

@ -0,0 +1,75 @@
---
title: 认证总地址接口
sidebar_position: 11
---
## 认证总地址接口
**接口地址**:`/sign/authz/{id}`
**请求方式**:`GET`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>参数应用ID分发到不同应用的认证地址</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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|
|&emsp;&emsp;contentType||string||
|viewName||string||
**响应示例**:
```javascript
{
"empty": true,
"model": {},
"modelMap": {},
"reference": true,
"status": "",
"view": {
"contentType": ""
},
"viewName": ""
}
```

View File

@ -0,0 +1,57 @@
---
title: CAS 1.0 ticket验证接口
---
## CAS 1.0 ticket验证接口
**接口地址**:`/sign/authz/cas/validate`
**请求方式**:`POST`
**请求数据类型**:`application/json`
**响应数据类型**:`*/*`
**接口描述**:<p>通过ticket获取当前登录用户信息</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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
```

View File

@ -0,0 +1,59 @@
---
title: CAS 2.0 ticket代理验证接口
---
## CAS 2.0 ticket代理验证接口
**接口地址**:`/sign/authz/cas/proxyValidate`
**请求方式**:`POST`
**请求数据类型**:`application/json`
**响应数据类型**:`application/xml`
**接口描述**:<p>通过ticket获取当前登录用户信息</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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
```

View File

@ -0,0 +1,59 @@
---
title: CAS 2.0 ticket验证接口
---
## CAS 2.0 ticket验证接口
**接口地址**:`/sign/authz/cas/serviceValidate`
**请求方式**:`POST`
**请求数据类型**:`application/json`
**响应数据类型**:`application/xml`
**接口描述**:<p>通过ticket获取当前登录用户信息</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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
```

View File

@ -0,0 +1,57 @@
---
title: CAS 3.0 ProxyTicket代理验证接口
---
## CAS 3.0 ProxyTicket代理验证接口
**接口地址**:`/sign/authz/cas/p3/proxy`
**请求方式**:`POST`
**请求数据类型**:`application/json`
**响应数据类型**:`*/*`
**接口描述**:<p>通过ProxyGrantingTicket获取ProxyTicket</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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
```

View File

@ -0,0 +1,59 @@
---
title: CAS 3.0 ticket代理验证接口
---
## CAS 3.0 ticket代理验证接口
**接口地址**:`/sign/authz/cas/p3/proxyValidate`
**请求方式**:`POST`
**请求数据类型**:`application/json`
**响应数据类型**:`*/*`
**接口描述**:<p>通过ProxyTicket获取当前登录用户信息</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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
```

View File

@ -0,0 +1,59 @@
---
title: CAS 3.0 ticket验证接口
---
## CAS 3.0 ticket验证接口
**接口地址**:`/sign/authz/cas/p3/serviceValidate`
**请求方式**:`POST`
**请求数据类型**:`application/json`
**响应数据类型**:`*/*`
**接口描述**:<p>通过ticket获取当前登录用户信息</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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
```

View File

@ -0,0 +1,8 @@
{
"label": "CAS接口",
"position": 2,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important concepts."
}
}

View File

@ -0,0 +1,74 @@
---
title: CAS页面跳转应用ID认证接口
---
## CAS页面跳转应用ID认证接口
**接口地址**:`/sign/authz/cas/{id}`
**请求方式**:`GET`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>传递参数应用ID</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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|
|&emsp;&emsp;contentType||string||
|viewName||string||
**响应示例**:
```javascript
{
"empty": true,
"model": {},
"modelMap": {},
"reference": true,
"status": "",
"view": {
"contentType": ""
},
"viewName": ""
}
```

View File

@ -0,0 +1,8 @@
{
"label": "REST认证接口",
"position": 4,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important concepts."
}
}

View File

@ -0,0 +1,60 @@
---
title: ServiceTicket接口
---
## CAS REST认证接口
**接口地址**:`/sign/authz/cas/v1/tickets/{ticketGrantingTicket}`
**请求方式**:`POST`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>通过TGT获取ST</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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
```

View File

@ -0,0 +1,55 @@
---
title: ticketGrantingTicket接口
---
## CAS REST认证接口
**接口地址**:`/sign/authz/cas/v1/tickets/{ticketGrantingTicket}`
**请求方式**:`GET`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>检查TGT状态</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|ticketGrantingTicket|ticketGrantingTicket|path|true|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK||
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
**响应参数**:
暂无
**响应示例**:
```text
string
```

View File

@ -0,0 +1,55 @@
---
title: 注销TGT状态接口
---
## CAS REST认证接口
**接口地址**:`/sign/authz/cas/v1/tickets/{ticketGrantingTicket}`
**请求方式**:`DELETE`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>注销TGT状态</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|ticketGrantingTicket|ticketGrantingTicket|path|true|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK||
|204|No Content||
|401|Unauthorized||
|403|Forbidden||
**响应参数**:
暂无
**响应示例**:
```text
string
```

View File

@ -0,0 +1,58 @@
---
title: CAS REST认证接口
---
## CAS REST认证接口
**接口地址**:`/sign/authz/cas/v1/tickets`
**请求方式**:`POST`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>通过用户名密码获取TGT</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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
```

View File

@ -0,0 +1,58 @@
---
title: 用户名密码登录接口
---
## CAS REST认证接口
**接口地址**:`/sign/authz/cas/v1/users`
**请求方式**:`POST`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>用户名密码登录接口</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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
```

View File

@ -0,0 +1,74 @@
---
title: CAS页面跳转service认证接口
---
## CAS页面跳转service认证接口
**接口地址**:`/sign/authz/cas/login`
**请求方式**:`GET`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>传递参数service</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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|
|&emsp;&emsp;contentType||string||
|viewName||string||
**响应示例**:
```javascript
{
"empty": true,
"model": {},
"modelMap": {},
"reference": true,
"status": "",
"view": {
"contentType": ""
},
"viewName": ""
}
```

View File

@ -0,0 +1,74 @@
---
title: CAS注销接口
---
## CAS注销接口
**接口地址**:`/sign/authz/cas/logout`
**请求方式**:`GET`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>CAS注销接口</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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|
|&emsp;&emsp;contentType||string||
|viewName||string||
**响应示例**:
```javascript
{
"empty": true,
"model": {},
"modelMap": {},
"reference": true,
"status": "",
"view": {
"contentType": ""
},
"viewName": ""
}
```

View File

@ -0,0 +1,75 @@
---
title: ExtendApi接口
sidebar_position: 6
---
## ExtendApi认证地址接口
**接口地址**:`/sign/authz/api/{id}`
**请求方式**:`GET`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>参数应用ID</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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|
|&emsp;&emsp;contentType||string||
|viewName||string||
**响应示例**:
```javascript
{
"empty": true,
"model": {},
"modelMap": {},
"reference": true,
"status": "",
"view": {
"contentType": ""
},
"viewName": ""
}
```

View File

@ -0,0 +1,75 @@
---
title: FormBased接口
sidebar_position: 7
---
## FormBased认证地址接口
**接口地址**:`/sign/authz/formbased/{id}`
**请求方式**:`GET`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>参数应用ID</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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|
|&emsp;&emsp;contentType||string||
|viewName||string||
**响应示例**:
```javascript
{
"empty": true,
"model": {},
"modelMap": {},
"reference": true,
"status": "",
"view": {
"contentType": ""
},
"viewName": ""
}
```

View File

@ -0,0 +1,75 @@
---
title: JWT接口
sidebar_position: 4
---
## JWT应用ID认证接口
**接口地址**:`/sign/authz/jwt/{id}`
**请求方式**:`GET`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>应用ID</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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|
|&emsp;&emsp;contentType||string||
|viewName||string||
**响应示例**:
```javascript
{
"empty": true,
"model": {},
"modelMap": {},
"reference": true,
"status": "",
"view": {
"contentType": ""
},
"viewName": ""
}
```

View File

@ -0,0 +1,73 @@
---
title: 登录接口
sidebar_position: 8
---
## 登录接口
**接口地址**:`/sign/login`
**请求方式**:`GET`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>用户登录地址</p>
**请求参数**:
**请求参数**:
暂无
**响应状态**:
| 状态码 | 说明 | 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|
|&emsp;&emsp;contentType||string||
|viewName||string||
**响应示例**:
```javascript
{
"empty": true,
"model": {},
"modelMap": {},
"reference": true,
"status": "",
"view": {
"contentType": ""
},
"viewName": ""
}
```

View File

@ -0,0 +1,75 @@
---
title: 单点注销接口
sidebar_position: 9
---
## 单点注销接口
**接口地址**:`/sign/force/logout`
**请求方式**:`GET`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>redirect_uri跳转地址</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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|
|&emsp;&emsp;contentType||string||
|viewName||string||
**响应示例**:
```javascript
{
"empty": true,
"model": {},
"modelMap": {},
"reference": true,
"status": "",
"view": {
"contentType": ""
},
"viewName": ""
}
```

View File

@ -0,0 +1,8 @@
{
"label": "OAuth2接口",
"position": 1,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important concepts."
}
}

View File

@ -0,0 +1,77 @@
---
title: 认证接口
sidebar_position: 1
---
## OAuth 2.0 认证接口
**接口地址**:`/sign/authz/oauth/v20/authorize`
**请求方式**:`GET`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>传递参数client_id,response_type,redirect_uri等</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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|
|&emsp;&emsp;contentType||string||
|viewName||string||
**响应示例**:
```javascript
{
"empty": true,
"model": {},
"modelMap": {},
"reference": true,
"status": "",
"view": {
"contentType": ""
},
"viewName": ""
}
```

View File

@ -0,0 +1,75 @@
---
title: 认证ID接口
sidebar_position: 2
---
## OAuth 2.0 认证ID接口
**接口地址**:`/sign/authz/oauth/v20/{id}`
**请求方式**:`GET`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>传递参数应用ID自动完成跳转认证拼接</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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|
|&emsp;&emsp;contentType||string||
|viewName||string||
**响应示例**:
```javascript
{
"empty": true,
"model": {},
"modelMap": {},
"reference": true,
"status": "",
"view": {
"contentType": ""
},
"viewName": ""
}
```

View File

@ -0,0 +1,56 @@
---
title: Token检查接口
sidebar_position: 6
---
## OAuth 2.0 token检查接口
**接口地址**:`/sign/authz/oauth/v20/check_token`
**请求方式**:`POST`
**请求数据类型**:`application/json`
**响应数据类型**:`*/*`
**接口描述**:<p>传递参数token</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|token|token|query|true|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK||
|204|No Content||
|401|Unauthorized||
|403|Forbidden||
**响应参数**:
暂无
**响应示例**:
```text
object
```

View File

@ -0,0 +1,57 @@
---
title: 用户信息接口
sidebar_position: 4
---
## OAuth 2.0 用户信息接口
**接口地址**:`/sign/api/oauth/v20/me`
**请求方式**:`GET`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>传递参数access_token</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|access_token|access_token|query|false|string||
|authorization|authorization|header|false|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK||
|204|No Content||
|401|Unauthorized||
|403|Forbidden||
**响应参数**:
暂无
**响应示例**:
```javascript
```

View File

@ -0,0 +1,56 @@
---
title: OIDC 用户信息接口
sidebar_position: 5
---
## OIDC 用户信息接口
**接口地址**:`/sign/api/connect/v10/userinfo`
**请求方式**:`GET`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>传递Authorization参数access_token</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|Authorization|Authorization|header|true|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK||
|204|No Content||
|401|Unauthorized||
|403|Forbidden||
**响应参数**:
暂无
**响应示例**:
```text
string
```

View File

@ -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`
**响应数据类型**:`*/*`
**接口描述**:<p>传递参数token等</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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|
|&emsp;&emsp;additionalInformation||object||
|&emsp;&emsp;cause||Throwable|Throwable|
|&emsp;&emsp;&emsp;&emsp;cause||Throwable|Throwable|
|&emsp;&emsp;&emsp;&emsp;localizedMessage||string||
|&emsp;&emsp;&emsp;&emsp;message||string||
|&emsp;&emsp;&emsp;&emsp;stackTrace||array|StackTraceElement|
|&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;className||string||
|&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;fileName||string||
|&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;lineNumber||integer||
|&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;methodName||string||
|&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;nativeMethod||boolean||
|&emsp;&emsp;&emsp;&emsp;suppressed||array|Throwable|
|&emsp;&emsp;httpErrorCode||integer(int32)||
|&emsp;&emsp;localizedMessage||string||
|&emsp;&emsp;message||string||
|&emsp;&emsp;oauth2ErrorCode||string||
|&emsp;&emsp;stackTrace||array|StackTraceElement|
|&emsp;&emsp;&emsp;&emsp;className||string||
|&emsp;&emsp;&emsp;&emsp;fileName||string||
|&emsp;&emsp;&emsp;&emsp;lineNumber||integer||
|&emsp;&emsp;&emsp;&emsp;methodName||string||
|&emsp;&emsp;&emsp;&emsp;nativeMethod||boolean||
|&emsp;&emsp;summary||string||
|&emsp;&emsp;suppressed||array|Throwable|
|&emsp;&emsp;&emsp;&emsp;cause||Throwable|Throwable|
|&emsp;&emsp;&emsp;&emsp;localizedMessage||string||
|&emsp;&emsp;&emsp;&emsp;message||string||
|&emsp;&emsp;&emsp;&emsp;stackTrace||array|StackTraceElement|
|&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;className||string||
|&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;fileName||string||
|&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;lineNumber||integer||
|&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;methodName||string||
|&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;nativeMethod||boolean||
|&emsp;&emsp;&emsp;&emsp;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": ""
}
```

View File

@ -0,0 +1,8 @@
{
"label": "SAML接口",
"position": 3,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important concepts."
}
}

View File

@ -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`
**响应数据类型**:`*/*`
**接口描述**:<p>传递参数应用ID</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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|
|&emsp;&emsp;contentType||string||
|viewName||string||
**响应示例**:
```javascript
{
"empty": true,
"model": {},
"modelMap": {},
"reference": true,
"status": "",
"view": {
"contentType": ""
},
"viewName": ""
}
```

View File

@ -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|
|&emsp;&emsp;contentType||string||
|viewName||string||
**响应示例**:
```javascript
{
"empty": true,
"model": {},
"modelMap": {},
"reference": true,
"status": "",
"view": {
"contentType": ""
},
"viewName": ""
}
```

View File

@ -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`
**接口描述**:<p>参数Idp_Metadata_应用ID</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
|appid|appid|path|true|string||
**响应状态**:
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
|200|OK||
|204|No Content||
|401|Unauthorized||
|403|Forbidden||
**响应参数**:
暂无
**响应示例**:
```text
string
```

View File

@ -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`
**响应数据类型**:`*/*`
**接口描述**:<p>传递参数应用ID</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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|
|&emsp;&emsp;contentType||string||
|viewName||string||
**响应示例**:
```javascript
{
"empty": true,
"model": {},
"modelMap": {},
"reference": true,
"status": "",
"view": {
"contentType": ""
},
"viewName": ""
}
```

View File

@ -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
```

View File

@ -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|
|&emsp;&emsp;contentType||string||
|viewName||string||
**响应示例**:
```javascript
{
"empty": true,
"model": {},
"modelMap": {},
"reference": true,
"status": "",
"view": {
"contentType": ""
},
"viewName": ""
}
```

View File

@ -0,0 +1,75 @@
---
title: TokenBased接口
sidebar_position: 5
---
## TokenBased认证接口
**接口地址**:`/sign/authz/tokenbased/{id}`
**请求方式**:`GET`
**请求数据类型**:`application/x-www-form-urlencoded`
**响应数据类型**:`*/*`
**接口描述**:<p>传递参数应用ID</p>
**请求参数**:
**请求参数**:
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | 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|
|&emsp;&emsp;contentType||string||
|viewName||string||
**响应示例**:
```javascript
{
"empty": true,
"model": {},
"modelMap": {},
"reference": true,
"status": "",
"view": {
"contentType": ""
},
"viewName": ""
}
```

View File

@ -0,0 +1,8 @@
{
"label": "学院",
"position": 11,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important Docusaurus concepts."
}
}

View File

@ -0,0 +1,3 @@
---
layout: zh/default
---

View File

@ -0,0 +1,8 @@
{
"label": "单点登录协议",
"position": 1,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important Docusaurus concepts."
}
}

View File

@ -0,0 +1,58 @@
---
title: CAS协议
sidebar_position: 3
---
## CAS简介
CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:
CAS的目标是允许用户访问多个应用程序只提供一次用户凭据如用户名和密码。它还允许Web应用程序对用户进行身份验证而不必获取用户的安全凭证比如密码。
<ol>
<li>一个开放的,文档齐全的协议。</li>
<li>开源的JAVA服务器组件。</li>
<li>CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。</li>
<li>与uPortal, BlueSocket, TikiWiki, Mule, Liferay, Moodle等等能很好集成。</li>
<li>文档社区化和实现的支持。</li>
<li>具有广泛的客户群的支持。</li>
</ol>
扩展阅读参看:官方技术说明<a href="https://www.apereo.org/cas" title="https://www.apereo.org/cas" target="_blank" rel="nofollow">CAS官方网站en </a> | <a href="http://en.wikipedia.org/wiki/Central_Authentication_Service" title="http://en.wikipedia.org/wiki/Central_Authentication_Service" target="_blank" rel="nofollow">CAS维基百科en</a>
## 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 CookieTGCCAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 56 步中与 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签发的。

View File

@ -0,0 +1,43 @@
---
title: FormBased代填
sidebar_position: 7
---
## FormBased介绍
HTTP+HTML FormBased(基于表单)的认证目前一般简单的基于表单的认证是一种登录技术即一个网站使用一个Web表单收集并随后进行身份验证认证的凭证信息来源于用户代理通常web浏览器。 (请注意,短语“基于表单的认证”是不明确的。请参阅进一步解释基于表单的认证。)
## 交互概要
该技术的实现步骤是:
<ol>
<li>一个未经身份验证的用户代理通过HTTP协议从网站请求一个网页。</li>
<li>该网站返回一个HTML网页的未经验证的用户代理。该网页包含提示用户为他们的用户名和密码以及标有“登录”或“提交”按钮基于HTML的Web表单最低限度。</li>
<li>用户填写自己的用户名和密码,然后按下提交按钮。</li>
<li>所述用户代理发送的web表单数据包括用户名和密码到Web服务器。</li>
<li>网站实现中Web服务器上运行时执行对网络的形式的数据部分的验证和确认操作。如果成功该网站考虑用户代理进行认证。</li>
</ol>
## 采纳建议
HTTP + HTML基于表单的认证可以说是万维网上采用当今最流行的用户认证技术。几乎所有维基论坛银行/财经网站电子商务网站网络搜索引擎门户网站和其他常见的Web服务器应用程序都选择了这种认证技术。
这种普及显然是由于网站管理员或他们的雇主想要细粒度地控制征求用户凭据的表现和行为而默认弹出对话框用于HTTP基本访问身份验证或摘要接入认证许多Web浏览器提供不允许精确的剪裁。所需的精确度可以通过公司的要求如品牌或实施问题的动机如网站之类的软件对于MediaWikiphpBB的Drupal的WordPress的默认配置。无论理由任何企业品牌或用户体验的调整不能从这个认证过程的几个安全考虑分散。
## 安全方面注意事项
<ol>
<li>用户凭据传递了密文到web网站除非采取诸如就业传输层安全TLS的监听。</li>
<li>该技术基本上是特设在于有效地没有任何用户代理和所述网络服务器之间的交互除HTTP之外的与HTML本身是标准化。通过该网站所使用的实际的认证机制是默认未知的用户和用户代理。形式本身包括可编辑字段的数量和期望的内容物完全实现和部署相关的。</li>
<li>这种技术本身临时的,否则犯罪分子极易伪装成可信任方在认证过程中。</li>
</ol>
## 代码实现
```xml
<form method="post" action="/login">
<input type="text" name="username" required>
<input type="password" name="password" required>
<input type="submit" value="Login">
</form>
```

View File

@ -0,0 +1,139 @@
---
title: JWT协议
sidebar_position: 4
---
## JSON Web Token介绍
JSON Web Token JWT是一个开放标准<a href="https://tools.ietf.org/html/rfc7519" target="_blank">RFC 7519</a>它定义了一种紧凑且自包含的方式用于在各方之间安全地将信息作为JSON对象传输。由于此信息是经过数字签名的因此可以被验证和信任。可以使用秘密使用<b>HMAC</b>算法)或使用<b>RSA</b><b>ECDSA</b>的公用/专用密钥对对JWT进行签名。
尽管可以对JWT进行加密以在各方之间提供保密性但我们将重点关注已签名的令牌。签名的令牌可以验证其中包含的声明的完整性而加密的令牌则将这些声明隐藏在其他方的面前。当使用公钥/私钥对对令牌进行签名时,签名还证明只有持有私钥的一方才是对其进行签名的一方。
扩展阅读参看:官方技术说明 <a href="https://tools.ietf.org/html/rfc7519" target="_blank">JWT</a>
## 什么时候使用JSON Web Token
以下是JSON Web令牌有用的一些情况
<b>授权:</b>这是使用JWT的最常见方案。一旦用户登录每个后续请求将包括JWT从而允许用户访问该令牌允许的路由服务和资源。单一登录是当今广泛使用JWT的一项功能因为它的开销很小并且可以在不同的域中轻松使用。
<b>信息交换:</b>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被<b>Base64Url</b>编码以形成JWT的第一部分。
### Payload(有效载荷)
令牌的第二部分是有效负载,其中包含声明。声明是有关实体(通常是用户)和其他数据的声明。索赔有以下三种类型:注册的,公共的和私人索赔。
已注册的权利要求:这些是一组非强制性的但建议使用的预定义权利要求,以提供一组有用的,可互操作的权利要求。其中一些是: <b>iss</b>(发布者), <b>exp</b>(到期时间), <b>sub</b>(主题), <b>aud</b>(受众群体)等。
请注意声明名称仅是三个字符因为JWT是紧凑的。
公开声明使用JWT的人员可以随意定义这些声明。但是为避免冲突应在 <a href="https://www.iana.org/assignments/jwt/jwt.xhtml" target="_blank">IANA JSON Web令牌注册表</a>中定义它们或将其定义为包含抗冲突名称空间的URI。
私人权利:这些都是使用它们同意并既不是当事人之间建立共享信息的自定义声明注册或公众的权利要求。
有效负载示例可能是:
```json
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
```
然后,对有效负载进行<b>Base64Url</b>编码以形成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。<a href="http://jwt.io/" target="_blank" >JWT.io调试器</a>
![jwt_legacy-app-auth-5](/images/jwt/legacy-app-auth-5.png)
## JSON Web Token工作机制
在身份验证中当用户使用其凭据成功登录时将返回JSON Web令牌。由于令牌是凭据因此必须格外小心以防止安全问题。通常令牌的保留时间不应超过要求的时间。
由于缺乏安全性,您也不应该将敏感的会话数据存储在浏览器中。
每当用户想要访问受保护的路由或资源时,用户代理通常应使用授权<b>Authorization</b><b>Bearer</b>承载模式标头中发送JWT 。标头的内容应如下所示:
```json
Authorization: Bearer [token]
```
在某些情况下,这可以是无状态授权机制。服务器的受保护路由将在<b>Authorization</b>标头中检查有效的JWT 如果存在则将允许用户访问受保护的资源。如果JWT包含必要的数据则可以减少查询数据库中某些操作的需求尽管这种情况并非总是如此。
如果令牌是在<b>Authorization</b>标头中发送的则跨域资源共享CORS不会成为问题因为它不使用cookie。
下图显示了如何获取JWT并将其用于访问API或资源
![jwt_grant](/images/jwt/client-credentials-grant.png)
JSON Web令牌如何工作
应用程序或客户端向授权服务器请求授权。这是通过不同的授权流程之一执行的。例如,典型的符合<a href="http://openid.net/connect/" target="_blank">OpenID Connect</a>的 Web应用程序将<a href="http://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth" target="_blank">/oauth/authorize</a>使用授权代码流通过端点。
授予授权后,授权服务器会将访问令牌返回给应用程序。
该应用程序使用访问令牌来访问受保护的资源例如API
请注意,使用签名的令牌,令牌中包含的所有信息都会暴露给用户或其他方,即使他们无法更改它。这意味着您不应将机密信息放入令牌中。
## 如何使用JSON Web Token
让我们谈谈与Simple Web TokensSWT和Security Assertion Markup Language Tokens安全性声明标记语言令牌SAML相比JSON Web TokensJWT的优势。
由于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的长度比较

View File

@ -0,0 +1,114 @@
---
title: OAuth2.0协议
sidebar_position: 1
---
## 什么是OAuth2
OAuth OAuth开放授权是一个开放标准允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。
OAuth2.0对于用户相关的OpenAPI例如获取用户信息动态同步照片日志分享等为了保护用户数据的安全和隐私第三方网站访问用户数据前都需要显式的向用户征求授权。
采用OAuth2.0标准协议来进行用户身份验证和获取用户授权相对于之前的OAuth1.0协议,其认证流程更简单和安全。
扩展阅读参看:<a href="http://oauth.net/2/" target="_blank">OAuth标准英文</a> | <a href="http://zh.wikipedia.org/zh/OAuth" target="_blank">OAuth维基百科中文</a>
## 应用场景
第三方应用授权登录在APP或者网页接入一些第三方应用时时长会需要用户登录另一个合作平台比如QQ微博微信的授权登录。
![oauth2qq](/images/oauth2/qq.jpg)
原生app授权app登录请求后台接口为了安全认证所有请求都带token信息如果登录验证、请求后台数据。
前后端分离单页面应用spa前后端分离框架前端请求后台数据需要进行oauth2安全认证比如使用vue、react后者h5开发的app。
## 名词定义
1 Third-party application第三方应用程序本文中又称"客户端"client比如打开知乎使用第三方登录选择qq登录这时候知乎就是客户端。
2HTTP serviceHTTP服务提供商本文中简称"服务提供商"即上例的qq。
3Resource Owner资源所有者本文中又称"用户"user,即登录用户。
4User Agent用户代理本文中就是指浏览器。
5Authorization server认证服务器即服务提供商专门用来处理认证的服务器。
6Resource 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
因为客户凭证可以使用对称或者非对称加密,该方式支持共享密码或者证书

View File

@ -0,0 +1,228 @@
---
title: OpenID Connect协议
sidebar_position: 2
---
## OpenID Connect简介
OpenID Connect是基于OAuth 2.0规范族的可互操作的身份验证协议。它使用简单的REST / JSON消息流来实现和之前任何一种身份认证协议相比开发者可以轻松集成。
OpenID Connect允许开发者验证跨网站和应用的用户而无需拥有和管理密码文件。OpenID Connect允许所有类型的客户,包括基于浏览器的JavaScript和本机移动应用程序,启动登录流动和接收可验证断言对登录用户的身份。
扩展阅读参看:官方技术说明<a href="http://openid.net/connect/" title="http://openid.net/connect/" target="_blank" rel="nofollow">Connect标准英文 </a> | <a href="http://en.wikipedia.org/wiki/OpenID_Connect" title="http://en.wikipedia.org/wiki/OpenID_Connect" target="_blank" rel="nofollow">OpenID Connect维基百科en</a>
## 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格式来包装得益于JWTJSON Web Token的自包含性紧凑性以及防篡改机制使得ID-Token可以安全的传递给第三方客户端程序并且容易被验证。应有服务器在验证ID-Token正确只有使用Access-Token向UserInfo的接口换取用户的更多的信息。
有上述可知OIDC是遵循OAuth协议流程在申请Access-Token的同时也返回了ID-Token来验证用户身份。
### 相关定义
EUEnd User用户。
RPRelying Party 用来代指OAuth2中的受信任的客户端身份认证和授权信息的消费方
OPOpenID Provider有能力提供EU身份认证的服务方比如OAuth2中的授权服务用来为RP提供EU的身份认证信息
ID-TokenJWT格式的数据包含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-TokenRP验证无误后返回给RP
RP使用Access-Token发送一个请求到UserInfo EndPoint UserInfo EndPoint返回EU的Claims。
#### 基于Authorization Code的认证请求
RP使用OAuth2的Authorization-Code的方式来完成用户身份认证所有的Token都是通过OP的Token EndPointOAuth2中定义来发放的。构建一个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 = AuthenticationTimeEU完成认证的时间。如果RP发送认证请求的时候携带max_age的参数则此Claim是必须的。
nonceRP发送请求的时候提供的随机字符串用来减缓重放攻击也可以来关联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是必须的其他的都是可选的。

View File

@ -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)
<h3>SAML实现联邦身份认证各方职责</h3>
<table border="0" class="table table-striped table-bordered ">
<thead>
<th>IDP认证中心(Identity Provider/IDP)</th><th>合作伙伴(Service Provider/SP)</th>
</thead>
<tbody>
<tr>
<td>用户身份认证</td>
<td>安全断言判定</td>
</tr>
<tr>
<td>联邦身份安全断言</td>
<td>联邦身份维护</td>
</tr>
<tr>
<td>用户账号管理</td>
<td>服务提供和访问控制</td>
</tr>
</tbody>
</table>
IDP和SP预先完成证书的互信配置SAML认证基于断言断言基于证书的加密传递过程是安全的只有证书的持有者才能对断言进行解析
重要注意:SAML SSO解决方案仅适用于Web应用程序.
扩展阅读参看:官方技术说明<a href="https://wiki.oasis-open.org/security/FrontPage" title="https://wiki.oasis-open.org/security/FrontPage" target="_blank" rel="nofollow">SAML标准英文 </a> | <a href="http://en.wikipedia.org/wiki/Security_Assertion_Markup_Language" title="http://en.wikipedia.org/wiki/Security_Assertion_Markup_Language" target="_blank" rel="nofollow">SAML维基百科中文</a>
## 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和用户的目标URLRelayState参数的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并记录在合作伙伴应用程序。

View File

@ -0,0 +1,96 @@
---
title: TokenBased协议
sidebar_position: 6
---
## TokenBased介绍
TokenBased(基于令牌)的认证是一种简单的令牌的认证即认证中心和应用共享凭证或者数字证书认证中心使用HTTP POST的方式提交令牌到应用系统应用系统并随后进行身份验证
## 交互概要
该技术的实现步骤是:
<ol>
<li>一个未经身份验证的用户通过浏览器访问应用系统。</li>
<li>应用系统跳转到认证中心,请求认证。</li>
<li>用户填写自己的用户名和密码,然后按下提交按钮。</li>
<li>认证中心完成用户认证,生成令牌并提交到应用系统认证地址。</li>
<li>应用系统使用共享凭证或者数字证书验证令牌,从令牌中获取用户认证信息。</li>
<li>应用系统完成系统登录。</li>
</ol>
### 令牌加密或者签名方式
<ol>
<li>加密方式DES、DESede、AES、Blowfish默认采用DES。</li>
<li>签名方式服务端使用RSA数字证书私钥加密客户端使用RSA数字证书公钥验证。</li>
</ol>
### 令牌格式
```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是即时生成的随机数<br/>
at是当前认证的时间<br/>
expires是过期的间隔<br/>
其他的字段可在管理控制台配置
## 简单令牌
认证用户名@@认证时间(UTC时间),例如:
```json
testUser@2010-01-01T01:01:01.001Z
```
### 令牌加密
加密步骤:
<ol>
<li>申请公共的秘钥。</li>
<li>使用秘钥对产生的Token使用DES、DESede、AES、Blowfish进行加密默认采用DES。</li>
<li>对加密的数据进行BASE64URL编码。</li>
</ol>
简单token加密结果<br/>
```json
Y00jv2TCCuk365uB2-nDCUdboygeYFoUfETC7BNXr73dQWwFNRrfYltczDQ5iWg8NTO-GsP--VlR6L-JyNhZSg
```
### 令牌签名
token的签名格式BASE64URL(UTF8(data)).BASE64URL(UTF8(signature)),中间用"<em>.</em>"分开,前半部分是数据,后半部分是签名书数据,例如:<br/>
```json
eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ<em>.</em>dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
```
## LTPA介绍
LTPA是Lightweight ThirdParty Authentication简称轻量级第三方认证支持在一个因特网域中的一组 Web 服务器之间使用单一登录的认证框架即通过cookie来传输Token。
当服务器配置LTPA认证方式用户通过浏览器成功登录服务器会自动发送一个session cookie给浏览器此cookie中包含一个加密和签名Security Token信息应用服务器根据Security Token解析得到登录用户信息自动完成应用系统认证。
### 交互概要
该技术的实现步骤是:
<ol>
<li>一个未经身份验证的用户通过浏览器访问应用系统,应用系统跳转到认证中心。</li>
<li>认证中心完成用户登录把Security Token发给浏览器并跳转到应用系统。</li>
<li>应用系统解析Security Token得出用户登录信息。</li>
<li>应用系统使用用户信息完成自身的登录。</li>
</ol>

View File

@ -0,0 +1,12 @@
---
sidebar_position: 2
---
# 单点注销
单点注销(Single Logout)是指用户在一个系统退出后,其所能单点登录访问的所有系统都同时退出。单点注销主要是为提高安全性,避免用户忘记退出所有应用而造成信息的泄密。
IDP支持单点注销(SLO),即用户不仅仅从认证中心注销,同时也注销从认证中心访问的应用系统。
其实现方式也非常简单由于SSO和单点登录的应用都是分开的使用不同的域名只是通过认证中心在多个应用系统中传递身份和登录系统。因此首先注销单点登录应用然后修改每个应用系统都使用SSO的单点注销页面SSO的退出页面会将用户登录的Session注销掉。

Some files were not shown because too many files have changed in this diff Show More