Skip to content

funny/jsonapi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 

Repository files navigation

介绍

这是一个简易的Web接口框架,有以下特性:

  1. 请求和响应纯粹只用JSON格式
  2. 统一的防回放攻击机制
  3. 无第三方库依赖
  4. 速错原则

用法

示例 - 服务端接口:

api := jsonapi.New(crypto.SHA256, jsonapi.StdLogger)

api.HandleFunc("/echo", func(ctx *jsonapi.Context) interface{} {
	var req map[string]int

	ctx.Request(&req)

	return map[string]int{
		"value_is": req["value"],
	}
})

go http.ListenAndServe(":8080", api)

示例 - 发送请求:

req, err := jsonapi.Get(
	"http://localhost:8080/echo", 
	map[string]int{
		"value": 123,
	},
)
if err != nil {
	t.Fatal(err)
}

var rsp map[string]int
err = req.Do(http.DefaultClient, &rsp)
if err != nil {
	t.Fatal(err)
}

if rsp["value_is"] != 123 {
	t.Fatal(rsp)
}

示例 - 服务端验证请求:

api := jsonapi.New(crypto.SHA256, jsonapi.StdLogger)

api.HandleFunc("/verify", func(ctx *jsonapi.Context) interface{} {
	var req map[string]int

	ctx.Request(&req)

	ctx.Verify("mykey", 3)

	return map[string]int{
		"value_is": req["value"],
	}
})

go http.ListenAndServe(":8080", api)

示例 - 发送请求并签名:

req, err := jsonapi.Get(
	"http://localhost:8080/verify", 
	map[string]int{
		"value": 123,
	},
)
if err != nil {
	t.Fatal(err)
}

req.Signature(crypto.SHA256, "mykey", jsonapi.Now())

var rsp map[string]int
err = req.Do(http.DefaultClient, &rsp)
if err != nil {
	t.Fatal(err)
}

if rsp["value_is"] != 123 {
	t.Fatal(rsp)
}

防回放机制

防回放机制支持有效期验证和请求参数签名验证。

这套机制的基本算法是:hash(key + time + path + json)

其中hash算法可以在App实例化时指定;time为客户端通过HTTP头告诉服务端的请求签名时间;path为当前请求的路径;json为请求内容。

客户端通过HTTP头t告知服务端请求签名时间,这个时间为unix时间(UTC时区);通过HTTP头s告知服务端请求签名。

服务端通过调用ctx.Verify(key, timeout)来验证请求有消息,此调用必须在ctx.Request()调用之后。

传入Verify方法的key为空字符串时,框架不验证请求签名。

传入Verify方法的timeout为0时,框架不验证请求有效期。

更具体的验证逻辑请阅读Verify方法的逻辑。

About

一个简单的Web接口框架

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages