深入解读-如何用keycloak管理external auth

提到OAuth2,大家多少都有些了解。

不了解的话可以先看下之前的简单聊聊鉴权背后的那些技术先回顾一下基本概念和流程。

简单来说,以google授权为例,一般就是通过用户授权页面登录google账号,再跳转用code换取到相应权限的token,就可以代表用户去发起一些google api的请求。

直接代码实现这套授权逻辑并不复杂,不过如果还需要接入facebook授权,instagram授权呢,总不能挨个去实现一遍吧。

最好能有一套通用的解决方案来解放双手, 今天我们就聊聊如何用keycloak实现一套通用的身份验证和授权管理方案。

提前说明,无法本地复刻的技术方案不利于理解,也不利于方案探讨。虽然本文章所用代码是使用了rustaxum框架(为啥?因为rust is future!)+keycloak,但从服务启动到keycloak服务及相关配置,都用docker-compose+terraform+shell 脚本化管理,可100%本地复刻,欢迎本地尝试。(当然我说的是Mac下)代码地址: https://github.com/NewbMiao/axum-koans

Read More

聊聊ringbuffer

ringbuffer,是环形缓存区, 或叫环形队列。

不同于一般常见的队列,环形队列收尾相连,通过移动指针来控制队列中内容的读写。

这样做有什么好处呢?

最大的好处是环形队列出队(读取)后,不需要对后续队列内容进行搬移,可以后续由入队(写入)覆盖。

下面来看下一种常见的实现方式, 通过读写指针计数来实现环形队列

计数法实现

先过一遍代码,后边会有图解版说明,方便理解

代码参考自鸟窝无限缓存 channel-chanx

Read More

举例来学cond原语

最近看了鸟窝的《Go并发编程实战课》,写的挺有意思的,打算后边弄些例子再回顾下并发原语。

今天来看看cond原语。

cond 是用于等待或通知场景下的并发原语,条件不满足时,阻塞(wait)一组goroutine;条件满足后,唤醒单个(signal)或所有(broadcast)阻塞的goroutine.

比如10个运动员跑步,都准备好了,裁判才发令的例子:

Read More