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

news2024/10/5 10:38:29

目录

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.2
    ports:
      - "4444:4444" # 公共端口
      - "4445:4445" # 管理端口
      - "5555:5555" # 用于 Hydra 令牌用户的端口
    command: serve -c /etc/config/hydra/hydra.yml all --dev
    volumes:
      - type: bind
        source: C:\workspace\hydra\config
        target: /etc/config/hydra
    environment:
      - DSN=postgres://hydra:secret@postgresd:5432/hydra?sslmode=disable&max_conns=20&max_idle_conns=4
    restart: unless-stopped
    depends_on:
      - hydra-migrate
    networks:
      - intranet
  hydra-migrate:
    image: oryd/hydra:v2.0.2
    environment:
      - DSN=postgres://hydra:secret@postgresd:5432/hydra?sslmode=disable&max_conns=20&max_idle_conns=4
    command: migrate -c /etc/config/hydra/hydra.yml sql -e --yes #这个是在容器中
    volumes:
      - type: bind
        source: C:\workspace\hydra\config # 公共端口挂的卷是windows上
        target: /etc/config/hydra
    restart: on-failure
    networks:
      - intranet
  consent:
    environment:
      - HYDRA_ADMIN_URL=http://hydra:4445
    image: oryd/hydra-login-consent-node:v2.0.2
    ports:
      - "3000:3000"
    restart: unless-stopped
    networks:
      - intranet
  postgresd:
    image: postgres:11.8
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=hydra
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=hydra
    networks:
      - intranet
networks:
  intranet:

配置yaml:

serve:
  cookies:
    same_site_mode: Lax

urls:
  self:
    issuer: http://127.0.0.1:4444
  consent: http://127.0.0.1:3000/consent
  login: http://127.0.0.1:3000/login
  logout: http://127.0.0.1:3000/logout

secrets:
  system:
    - youReallyNeedToChangeThis

oidc:
  subject_identifiers:
    supported_types:
      - pairwise
      - public
    pairwise:
      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 main

import (
	"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 客户端 ID
		ClientSecret: os.Getenv("CLIENT_SECRET"),   // 你的 OAuth2 客户端密钥
		RedirectURL:  "http://127.0.0.1:5555/callback", // 你的回调 URL
		Endpoint:     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.coloradmin.cn/o/1658254.html

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

相关文章

一套C语言开发的 PACS影像系统源码 PACS系统的基本概念、系统业务流程

PACS系统基本概念 PACS,全称 Picture Archiving and Communication Systems,中文意为影像归档和通信系统。它是应用于医院影像科室的一种系统,主要任务是把日常产生的各种医学影像(包括核磁,CT,超声&#…

怎么将文字做成二维码?文本活码在线的生成技巧

文本类型的活码该如何来制作呢?通过二维码来展示文字信息是现在很常用的一种方式,包括物品、建筑、人员等方面的信息,都可以用生成二维码后让其他人通过扫码了解自己需要的信息。那么文本活码的制作需要几步操作呢?下面就教大家使…

CPU的星际穿越——“三维”解析“二维”之谜

文章目录 写在前面为什么三维的CPU能执行二维的指令二维指令是三维机器的抽象而已计算机所有东西都是三维的降维抽象没有软件没有指令二维到三维的总结操作系统的重塑 写在前面 以下是自己关于CPU为何能执行指令的迷惑的抽丝破茧的解答—— 困扰我的一个的问题之CPU的星际穿越…

RV1106点亮1.44寸SPI接口tftlcd

最近入手了一块微雪的幸狐RV1106微型Linux开发板,具体型号为Luckfox Pico Max,这是一款集成ARM Cortex-A7/RISC-V MCU/NPU/ISP等处理器。 根据微雪官网的wiki入门指导测试了一下,功能一切正常,感觉很nice,这款板子真的…

kubernate 基本概念

一 K8S 是什么? K8S 全称:Kubernetes 作用: 用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。 可以理解成 K8S 是负责自动化运维管理多个容器化程序(比如 Docker)的…

element-ui skeleton 组件源码分享

今日简单分享 skeleton 骨架屏组件源码,主要从以下四个方面来讲解: 1、skeleton 组件的页面结构 2、skeleton 组件的属性 3、skeleton item 组件的属性 4、skeleton 组件的 slot 一、skeleton 组件的页面结构 二、skeleton 组件的属性 2.1 animate…

开源项目介绍-02 Aubio【1】环境配置和使用 @ Ubuntu + Pycharm + Python

前言: aubio 是一组算法和工具,用于标记和变换音乐和声音。它扫描或监听音频信号,并尝试识别音乐事件。例如,当鼓被击打时,它能检测到音符的频率,或者一个有节奏的旋律的节拍是多少。 aubio 的功能包括&a…

在Ubuntu上安装Anaconda之后,启动失败

为了方便管理Pythonu环境,在Ubuntu的Docker容器中安装了Anaconda,安装完成,启动时出现如下错误: conda activate xxx usage: conda [-h] [--no-plugins] [-V] COMMAND ... conda: error: argument COMMAND: invalid choice: acti…

【计算机毕设】小型企业办公自动化系统+vue - 免费源码(私信领取)

免费领取源码 | 项目完整可运行 | v:chengn7890 诚招源码校园代理! 1. 研究目的 本项目旨在设计并实现一个小型企业办公自动化系统,利用Vue作为前端框架,为企业员工提供便捷的办公管理工具,提升…

Day23 代码随想录打卡|字符串篇---重复的子字符串

题目(leecode T459): 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。fang 移动匹配。分析可以由自己的子串构成的字符串,肯…

自动驾驶纵向控制算法

本文来源——b站忠厚老实的老王,链接:忠厚老实的老王投稿视频-忠厚老实的老王视频分享-哔哩哔哩视频 (bilibili.com),侵删。 功率和转速之间的关系就是:功率P等于转矩M乘以转速ω。并不是油门越大加速度就越大。 发动机和电机的转…

渗透之sql注入---宽字节注入

目录 宽字节注入原理: 实战: 源码分析: 开始注入: 找注入点: 注入数据库名: 注入表名: 注入列明: 注入具体值:http://sqli-labs:8084/less-32/?id-1%df%27unio…

回顾5款我非常喜欢的软件,希望大家也能喜欢

​ 我喜欢分享好软件,这就像与老友聊天一样让我感到快乐。在这个过程中,我可以回顾这些实用的小工具,也希望它们可以帮助到更多人。 1.备份工具——Cobian Backup ​ Cobian Backup是一款功能强大的备份软件,支持自动定时备份、增量备份、差异备份等多种备份方式。…

网工路由基础——静态路由

一、静态路由的定义 静态路由是一种需要管理员手动配置的特殊路由。 二、静态路由的目的或背景 1)当网络结构比较简单时,只需要配置静态路由就可以使网络正常工作; 2)在复杂网络中,配置静态路由可以改进网络的性能&am…

PMP课程知识点很多,无法入手,该如何学习?

回顾整个学习过程,我花费了不少时间,但也学到了系统的项目管理知识,考试结果也让我感到满意。在学习过程中,我认为以下几点非常重要: 1、需要对课本进行整体阅读,以便对内容有一个整体印象; 2…

丰田生产方式的四大误解:揭示真相,打造高效生产新篇章

丰田生产方式作为世界知名的制造业管理模式,一直备受关注。然而,在其广泛传播和实践过程中,也产生了不少误解。本文将揭示丰田生产方式的四大代表性误解,带大家领略其真正的魅力。 误解一:丰田生产方式只适用于汽车行业…

数据结构与算法之树和二叉树的一些概念和性质

目录 前言 一、树的定义 二、树的若干术语 1.结点的度 2.叶子 3.双亲与孩子 4.兄弟 5.祖先 6.树的度 7.结点的层次 8.树的深度 9.有序树和无序树 10.森林 三、树的逻辑结构 四、树的存储结构 1.顺序存储 2.链式存储 五、二叉树 1.定义 2.二叉树的五种状态 …

vscode中配置 leetcode 插件

1. 环境准备 插件安装介绍 介绍 VS Code 1.23.0 Node.js 10 注意:请确保Node在PATH环境变量中。您也可以通过设定 leetcode.nodePath 选项来指定 Node.js 可执行文件的路径。 1.1 Node.js 安装 首先,您需要解压下载的 .tar.xz 文件。您可以使用以下…

C++反汇编,指针和内存分配细节,面试题05

文章目录 20. 指针 vs 引用21. new vs malloc 20. 指针 vs 引用 指针是实体,占用内存空间,逻辑上独立;引用是别名,与变量共享内存空间,逻辑上不独立。指针定义时可以不初始化;引用定义时必须初始化。指针的…

SpringBoot中使用RocketMQ实现事务消息来保证分布式事务的一致性(有代码)

前言 分布式事务是分布式系统中非常常见的问题。是非常必要钱常见的。实现的方式也是多种多样。今天这个视频主要来分享一下RocketMQ实现事务消息来保证分布式事务的一致性。不知道大家使用过这种方式没有。这种分布式事务的原理其实和本地消息表一样。 本地消息表实现分布式…