用Golang实现一个简单的Cassandra OAuth2客户端和令牌模型

123 阅读1分钟

在这个例子中,我们将为OAuth2协议创建Cassandra数据模型。这里的重点是设计模型和实际执行的相关查询。我们不打算创建真正的API端点,但我至少会添加关于每个功能如何使用的例子。

密钥空间

CREATE KEYSPACE IF NOT EXISTS auth

模型

客户

id 字段在代码中没有使用。它可以被用作另一个应用程序的 "外键",那里保存着关于客户的更详细的信息。这完全取决于你的系统设计,所以如果你想,你可以把它删除。

CREATE TABLE IF NOT EXISTS auth.clients (

令牌

访问和刷新令牌记录都会有一个TTL,所以这个表的作用就像一个缓存。这是为了防止出现一个巨大的表。

CREATE TABLE IF NOT EXISTS auth.tokens (

应用流程

客户端注册

通过接受UUID v4格式的外部标识符来创建一个新客户。

POST /api/v1/clients HTTP/1.1
HTTP/1.1 201 Created

创建令牌 (client_credentials)

创建一个新的访问和刷新令牌。

POST /oauth/token HTTP/1.1
HTTP/1.1 200 OK

刷新令牌 (refresh_token)

创建一个新的访问和旋转刷新令牌。

POST /oauth/token HTTP/1.1
HTTP/1.1 200 OK

撤销令牌

撤销属于一个客户的访问令牌或刷新令牌。

POST /oauth/revoke HTTP/1.1

消耗API

在进行受保护的API请求之前,验证一个访问令牌。

{Method} {endpoint} HTTP/1.1

结构

├── docker

文件

docker-compose.yaml

version: "3.7"

cassandra.go

package cassandra

error.go

package storage

type.go

package storage

model.go

package storage

经理.go

package storage

客户端

package cassandra

符号.go

package cassandra

主程序

package main

测试

当前状态

cqlsh> SELECT * FROM auth.clients;
cqlsh> SELECT * FROM auth.tokens;

新状态

在这个阶段,运行go run -race main.go 命令。

$ go run -race main.go
cqlsh> SELECT * FROM auth.clients;
cqlsh> SELECT * FROM auth.tokens;