本地搭建hydra服务用以验证oidc流程

目录

1、docker搭建hydra,环境配置:

2、搭建完成后服务调用:

2.1保证服务正常启动:

2.2 通过postman调用,获取client_id:

2.3 通过client_id,实现oauth2/auth调用

3. 通过go语言实现oidc验证:


1、docker搭建hydra,环境配置:

环境:windows10

docker-compose.yml:

version: "3.7"
services:hydra:image: oryd/hydra:v2.0.2ports:- "4444:4444" # 公共端口- "4445:4445" # 管理端口- "5555:5555" # 用于 Hydra 令牌用户的端口command: serve -c /etc/config/hydra/hydra.yml all --devvolumes:- type: bindsource: C:\workspace\hydra\configtarget: /etc/config/hydraenvironment:- DSN=postgres://hydra:secret@postgresd:5432/hydra?sslmode=disable&max_conns=20&max_idle_conns=4restart: unless-stoppeddepends_on:- hydra-migratenetworks:- intranethydra-migrate:image: oryd/hydra:v2.0.2environment:- DSN=postgres://hydra:secret@postgresd:5432/hydra?sslmode=disable&max_conns=20&max_idle_conns=4command: migrate -c /etc/config/hydra/hydra.yml sql -e --yes #这个是在容器中volumes:- type: bindsource: C:\workspace\hydra\config # 公共端口挂的卷是windows上target: /etc/config/hydrarestart: on-failurenetworks:- intranetconsent:environment:- HYDRA_ADMIN_URL=http://hydra:4445image: oryd/hydra-login-consent-node:v2.0.2ports:- "3000:3000"restart: unless-stoppednetworks:- intranetpostgresd:image: postgres:11.8ports:- "5432:5432"environment:- POSTGRES_USER=hydra- POSTGRES_PASSWORD=secret- POSTGRES_DB=hydranetworks:- intranet
networks:intranet:

配置yaml:

serve:cookies:same_site_mode: Laxurls:self:issuer: http://127.0.0.1:4444consent: http://127.0.0.1:3000/consentlogin: http://127.0.0.1:3000/loginlogout: http://127.0.0.1:3000/logoutsecrets:system:- youReallyNeedToChangeThisoidc:subject_identifiers:supported_types:- pairwise- publicpairwise:salt: youReallyNeedToChangeThis

2、搭建完成后服务调用:

2.1保证服务正常启动:

2.2 通过postman调用,获取client_id:

post:http://localhost:4445/admin/clients

body:

{"client_name": "crm","token_endpoint_auth_method": "client_secret_basic","redirect_uris": ["http://127.0.0.1:5555/callback"],"scope": "openid offline","grant_types": ["authorization_code","refresh_token","implicit","client_credentials"],"response_types": ["code","id_token","token"]
}

2.3 通过client_id,实现oauth2/auth调用

3. 通过go语言实现oidc验证:

只是写了个思路,流程没有走通,只供参考,有厉害的大神可以完善补充一下,下面的代码只是提供了思路,搭建完上面的环境后,可以用以自己玩耍,有兴趣的流程自己走通完善:

package mainimport ("context""fmt""log""net/http""os""github.com/coreos/go-oidc""golang.org/x/oauth2"
)func main() {ctx := context.Background()// 创建 OIDC 配置provider, err := oidc.NewProvider(ctx, "http://127.0.0.1:4444")if err != nil {log.Fatalf("Failed to create OIDC provider: %v", err)}// 创建 OAuth2 配置oauth2Config := oauth2.Config{ClientID:     "af7da551-1ddd-4e6e-9b52-62d7535e57f2",       // 你的 OAuth2 客户端 IDClientSecret: os.Getenv("CLIENT_SECRET"),   // 你的 OAuth2 客户端密钥RedirectURL:  "http://127.0.0.1:5555/callback", // 你的回调 URLEndpoint:     provider.Endpoint(),Scopes:       []string{oidc.ScopeOpenID, "profile", "email"},}// 创建 OIDC 验证器verifier := provider.Verifier(&oidc.Config{ClientID: oauth2Config.ClientID})log.Printf("Received verifier: %s", verifier)// 设置回调处理函数http.HandleFunc("/oauth2/auth", func(w http.ResponseWriter, r *http.Request) {// 获取 OAuth2 令牌log.Printf("Received url: %s", r.URL.Query())code := r.URL.Query().Get("code")log.Printf("Received code: %s", code)if code == "" {http.Error(w, "Missing code parameter", http.StatusBadRequest)return}log.Printf("Received code: %s", code)oauth2Token, err := oauth2Config.Exchange(ctx, code)if err != nil {http.Error(w, fmt.Sprintf("Failed to exchange token: %v", err), http.StatusInternalServerError)return}// 使用令牌获取用户信息idToken, ok := oauth2Token.Extra("id_token").(string)if !ok {http.Error(w, "No id_token", http.StatusInternalServerError)return}// 验证 ID 令牌_, err = verifier.Verify(ctx, idToken)if err != nil {http.Error(w, fmt.Sprintf("Failed to verify token: %v", err), http.StatusUnauthorized)return}// 验证通过,输出用户信息fmt.Fprintf(w, "Authentication successful! User: %v", oauth2Token)})// 启动服务器log.Fatal(http.ListenAndServe(":8080", nil))
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/670552.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法系列】哈希表

目录 哈希表总结 leetcode题目 一、两数之和 二、判定是否互为字符重排 三、存在重复元素 四、存在重复元素 II 五、字母异位词分组 六、在长度2N的数组中找出重复N次的元素 七、两个数组的交集 八、两个数组的交集 II 九、两句话中的不常见单词 哈希表总结 1.存储数…

自动化运维工具---Ansible

一 Puppet Puppet是历史悠久的运维工具之一。它是一种基础架构即代码(laC)工具,使用户可以定义其基础 架构所需的状态,并使系统自动化以实现相同状态。 Puppet可监视用户的所有系统,并防止任何偏离已定义状态的情况。从简单的工作流程自动…

Jmeter性能测试(三)

token鉴权处理 1、添加json提取器 2、写jsonpath表达式在响应Body中提取鉴权token token:变量名,可以直接引用 $…token:token数据在响应中的字段名称,根据自己情况写就行 3、将提取出来的token添加到请求头中 重点&#xff…

0506_IO1

思维导图: 练习: 有如下结构体 struct Student{ char name[16]; int age; double math_score; double chinese_score; double english_score; double physics_score; double chemistry_score; double bio_score; }; 申请该结构体数组,容量为…

5-在Linux上部署各类软件

1. MySQL 数据库安装部署 1.1 MySQL 5.7 版本在 CentOS 系统安装 注意:安装操作需要 root 权限 MySQL 的安装我们可以通过前面学习的 yum 命令进行。 1.1.1 安装 配置 yum 仓库 # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022# 安装Mysql…

【软考】模拟考卷错题本2024-05-05

1 算法 关键词:按照单位重量价值大优先,那就是1、2、3即430;之后的根据排除法又可以得到630;故C。 2 UML 序列图 上图已经基本上有解析;重点在于在四个选项中选正确的。根据概念排除:异步和同步是不一样的&…

Claude聊天机器人推出全新iOS客户端及团队专属计划

Anthropic 正在使其 Claude AI 更易于在移动设备上访问。该公司发布了适用于 iOS 的 Claude 移动应用程序,任何用户都可以免费下载。与聊天机器人的移动网络版本类似,该应用程序跨设备同步用户与 Claude 的对话,允许他们从计算机跳转到应用程序(反之亦然),而不会丢失聊天…

OpenHarmony实战开发-请求自绘制内容绘制帧率

对于基于XComponent进行Native开发的业务,可以请求独立的绘制帧率进行内容开发,如游戏、自绘制UI框架对接等场景。 接口说明 开发步骤 说明: 本范例是通过Drawing在Native侧实现图形的绘制,并将其呈现在NativeWindow上 1.定义Ark…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-13-按键实验

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

04-25 周四 FastBuild重构实践-TLS、全局捕获异常、一键配置

04-25 周四 FastBuild重构实践 时间版本修改人描述04-25V0.1宋全恒新建文档2024年5月6日14:33:16V1.0宋全恒完成文档撰写 简介 由于 04-22 周日 阿里云-瑶光上部署FastBuild过程(配置TLS、自定义辅助命令)描述了重新部署一个FastBuild实例的过程,通过阅读这个&…

pytest教程-36-钩子函数-pytest_collection_start

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了pytest_unconfigure钩子函数的使用方法,本小节我们讲解一下pytest_collection_start钩子函数的使用方法。 pytest_collection_start(session) 是一个 pytest 钩子函数,…

pytest教程-37-钩子函数-pytest_collection_finish

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了pytest_collection_start钩子函数的使用方法,本小节我们讲解一下pytest_collection_finish钩子函数的使用方法。 pytest_collection_finish(session) 是一个 pytest 钩子函数&…