本地搭建hydra服务用go以验证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.mzph.cn/web/9206.shtml

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

相关文章

【qt】容器的用法

容器目录 一.QVertor1.应用场景2.增加数据3.删除数据4.修改数据5.查询数据6.是否包含7.数据个数8.交换数据9.移动数据10.嵌套使用 二.QList1.应用场景2.QStringList 三.QLinkedList1.应用场景2.特殊点3.用迭代器来变量 四.QStack1.应用场景2.基本用法 五.QQueue1.应用场景2.基本…

OS复习笔记ch5-3

引言 上一节我们学习了关于信号量机制的一些内容,包括信号量的含义,对应的PV操作等。 如图所示,上一节主要是针对信号量的互斥,其实信号量机制还可以做很多事情,比如实现进程同步和前驱关系,这一节我们先复…

【Spring】JdbcTemplate

JdbcTemplate 是 Spring 提供的一个 JDBC 模板类,是对 JDBC 的封装,简化 JDBC 代码 也可以让 Spring 集成其它的 ORM 框架,例如:MyBatis、Hibernate 等 使用 JdbcTemplate 完成增删改查 一、环境准备 数据库: 准备…

Marin说PCB之如何快速打印输出整板的丝印位号图?

当小编我辛辛苦苦加班加点的把手上的板子做到投板评审状态的时候,坐在我旁边的日本同事龟田小郎君说让我把板子上的丝印也要调一下,我当时就急了,这么大的板子,将近1W多PIN 了都,光调丝印都要老半天啊,而且…

Docx文件误删除如何恢复?别再花冤枉钱了,4个高效恢复软件!

不管是工作还是学习,总是会与各种各样的文件打交道。文件量越多就越容易出现文件丢失、文件误删的情况。遇到这些情况,失去的文件还能找回来吗?只要掌握了一些数据恢复方法,是很有机会恢复回来的,下面我会将这些方法分…

[机器学习系列]深入探索回归决策树:从参数选择到模型可视化

目录 一、回归决策树的参数 二、准备数据 三、构建回归决策树 (一)拟合模型 (二)预测数据 (三)查看特征重要性 (四)查看模型拟合效果 (五) 可视化回归决策树真实值和预测值 (六)可视化决策树并保存 部分结果如下: 一、回归决策树的参数 DecisionTreeRegress…

NVIDIA_SMI has failed because it couldn’t communicate with the NVIDIA driver

参考:https://www.zhihu.com/question/474222642/answer/3127013936 https://blog.csdn.net/ZhouDevin/article/details/128265656 nvidia-smi查看报错,nvcc正常 1)查看nvidia版本 ls /usr/src | grep nvidia nvidia-550.78 2)…

暗区突围国际服pc端怎么获取测试资格 twitch掉落资格获取教程

《暗区突围》是由腾讯魔方工作室群开发的第一人称射击类手游。游戏以从暗区撤离并收集物资满载而归作为最终目的,带出的战利品可以存储在仓库中,又可以出售用以换取游戏金钱。游戏中玩家可以创建男性或女性角色,可以通过选择脸型、发型、发色…

C++ 动态内存管理

例如:动态内存和释放单个数据的存储区 一 用new运算符初始化单个数据的存储区 举例

【智能算法】人工原生动物优化算法(APO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.获取代码 1.背景 2024年,X Wang受到自然界原生动物启发,提出了人工原生动物优化算法( Artificial Protozoa Optimizer, APO)。 2.算法原理 2.1算法思想 AP…

压缩归档库-Snappy介绍

1.简介 Snappy 是一个 C 编写的压缩和解压缩库,由 Google 开发。它专为速度而设计,而不是最大压缩率或与其他压缩库的兼容性。 Snappy 通常用于需要快速压缩和解压缩的场景。 Snappy具有以下属性: 快速:压缩速度达到250 MB/秒及…

数智化快速开发平台

助力企业IT规划标准化,实现企业IT生态化 目前市场上有很多面向企业各种业务场景的产品,这些产品给企业管理带来便利性的同时,也带来了一系列问题,例如: 不同系统的后台管理功能基本一致,却需要重复建设&a…

linux调试

文章目录 1. 使用打印来调试1.1 重定向1.2 标准预定义宏1.3 日志代码 2. 内核异常2.1 内核打印2.1.1 打印级别2.1.2 跟踪异常2.1.3 动态打印2.1.4 RAM console 2.2 OOPS2.2.1 有源代码的情况2.2.2 没有源代码的情况 3 查看日志4 工具调试 1. 使用打印来调试 1.1 重定向 2>…

[Collection与数据结构] Map与Set(一):二叉搜索树与Map,Set的使用

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …

python socket通讯 学习记录

python socket 1. 初级实现2. 添加header3. 中级实现(引用pickle库)4. 高级实现(相互发送信息)5. 一点尝试5. 1个server对应2个client5.2个server对应1个client 名称版本python3.11 本文涉及到socket的server与client通讯从简单到…

LeetCode 257. 二叉树的所有路径

LeetCode 257. 二叉树的所有路径 1、题目 题目链接:257. 二叉树的所有路径 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root…

java.net.SocketInputStream.socketRead0 卡死导致 tomcat 线程池打满的问题

0 TL;DR; 问题与原因:某些特定条件下 java.net.SocketInputStream.socketRead0 方法会卡死,导致运行线程一直被占用导致泄露采用的方案:使用监控线程异步监控卡死事件,如果发生直接关闭网络连接释放链接以及对应的线程 1. 问题 …

nacos下载安装和nacos启动报错

nacos简介: Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您…

YOLOv9中模块总结补充|RepNCSPELAN4详图

专栏地址:目前售价售价69.9,改进点70 专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,助力高效涨点!!! 1. RepNCSPELAN4详图 RepNCSPELAN4是YOLOv9中的特征提取-融合模块,类似前几…

【数据结构-二叉搜索树的增删查改】

🌈个人主页:努力学编程’ ⛅个人推荐:基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 …