本地搭建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.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))
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jsp 实验12 servlet

一、实验目的 掌握怎样在JSP中使用javabean 二、实验项目内容&#xff08;实验题目&#xff09; 编写代码&#xff0c;掌握servlet的用法。【参考课本 上机实验1 】 三、源代码以及执行结果截图&#xff1a; 源代碼&#xff1a; inputVertex.jsp&#xff1a; <% page lang…

免费思维13招之四:主副型思维

免费思维13招之四:主副型思维 本节,给你分享一下产品型思维的第二种子思维:主副型思维 什么是主副型思维呢?传统的主副型思维是指对企业的核心、利润最高的产品进行收费,一些附加品、延伸产品进行让利,赠送给客户。 但是这早已过时了,现在升级之后的产品型思维,就是将…

​​​​【收录 Hello 算法】4.4 内存与缓存

目录 4.4 内存与缓存 4.4.1 计算机存储设备 4.4.2 数据结构的内存效率 4.4.3 数据结构的缓存效率 4.4 内存与缓存 在本章的前两节中&#xff0c;我们探讨了数组和链表这两种基础且重要的数据结构&#xff0c;它们分别代表了“连续存储”和“分散存储”两种物理…

如何防止WordPress网站内容被抓取

最近在检查网站服务器的访问日志的时候&#xff0c;发现了大量来自同一个IP地址的的请求&#xff0c;用站长工具分析确认了我的网站内容确实是被他人的网站抓取了&#xff0c;我第一时间联系了对方网站的服务器提供商投诉了该网站&#xff0c;要求对方停止侵权行为&#xff0c;…

16【PS Aseprite 作图】图像从Aseprite传输到PS

【内容背景】Aseprite很适合做像素图&#xff0c;有一个“完美像素”的选项&#xff0c;就不用在PS里面慢慢修线&#xff0c;能够省事很多 【具体操作】 勾选完美像素 Aseprite里面的“完美像素”能够减少修线的步骤&#xff0c;在“作图”的时候一定要注意勾选 导出 选择…

【全开源】Java线上云酒馆单预约系统源码小程序源码

核心功能&#xff1a; 座位预约&#xff1a;用户可以通过该系统提前预约酒馆的座位&#xff0c;选择就餐时间和人数&#xff0c;以及特殊座位&#xff08;如包厢、卡座等&#xff09;&#xff0c;确保到店后有合适的座位。酒水点餐&#xff1a;用户可以在预约的同时&#xff0…

OSError: image file is truncated (36 bytes not processed)解决方案

错误原因&#xff1a; 图像文件被损坏 解决方案&#xff1a; 代码开头添加如下两行代码&#xff1a; from PIL import ImageFile ImageFile.LOAD_TRUNCATED_IMAGES True

ETL工具kettle(PDI)入门教程,Transform,Mysql->Mysql,Csv->Excel

什么是kettle&#xff0c;kettle的下载&#xff0c;安装和配置&#xff1a;ETL免费工具kettle(PDI)&#xff0c;安装和配置-CSDN博客 mysql安装配置&#xff1a;Linux Centos8 Mysql8.3.0安装_linux安装mysql8.3-CSDN博客 1 mysql -> mysql 1.1 mysql CREATE TABLE user_…

RS2227XN功能和参数介绍及PDF资料

RS2227XN是一款模拟开关/多路复用器 品牌: RUNIC(润石) 封装: MSOP-10 描述: USB2.0高速模拟开关 开关电路: 双刀双掷(DPDT) 通道数: 2 工作电压: 1.8V~5.5V 导通电阻(RonVCC): 10Ω 功能&#xff1a;模拟开关/多路复用器 USB2.0高速模拟开关 工作电压范围&#xff1a;1.8V ~ 5…

【AIGC】重塑未来的科技巨轮

AIGC&#xff1a;重塑未来的科技巨轮 一、AIGC&#xff1a;从历史走来&#xff0c;向未来进发二、AIGC的三项核心技术三、AIGC的应用与未来 在当今科技飞速发展的时代&#xff0c;AI&#xff08;人工智能&#xff09;已经成为了一个无法忽视的热词。而与其紧密相连的AIGC&#…

01-01-4

1、字符的大小写转换 对应的代码&#xff1a; D:\Book\数据类型与运算符\数据类型与运算符\5、字符的大小写转换 int main() {char c a;//现在是小写字母a&#xff0c;要变为大写字母A。虽然赋值是字符a&#xff0c;但是本质上是将该字符对应的ASCII值放到该变量中c c - 3…

QAnything 在mac M2 上纯python环境安装使用体验(避坑指南)

这是一篇mac m2本地纯python环境安装 qanything的文章。安装并不顺利&#xff0c;官方提供的模型无法在本地跑。 这篇文章记录了&#xff0c;使用xinference来部署本地模型&#xff0c;并利用openAi的通用接口的方式&#xff0c;可以正常使用。 记录了遇到的所有的问题&#xf…

新手做抖音小店,卖什么最容易出单?抖音必爆类目来了!

哈喽&#xff01;我是电商月月 新手做抖音小店没有经验&#xff0c;也不了解市场需求&#xff0c;最好奇的就是&#xff1a;卖什么商品最容易出单&#xff0c;还在犹豫的朋友可以看看这五种类目&#xff0c;在2024年下半年必定火爆一次 一&#xff0e;生活电器类 天气炎热&a…

正点原子Linux学习笔记(六)在 LCD 上显示 jpeg 图像

在 LCD 上显示 jpeg 图像 20.1 JPEG 简介20.2 libjpeg 简介20.3 libjpeg 移植下载源码包编译源码安装目录下的文件夹介绍移植到开发板 20.4 libjpeg 使用说明错误处理创建解码对象设置数据源读取 jpeg 文件的头信息设置解码处理参数开始解码读取数据结束解码释放/销毁解码对象 …

30分钟彻底了解Flutter整个渲染流程(超详细)

30分钟彻底了解Flutter整个渲染流程[超详细] 从运行第一行代码出发WidgetsFlutterBinding初始化了一堆娃 三个中流砥柱SchedulerBindingRendererBindingWidgetsBinding 申请Vsync流程下发Vsync承接Vsync 从运行第一行代码出发 void main() {runApp(const MyApp()); }void runA…

卡码网模拟笔试题第十六期 |

A、构造二阶行列式 数字不大&#xff0c;直接四重循环暴力枚举 #include <iostream> using namespace std;int main() {int x;cin >> x;for (int i 1; i < 20; i) {for (int j 1; j < 20;j) {for (int x1 1;x1 < 20;x1) {for (int y 1;y<20;y){if…

2023-2024年家电行业报告合集(精选51份)

家电行业报告/方案&#xff08;精选51份&#xff09; 2023-2024年 报告来源&#xff1a;2023-2024年家电行业报告合集&#xff08;精选51份&#xff09; 【以下是资料目录】 空气炸锅出海品牌策划创意全案【家电出海】【品牌全案】 卡萨帝潮流消费品生活家电音乐节活动方案…

44.乐理基础-音符的组合方式-附点

内容参考于&#xff1a; 三分钟音乐社 首先如下图&#xff0c;是之前的音符&#xff0c;但是它不全&#xff0c;比如想要一个三拍的音符改怎样表示&#xff1f; 在简谱中三拍&#xff0c;在以四分音符为一拍的情况下&#xff0c;在后面加两根横线就可以了&#xff0c;称为附点…

山东齐鲁文化名人颜廷利:教育的本质区别重点是什么

教育的本质区别重点是‘方式’&#xff0c; 现在的教育却成为了一种‘形式’&#xff1b; 教育的核心价值关键载于‘实践’&#xff0c; 当前我们的教育观念却变成了消耗‘时间’&#xff1b; ‘读书’的原则在于‘堵疏’&#xff0c;作为汉语‘堵疏’一词&#xff0c;顾名思义…

亚马逊是如何铺设多个IP账号实现销量大卖的?

一、针对亚马逊平台机制&#xff0c;如何转变思路&#xff1f; 众所周知&#xff0c;一个亚马逊卖家只能够开一个账号&#xff0c;一家店铺&#xff0c;这是亚马逊平台明确规定的。平台如此严格限定&#xff0c;为的就是保护卖家&#xff0c;防止卖家重复铺货销售相同的产品&a…