本地搭建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.基本…

【前端每日一题】day2

用JS写一个快速排序算法 function quickSort(arr) {if (arr.length < 1) {return arr;}const pivot arr[Math.floor(arr.length / 2)];const left [];const right [];for (let i 0; i < arr.length; i) {if (i Math.floor(arr.length / 2)) {continue; // Skip piv…

OS复习笔记ch5-3

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

【Spring】JdbcTemplate

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

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

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

Python基础学习之datetime模块

在Python编程中&#xff0c;处理日期和时间是一个常见的需求。Python的datetime模块提供了丰富的类和方法&#xff0c;用于表示和操作日期、时间、时间间隔等。本文将详细介绍Python的datetime模块&#xff0c;并给出一些实用的示例。 1. datetime模块概览 datetime模块是Pyt…

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

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

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

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

zookeeper之分布式环境搭建

ZooKeeper的分布式环境搭建是一个涉及多个步骤的过程&#xff0c;主要包括准备工作、安装ZooKeeper、配置集群、启动服务以及验证集群状态。以下是搭建ZooKeeper分布式环境的基本步骤&#xff1a; 1. 准备工作 确保所有节点的系统时间同步。确保所有节点之间网络互通&#xf…

Redis-5 分布式锁

一.为什么要使用分布式锁&#xff1f; 传统的互斥锁synchronized只能作用于同一台虚拟机上的线程&#xff0c;在使用服务器集群部署的情况下&#xff0c;互斥锁就会失效&#xff0c;因此要采用分布式锁来处理不同服务器上的线程访问同一资源的情况。 二.redis的分布式锁是如何…

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

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

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

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

冒泡法排序方法与找到出现最多的字符及出现次数

一. 简介 本文学习一下&#xff0c;字符大小排序&#xff0c;获取最大值与最小值。 输出字符串中出现最多的字符&#xff0c;以及出现次数。 二. 冒泡法排序方法与获取最大最小值 1. 冒泡法排序 终端随机输入一个字符串&#xff0c;只包括字符0-9&#xff0c;字符串长度…

2024-05-08 postgres-查询树Query-分析

摘要: pg的词法分析和语法分析使用的技术与mysql相同&#xff0c;此法分析使用bison&#xff0c;语法分析使用了flex。之后ANSI SQL句子被转换为查询树。 Query 结构体保存了文本类型的 SQL,经过语法分析后的分析结果&#xff0c;Query 结构体的成员与 SOL语句的各个子句基本…

AI中LangChain实现RAG中的pdf原理以及快速上手

AI中LangChain实现RAG中的pdf原理以及快速上手 什么是LangChain LangChain是一种基于自然语言处理技术的语言生成模型&#xff0c;它可以将输入的文本转换为自然语言的输出。LangChain的实现原理是基于RAG&#xff08;Retriever-Reader-Generator&#xff09;模型&#xff0c…

C++ 动态内存管理

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

Qt:实现git中diff的功能

在 Git 中&#xff0c;有四种 diff 算法&#xff0c;即 Myers、Minimal、Patience 和 Histogram&#xff0c;用于获取位于两个不同 commit 中的两个相同文件的差异。 Myers算法实现参考&#xff1a; Myers‘Diff之贪婪算法_myers算法-CSDN博客 Git Diff 算法详解&#xff1a…

深度学习算法集成部署

文章目录 0 Docker容器部署1 制作dockerfile2 新建镜像3 新建容器4 运行脚本5 异常处理0 Docker容器部署 使用 Docker 容器部署深度学习模型有以下几个主要优势: 环境一致性:Docker 容器可以将应用程序及其所需的依赖项打包在一起,确保应用程序在不同环境中的运行一致性。这对…

为什么在二三十岁时应该努力变强大?

一、对于即将三十岁或三十岁的人的建议&#xff0c;包括举重、跑步、学习等健身技能&#xff0c;以及在生活中如何处理困难和挑战。 举重是二三十岁的人的最佳做法之一 学习如何在身体上、感情上和精神上挑战极限 在城市里寻找机会&#xff0c;接受邀请&#xff0c;强迫自己出去…

C++之Eigen库基本使用

目录 1、矩阵的构造和初始化操作 2、矩阵的算术运算 3、矩阵的分解和求解 4、矩阵的变换 5、矩阵的访问和修改 6、矩阵遍历 7、线性方程组求解 8、其他操作 Eigen库是一个高级的C库&#xff0c;用于线性代数&#xff0c;矩阵和向量运算&#xff0c;数值分析和相关的数学…