keyclock实现三方登录

news2024/9/16 12:19:01

公司希望我把公司的keycloak作为新项目的一种第三方登录方式时,就像微信,google,github,使用keycloak上的账户资源

因此,先需要跟公司keyclock管理员联系,让他把各个端点url,keycloak颁发的client_id和client_secret都给你,并让三方管理员设置好我们需要重定向的地址后,就可以通过postman模拟整个操作过程了。

首先根据你自己的端点url以及client_id和redirect_uri可以确定出,访问到keyclock登录页的url

https://xxxxxxxxx/realms/ms/protocol/openid-connect/auth? 
response_type=code& 
client_id=xxxxxxx&  
scope=openid%20profile%20roles%20email&  
redirect_uri=http://127.0.0.1:5003/
  • 客户端ID client_id=aaa(需要找管理员拿到)
  • 授权类型 response_type=code
  • scope类型 scope=openid
  • 三方应用的回调地址 redirect_uri(需要先让管理员绑定,再找管理员拿到)
  • https://xxxxxxxxx/realms/ms/protocol/openid-connect/auth? (需要找管理员拿到)

然后根据这个地址就可以访问到登录页

登录所有步骤走完之后,就会跳转都我的127.0.0.1:5003页面

登录成功后,重定向到你的系统中,并带着code和redirect_uri及session等信息。

http://127.0.0.1:5003/?
session_state=406a3a77-0e69-460d-be9b-5488868204b2&
iss=https%3A%2F%2Fauth.successfulmatch.com%2Frealms%2Fms&
code=5321e12c-2de8-4201-9c73-a73ca6051bb2.406a3a77-0e69-460d-be9b-5488868204b2.83dee5bc-b3da-4991-902f-bae1214cfcb9
  • 三方应用系统的回调地址:redirect_uri
  • 授权码:code
  • 会话标识:session_state

然后直接拿着code去postman请求

https://xxxxxx/realms/ms/protocol/openid-connect/token

请求完成可以拿到响应内容为access_token和refresh_token

通过access_token来获取用户信息,正常返回200,如果是返回401,你需要从新获取
获取用户信息:/auth/realms/xxx/open/userinfo。

其中带上access_token

就可以正常拿到用户信息了。然后根据自己的流程就可以做相应的操作了

具体流程图其实就是

参考keycloak~作为第三方登录的对接标准 - 张占岭 - 博客园 (cnblogs.com)

当然上面只是用postman来拿信息,你也可以直接解析第二步返回回来的一些token值,也可以直接拿到对应的信息。

以下是我用laravel写的,通过code拿去用户信息的接口

class KeyclockService extends BaseService
{
    public function handleAuthorizationCode(): array
    {
        $code = $this->input['code'];
        $client = new Client();
        $response = $client->post('https://auth.successfulmatch.com/realms/ms/protocol/openid-connect/token', [
            'form_params' => [
                'grant_type' => 'authorization_code',
                'code' => $code,
                'client_id' => 'xxxxxx',
                'client_secret' => 'xxxxxxxx',
                'redirect_uri' => 'http://127.0.0.1:5003/'
            ]
        ]);
        $body = json_decode($response->getBody(), true);
        $accessToken = $body['access_token'];
        $refreshToken = $body['refresh_token'];
        $idToken = $body['id_token'];
        $decodedIdToken = $this->decodeIdToken($idToken);
        $decodedAccessToken = $this->decodeIdToken($accessToken);
        $decodedRefreshToken = $this->decodeIdToken($refreshToken);
        $userId = $decodedIdToken['sub']; // 用户的唯一标识符
        $userName = $decodedIdToken['preferred_username']; // 用户名
        return [
            '$decodedIdToken' => $decodedIdToken,
            '$decodedAccessToken' => $decodedAccessToken,
            '$decodedRefreshToken' => $decodedRefreshToken,
            'user_id' => $userId,
            'user_name' => $userName,
            'access_token' => $accessToken,
            'id_token' => $idToken
        ];

    }

    private function decodeIdToken($idToken)
    {
        $tokenParts = explode('.', $idToken);
        $tokenPayload = base64_decode($tokenParts[1]);
        return json_decode($tokenPayload, true);
    }
}

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

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

相关文章

MATLAB将两个折线图画在一个图里

界面如图 输入行数和列数,点击开始填入数据,其中第一列为x值,后面几列,每一列都是y坐标值,填好后点击画在同一张图里即可。点击置零就把所有数变成0,另外也可以选择节点样式。 .mlapp格式的文件如下 夸克…

AI时代的产品经理的成长指南_pdca循环理论制定ai学习成长计划

一、人人不都是产品经理 大多数人听到“产品经理”这个词,总会联想到“人人都是产品经理”这句话。但实际上产品经理这个岗位并没有那么简单。 用一句话概括产品经理的职责就是“帮助团队交付正确产品给用户的人”。也就是说,产品经理要能凝聚团队的力…

归并排序-MergeSort (C语言详解)

目录 前言归并排序的思想归并排序的递归法归并排序的非递归法归并排序的时间复杂度与适用场景总结 前言 好久不见, 前面我们了解到了快速排序, 那么本篇旨在介绍另外一种排序, 它和快速排序的思想雷同, 但又有区别, 这就是归并排序, 如下图, 我们对比快速排序与归并排序. 本…

在线JSON可视化工具--改进

先前发布了JSON格式化可视化在线工具,提供图形化界面显示结构关系功能,并提供JSON快速格式化、JSON压缩、快捷复制、下载导出、对存在语法错误的地方能明确显示,而且还支持全屏,极大扩大视野区域。 在线JSON格式化可视化工具 但…

[Labview] 二维数组写入表格

就一个二维数组写表,CSDN天天让我改进质量 简直是迫害完美主义 天知道Labview有什么思路好写,就一个破连连看(ˉ▽ˉ;)... 随便写点什么碎碎念占字数好了

Linux源码阅读笔记09-进程NICE案例分析1

task_nice task_nice函数功能:获取某个进程的nice值,其中nice值为进程的优先级,与静态优先级有关(nicestatic_prio-120)。 nice的取值范围:-20 ~ 19 内核源码 根据内核的注释可以知道:task_n…

时间12小时和24时转换方法

24小时时间转为12小时制 function convertTo12Hour(time24h){let [hours, minutes] time24h.split(:);let modifier 上午;if (parseInt(hours, 10) > 12) {modifier 下午;hours (parseInt(hours, 10) - 12).toString();}if (parseInt(hours, 10) 12) {modifier 下午;}…

Arduino 与树莓派常用的 IMU 传感器

惯性测量单元(IMU)是一种高度集成的传感器系统,广泛应用于需要高精度运动和姿态信息的领域。某些高精度要求下,还需要辅以温度、气压等其他传感器信息。 一、组成与功能 1. 组成 9 轴 IMU 由三个主要部分组成:3 轴加…

系留无人机+自组网+单兵图传:低空集群组网指挥系统技术详解

低空无人机集群的控制、调度、信息回传需要有高度可靠和稳定的无线通信链路来保障。我国发达的公网基础设施为上述应用创造了良好的条件,但低空应用必须要考虑到在极端情况下公网瘫痪造成的通信链路中断带来的影响,因此有必要在公网之外,寻求…

C语言----文件操作

1.为什么使用文件? 如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化…

Vue85-Vuex的求和案例

一、需求 二、开发 2-1、index.js中vuex的代码 注意: 书写格式:actions中的函数名用小写!mutations中的函数名,用大写。 注意: 2-2、组件count.vue中的代码 2-3、代码优化

oracle数据库无法open,报“ORA-01113 file 1 needs media recovery”错误,教你用“六脉神剑”来开库

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG数据库运维(如安装迁移,性能优化、故障应急处理等) 公众号:老苏畅谈运维 欢迎关注本人公众号,更多精彩与您分享。在系统…

Linux:文件系统与日志分析

一、block与inode 1.1、概述 文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。 一般连续八个扇区组成一个"块”(block),一个块是4K大小,是文件存取的最小单位。 文件数据包括实际数据…

如何在 Odoo 16 中通过函数创建和管理自定义字段

Odoo 几乎为每种功能提供了每种类型的字段。通常,我们为字段定义一个类定义并将其包含在模型中。但是,在某些业务实例中,我们可能需要通过添加新字段从用户界面本身修改模型。在本博客中,让我们研究如何定义自定义字段在视图中的位…

智能数字人系统的主要功能

智能数字人系统或虚拟数字人系统,是指利用人工智能技术构建的虚拟人物形象,能够与人进行自然交互的系统。数字人系统的主要功能包括以下几个方面。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1. 语言理解与…

从游戏到营销:抽卡机小程序的多维度应用探索

在数字化时代,小程序作为一种轻量级、即用即走的应用形态,正逐步渗透到人们生活的方方面面。其中,抽卡机小程序以其独特的趣味性和互动性,不仅在游戏领域大放异彩,更在营销领域展现出广阔的应用前景。本文将从游戏起源…

RocketMQ实战:一键在docker中搭建rocketmq和doshboard环境

在本篇博客中,我们将详细介绍如何在 Docker 环境中一键部署 RocketMQ 和其 Dashboard。这个过程基于一个预配置的 Docker Compose 文件,使得部署变得简单高效。 项目介绍 该项目提供了一套 Docker Compose 配置,用于快速部署 RocketMQ 及其…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(七)-shell语法(5)

shell语法的一些知识和练习,可以当作笔记收藏一下!! 文章目录 前言 一、shell 二、shell语法 1.文件重定向 2.引入外部脚本 3.作业 总结 前言 shell语法的一些知识和练习,可以当作笔记收藏一下!! 提示&…

01:Linux的基本命令

Linux的基本命令 1、常识1.1、Linux的隐藏文件1.2、绝对路径与相对路径 2、基本命令2.1、ls2.2、cd2.3、pwd / mkdir / mv / touch / cp / rm / cat / rmdir2.4、ln2.5、man2.6、apt-get 本教程是使用的是Ubuntu14.04版本。 1、常识 1.1、Linux的隐藏文件 在Linux中&#xf…

全网首发-RocketMQ 4.0实现完美灰度发布方案

一、背景 为了控制发版带来的影响面等问题,我们公司基建团队自研灰度发布流程,目前几乎所有服务发版都会严格先走灰度发布验证再上线。当前已支持http、gRPC等接口调用方式进行灰度流量转发,使用消息队列进行业务实现的场景的暂不支持。 ps:…