
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
mock-oauth2-server 是一个可脚本化/可定制的Web服务器,用于测试使用OAuth2/OpenID Connect的HTTP客户端,或依赖运行中的OAuth2服务器的应用(例如需要来自已知发行者的签名JWT的API)。该服务器还提供令牌验证所需的端点(JWKS端点)和身份提供者元数据发现端点(提供服务器元数据的"well-known"端点)。
该服务器使用Kotlin编写,基于OkHttp MockWebServer作为底层服务器库,可在Java和Kotlin的单元/集成测试中使用,或作为独立服务器在任何语言环境中运行(例如通过docker-compose)。
注意:尽管服务器旨在符合支持的OAuth2/OpenID Connect规范,但仅应用于测试场景,不得用于生产环境。
开发此工具的目的是提供一种设置,使应用开发者在运行测试时无需禁用应用中的安全功能!如果您在OAuth2和令牌等方面遇到问题并考虑在测试时禁用"安全"功能,请提交issue或PR,帮助开发者和安全需求和谐共存。
最新版本 
最新版本 元素将指定issuerId。
请求 http://localhost:8080/default/.well-known/openid-configuration 将生成issuerId为default的配置:
json{ "issuer":"http://localhost:8080/default", "authorization_endpoint":"http://localhost:8080/default/authorize", "token_endpoint":"http://localhost:8080/default/token", "jwks_uri":"http://localhost:8080/default/jwks", "response_types_supported":[ "query", "fragment", "form_post" ], "subject_types_supported":[ "public" ], "id_token_signing_alg_values_supported":[ "RS256" ] }
JWT中的实际发行者值为 iss: "http://localhost:8080/default"。
要使用另一个发行者(id为anotherissuer),只需请求 http://localhost:8080/anotherissuer/.well-known/openid-configuration,配置将相应更改。
测试设置
kotlinval server = MockOAuth2Server() server.start() // 可自定义 - 如有多个发行者,应唯一标识 val issuerId = "default" // 授权服务器元数据的发现URL val wellKnownUrl = server.wellKnownUrl(issuerId).toString() // ...... // 使用wellKnownUrl的元数据设置应用并执行测试 // ...... server.shutdown()
测试需要用户登录的OpenID Connect授权码流程应用
如需特定用户登录,可使用OAuth2TokenCallback接口提供自定义实现或在DefaultOAuth2TokenCallback中设置值:
kotlin@Test fun loginWithIdTokenForSubjectFoo() { server.enqueueCallback( DefaultOAuth2TokenCallback( issuerId = issuerId, subject = "foo" ) ) // 调用应用并断言用户foo已登录 }
如需在生成的id_token中包含特定声明(如acr或自定义声明),也可使用OAuth2TokenCallback:
kotlin@Test fun loginWithIdTokenForAcrClaimEqualsLevel4() { server.enqueueCallback( DefaultOAuth2TokenCallback( issuerId = issuerId, claims = mapOf("acr" to "Level4") ) ) // 调用应用并断言id_token中存在acr=Level4 }
测试需要access_token的API(例如签名JWT)
kotlinval token: SignedJWT = oAuth2Server.issueToken(issuerId, "someclientid", DefaultOAuth2TokenCallback()) // 使用HTTP客户端调用API并附加序列化令牌 val request = // .... request.addHeader("Authorization", "Bearer ${token.serialize()}")
更多示例
可在src/test目录的examples中查看Kotlin示例。
服务器URLs
可通过调用 fun *Url(issuerId: String): HttpUrl 函数/方法从服务器获取包含正确端口和issuerId等信息的URL:
kotlinval server = MockOAuth2Server() server.start() val wellKnownUrl = server.wellKnownUrl("yourissuer") // 生成URL:http://localhost:<随机端口>/yourissuer/.well-known/openid-configuration
独立服务器默认使用端口8080,可通过调用StandaloneMockOAuth2Server.kt(Kotlin)或StandaloneMockOAuth2ServerKt(Java)中的main()方法启动。
在Windows上,建议在Docker中运行服务器并指定主机为localhost,例如:docker run -p 8080:8080 -h localhost $IMAGE_NAME
配置
独立服务器支持通过环境变量进行以下配置:
| 变量 | 描述 |
|---|---|
SERVER_HOSTNAME | 让独立服务器绑定到特定主机名,默认绑定到0.0.0.0 |
SERVER_PORT | 独立服务器监听的端口,默认为8080 |
JSON_CONFIG_PATH | 包含服务器OAuth2部分配置(OAuth2Config)的JSON文件的绝对路径。格式详情见下文。 |
JSON_CONFIG | OAuth2Config的实际JSON内容,此环境变量优先级高于JSON_CONFIG_PATH。格式详情见下文。 |
JSON_CONFIG
JSON_CONFIG允许使用JSON配置OAuth2Config类的内容。
示例:
json{ "interactiveLogin": true, "httpServer": "NettyWrapper", "tokenCallbacks": [ { "issuerId": "issuer1", "tokenExpiry": 120, "requestMappings": [ { "requestParam": "scope", "match": "scope1", "claims": { "sub": "subByScope", "aud": [ "audByScope" ] } } ] }, { "issuerId": "issuer2", "requestMappings": [ { "requestParam": "someparam", "match": "somevalue", "claims": { "sub": "subBySomeParam", "aud": [ "audBySomeParam" ] } } ] } ] }
| 属性 | 描述 |
|---|---|
interactiveLogin | true或false,启用重定向到服务器/authorize端点时的登录屏幕 |
httpServer | 标识要使用的HTTP服务器的字符串,必须匹配以下枚举值之一:MockWebServerWrapper或NettyWrapper |
tokenCallbacks | RequestMappingTokenCallback列表,允许指定当令牌请求匹配指定条件时返回哪些令牌声明。 |
从上述JSON示例中:
向http://localhost:8080/issuer1/token发送带有参数scope等于scope1的令牌请求将匹配第一个tokencallback:
json{ "issuerId": "issuer1", "tokenExpiry": 120, "requestMappings": [ { "requestParam": "scope", "match": "scope1", "claims": { "sub": "subByScope", "aud": [ "audByScope" ] } } ] }
并返回包含以下声明的令牌响应:
json{ "sub": "subByScope", "aud": "audByScope", "nbf": 1616416942, "iss": "http://localhost:54905/issuer1", "exp": 1616417062, "iat": 1616416942, "jti": "28697333-6f25-4b1f-b2c2-409ce010933a" }
Docker
构建到本地Docker守护进程:
gradle./gradlew jibDockerBuild
运行容器:
bashdocker run -p 8080:8080 $IMAGE_NAME
Docker-Compose
为使容器间网络和浏览器交互顺畅,必须在hosts文件中添加主机条目127.0.0.1 host.docker.internal,并在docker-compose.yaml文件的mock-oauth2-server服务中设置hostname:
yamlversion: '3.7' services: your_app: build: . ports: - 8080:8080 mock-oauth2-server: image: ghcr.io/navikt/mock-oauth2-server:$MOCK_OAUTH2_SERVER_VERSION ports: - 8080:8080 hostname: host.docker.internal
调试器
调试器是一个实现authorization_code流程的OAuth2客户端,带有调试UI(例如请求参数)。在浏览器中访问http://localhost:8080/default/debugger即可使用。
该项目目前由组织https://github.com/navikt%E7%BB%B4%E6%8A%A4%E3%80%82
如需要提出问题或疑问,请在此创建issue并添加适当标签。
对于https://github.com/navikt%E7%BB%84%E7%BB%87%E5%86%85%E7%9A%84%E8%81%94%E7%B3%BB%E8%AF%B7%E6%B1%82%EF%BC%8C%E5%8F%AF%E4%BD%BF%E7%94%A8Slack%E9%A2%91%E9%81%93#pig_sikkerhet%E3%80%82
如需直接联系个人,请查看贡献者列表。
开始前,请fork仓库并检出新分支。然后使用Gradle包装器构建库:
shell./gradlew build
更多信息见CONTRIBUTING.md
本库采用MIT许可证
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。

来自真实用户的反馈,见证轩辕镜像的优质服务