使用 sync_sso 同步 DiscourseConnect 用户数据 [Java]

最近有一个使用 SSO 把已有的用户同步到 Discourse 的需求。

所以,我就根据官方针对 PHP 实现(Sync DiscourseConnect user data with the sync_sso route - developers - Discourse Meta )写了一个有关 Java 的实现。

实现的方法很简单,但是需要用到一些额外的包,最重要的是 Apache commons codec 和 Okhttp。

Apache commons codec 是用来生成数字签名的,Okhttp 是用来发送 Http Post 请求的。

设置相关的参数

这里有 4 个参数需要提前获得。

获得下面 4 个参数的方法请参考文章:Discourse 使用 DiscourseConnect 来进行用户数据同步

const apiKey = '4fe83002bb5fba8c9a61a65e5b4b0a3cf8233b0e4ccafc85ebd6607abab4651a';
const apiUser = 'system';
const connectSecret = 'jdhb19*Xh3!nu(#k';

设置 SSO 参数

参数的设置参考了 URL Get 方法的参数设置。

我们 Java 的代码为:

            URIBuilder builder = new URIBuilder();builder.addParameter("external_id", "1");builder.addParameter("email", "info@isharkfly.com");builder.addParameter("username", "info.visafn.sso");builder.addParameter("add_groups", "bar");builder.addParameter("require_activation", "false");url = StringUtils.removeStart(builder.build().toString(),"?");System.out.println(StringUtils.removeStart(url, "?"));

Base64 和数字签名

当拿到上面 URL 的字符串后,我们有后面 2 个步骤要做。

第一个步骤就是对拿到的 URL 进行 Base64 转换,

第二个步骤就是对拿到已经转换成功的 Base64 字符串进行数字签名,签名这里用了 HMAC_SHA_256 算法。

同时在第一步获得密钥,需要作为参数结合算法参与运算。

        String sso= "admin/users/sync_sso";String sig= new HmacUtils(HmacAlgorithms.HMAC_SHA_256, "55619458534897").hmacHex(ssoPayload);

当拿到上面 2 个值后,重新构建一个 Json 数据结构。

类似下面的数据结构,然后作为 Post 参数的数据:

{"sso": "P2V4dGVybmFsX2lkPTEmZW1haWw9aW5mbyU0MHZpc2Fmbi5jb20mdXNlcm5hbWU9aW5mby52aXNhZm4mcmVxdWlyZV9hY3RpdmF0aW9uPXRydWU=","sig": "403a205a004e37ffab2bf77cc12b2eac352d71820983706d86984eec9821a0c4"
}

发送 POST 请求

可以使用任何工具,只要支持 HTTP 的都可以。

现在 Java 用 OkHttp 比较多,所以我们就用 OkHttp 来发送请求。

private OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(MediaType.parse("application/json"), objectMapper.writeValueAsString(syncSSO));Response response = client.newCall(postRequest(path, body)).execute();

上面的 postRequest 是一个方法,在这个方法中我们利用已有的参数来构造请求。

方法是这样写的:

    public Request postRequest(String path, RequestBody body) {HttpUrl.Builder urlBuilder = HttpUrl.parse(site_url + path).newBuilder();Request request = new Request.Builder().url(urlBuilder.build().toString()).addHeader("api-username", api_username).addHeader("api-key", api_key).post(body).build();return request;}

如果没有问题,上面的代码就能完成 SSO 数据的同步调用。

使用 sync_sso 同步 DiscourseConnect 用户数据 [Java] - Discourse - iSharkFly

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

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

相关文章

07网络编程及网络基础知识

【一】C/S模型和B/S模型 1.C/S模型----》c是指客户端,请求服务的,s是服务端,提供服务的 2.B/S模型----》B/S架构本质也是C/S架构让浏览器充当各个厂家的客户端 用户无需对应下载相应客户端 两种架构的优缺点C/S架构:王者荣耀优势:针对客户端…

using 用于枚举值

1. 用using声明枚举值 假设有一个限定范围的枚举类型(用枚举类声明): enum class Status{open, progress, done 9}; 与未限定作用域的枚举类型(不带类的枚举) 不同,此类型的值需要带有类型名的限定符: auto x Status::open; // OK auto x open; // ERROR…

腾讯云COS上传文件出现的问题

1、没有配置 ObjectMetadata 的文件长度 腾讯云COS上传文件出现数据损坏问题_no content length specified for stream data. strea-CSDN博客 2、 使用 FileInputStream使用完没有及时关闭导致报错 ClientAbortException: java.nio.channels.ClosedChannelException 添加…

滑动谜题 leetcode的BFS题目 启发如何写一个拼图编程呢

题目链接 题目要求,要将上面的拼板拼成123450 首先,转换为字符串,为什么要转换为字符串呢,因为处理会变得很简单比如示例一,转化为字符串是12345,目标字符串为123450,只需要证明通过某种交换&a…

AI爆文写作:或许开放性的标题,才会更让人想点开了解答案

这是新华社公众号的一条推文 从信息传递上来说,新闻标题应该直接,包含关键信息。 但这个标题,却没有直接点名哪个国家,要点进去才能看到。 这就是要让人点开的标题特征,标题没有提供完整信息,是开放性的…

Apache Hive 安装与配置的详细教程

1. Hive简介 Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能…

infoq读书笔记-Davide Taibi博士-花8年转型微服务却得不到回报,问题出在哪 儿?

InfoQ:您的论文“On the Definition of Microservice Bad Smells”涉及非常多的微服务不良做法,但如果要用几个大类别来列举危害性比较大的微服务反模式,您认为会是哪几类?另外,您能再大概分析说明下造成这个几个反模式…

linux新机快速配置ssh

配置SSH以实现证书登录 要配置新的Linux机器以实现证书登录,您需要执行以下步骤: 安装SSH服务器: sudo apt-get install openssh-server修改SSH端口(可选): SSH配置文件(通常位于/etc/ssh/sshd…

产品经理-产品设计规范(六)

1. 设计规范 2. 七大定律 2.1 菲茨定律 2.1.1 概念 2.1.2 理解 2.1.3 启示 按钮等可点击对象需要合理的大小尺寸根据用户使用习惯合理设计按钮的相对和绝对位置屏幕的边和角很适合放置像菜单栏和按钮这样的元素 2.1.4 参考使用手机习惯 2.1.5 案例 2.2 席克定律 2.2.1 概念 …

Android make命令简述

Android make命令简述 Android的make系统是一个构建工具,用于管理Android应用项目的编译和构建过程。它使用Makefile文件来定义项目的编译规则和依赖关系。在Android开发中,make系统通常与NDK(Native Development Kit)一起使用,用于编译和构建 C/C++ 代码。make是GNU Mak…

MySQL8.0新特性CTE表达式递归实现累加运算 1+2+…+n 等于多少?

上一篇内容,通过MySQL存储过程实现累加运算 12…n 等于多少的需求,使用当前主流版本MySQL5.7.x 和MySQL8.0.x,以及最新的MySQL8.4 LST版本。 WITH AS子句在MySQL 8.0.x及更高版本中得到支持,而在MySQL 5.7及以下版本中则不支持。…

Spring Boot 中使用 MDC 追踪一次请求全过程(日志链路)

Spring Boot 中使用 MDC 追踪一次请求全过程(日志链路) ControllerLogAspect package com.yymt.common.trace;import cn.hutool.json.JSONUtil; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.…

XShell-连接-Centos 7

XShell 连接Centos 7 一.准备 安装XShell XShell下载地址: 在虚拟机上安装Centos 7,具体操作自行学习 二.Centos 7的准备 1.网络适配器修改为NAT 2.获取IP 输入命令: ip addr我的Centos 7对外IP为192.168.174.129 三.XShell连接Cento…

C++标准模板库(STL)简介

简述 STL(Standard Template Library)是一套功能强大的 C 模板类和函数的集合,它提供了一系列通用的、可复用的算法和数据结构。它帮住我们实现了基本的数据结构容器,和与之对应的操作。使用它可以减少代码长度,增加代…

TCP 三次握手协议能否变成二次握手

TCP 三次握手协议能否变成二次握手? 看了很多回答,都比较长,按照个人理解的话, 1、第一次握手:建立连接时,客户端发送syn包(synj)到服务器,并进入SYN_SENT状态&#xf…

docker 离线镜像

1. 在已经部署了镜像的机器上获取镜像   1.1 获取镜像名     docker images   1.2 打包选中对应的镜像     docker save <image_name> -o <image_name>.tar 2. 在将要使用的机器上部署需要的镜像   2.1 加载镜像     docker load -i <image_n…

【百度云千帆AppBuilder】诗词达人:AI引领的诗词文化之旅

文章目录 写在前面&#xff1a;百度云千帆AppBuilder诗词达人&#xff1a;AI引领的诗词文化之旅功能介绍&#xff1a;诗词达人智能体的深度体验1. 诗词接龙学习2. 诗词深度解析3. 互动式问答4. 诗词创作辅助 技术特点详解&#xff1a;"诗词达人"智能体的创新技术零代…

项目9-网页聊天室8(消息的发送和接收之websocket)

这是整个项目最最核心的部分. 但是这个部分的编写&#xff0c;需要依赖"基础设施" 包括不限于前面已经实现的 主界面,用户管理,会话管理, 好友管理, 消息管理 等等.... 发送消息,和接收消息,需要"实时传输 张三 发了一条消息,李四 这边立即就能接收到, 这样的…

【游戏引擎】Unity脚本基础 开启游戏开发之旅

持续更新。。。。。。。。。。。。。。。 【游戏引擎】Unity脚本基础 Unity脚本基础C#语言简介C#基础 Unity脚本基础创建和附加脚本MonoBehaviour生命周期生命周期方法 示例脚本 Unity特有的API常用Unity API 实践示例&#xff1a;制作一个简单的移动脚本步骤1&#xff1a;创建…

对于超长的json数据包,采用分割方式分别上传

例如对于一个长度为5.5M的json数据包&#xff0c;可以将其分割为一包数据长度为64KB大小的小包&#xff0c;再依次读取上传 参考代码如下&#xff1a; #include <stdio.h> #include <string.h>#define SEGMENT_SIZE 64*1024 // 每个数据段的大小&#xff0c;这里…