前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GoFrame 框架(rk-boot): 快速实现服务端 JWT 验证

GoFrame 框架(rk-boot): 快速实现服务端 JWT 验证

原创
作者头像
尹东勋
发布2022-02-04 16:00:28
9100
发布2022-02-04 16:00:28
举报
文章被收录于专栏:开源 & 技术分享

介绍

本文介绍如何通过 rk-boot 实现服务端 JWT 验证逻辑。

什么是 JWT?

JSON 网络令牌是一种 Internet 标准,用于创建具有可选签名或可选加密的数据,让两方之间安全地表示声明。令牌使用私有秘密或公共/私有密钥进行签名。

简单来讲,就是通过 JWT 机制,让客户端通过一个密钥,把信息进行加密,添加到 HTTP 请求的 Header中,并传给服务端,服务端验证客户的合法性。

请参考 JWT 官网

很多 SAAS 服务,都采用了 JWT 作为用户验证,例如 github

请访问如下地址获取完整教程:

安装

代码语言:go
复制
go get github.com/rookie-ninja/rk-boot/gf

快速开始

1.创建 boot.yaml

boot.yaml 文件会告诉 rk-boot 如何启动 gogf/gf 服务。

在下面的 YAML 文件中,我们声明了两件事:

  • 开启 JWT 拦截器,并声明 JWT 的密钥为 my-secret 作为例子。后台会默认使用 HS256 算法,也可以自定义算法,我们会在下面介绍。
代码语言:yaml
复制
---
gf:
  - name: greeter                     # Required
    port: 8080                        # Required
    enabled: true                     # Required
    interceptors:
      jwt:
        enabled: true                 # Optional, default: false
        signingKey: "my-secret"       # Required

2.创建 main.go

代码语言:go
复制
// Copyright (c) 2021 rookie-ninja
//
// Use of this source code is governed by an Apache-style
// license that can be found in the LICENSE file.

package main

import (
	"context"
	"github.com/gogf/gf/v2/net/ghttp"
	"github.com/rookie-ninja/rk-boot"
	"github.com/rookie-ninja/rk-boot/gf"
	"net/http"
)

func main() {
	// Create a new boot instance.
	boot := rkboot.NewBoot()

	// Register handler
	entry := rkbootgf.GetGfEntry("greeter")
	entry.Server.BindHandler("/v1/hello", hello)

	// Bootstrap
	boot.Bootstrap(context.TODO())

	boot.WaitForShutdownSig(context.TODO())
}

func hello(ctx *ghttp.Request) {
	ctx.Response.WriteHeader(http.StatusOK)
	ctx.Response.WriteJson(map[string]string{
		"message": "hello!",
	})
}

3.创建 JWT Token

根据不同的语言,有很多开源库可以帮助我们创建 JWT Token,请参考官网

这里,为了方便,我们直接从官网里创建一个 Token,这个 Token 使用了 my-secret 作为密钥,HS256 作为算法,与 boot.yaml 里的配置一样。

4.验证

  • 发送请求到 /rk/v1/healthy,并提供上面创建的合法 JWT Token。
代码语言:txt
复制
$ curl localhost:8080/v1/hello -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.EpM5XBzTJZ4J8AfoJEcJrjth8pfH28LWdjLo90sYb9g"
{"message":"hello!"}
  • 发送请求到 /v1/hello,提供非法 JWT
代码语言:txt
复制
$ curl localhost:8080/v1/hello -H "Authorization: Bearer invalid-jwt-token"
{
    "error":{
        "code":401,
        "status":"Unauthorized",
        "message":"invalid or expired jwt",
        "details":[]
    }
}

JWT 拦截器选项

rk-boot 提供了若干 JWT 拦截器选项,除非是有特殊需要,不推荐覆盖选项。

选项

描述

类型

默认值

gf.interceptors.jwt.enabled

启动 JWT 拦截器

boolean

false

gf.interceptors.jwt.signingKey

必要, signing key

string

""

gf.interceptors.jwt.ignorePrefix

不验证制定 Path 的 JWT Header

string

""

gf.interceptors.jwt.signingKeys

提供多个 singing Key,请参考下面的介绍

[]string

[]

gf.interceptors.jwt.signingAlgo

签名算法,rk-boot 默认使用了 golang-jwt/jwt 作为依赖,支持的算法类型请参考下面的介绍

string

HS265

gf.interceptors.jwt.tokenLookup

拦截器寻找 CSRF Token 的方法,请参考下面的介绍

string

“header:Authorization”

gf.interceptors.jwt.authScheme

Auth Scheme,也就是 Authorization header 后面跟着的 Scheme

string

Bearer

支持的签名算法

HS256,HS384,HS512,RS256,RS384,RS512,ES256,ES384,ES512,EdDSA

tokenLookup 格式

代码语言:go
复制
// TokenLookup is a string in the form of "<source>:<name>" or "<source>:<name>,<source>:<name>" that is used
// to extract token from the request.
// Optional. Default value "header:Authorization".
// Possible values:
// - "header:<name>"
// - "query:<name>"
// - "cookie:<name>"
// - "form:<name>"
// Multiply sources example:
// - "header: Authorization,cookie: myowncookie"

多种 signing keys

请参考 RFC7515

提供多个 signing keys,用 : 分开 Key 和 Value。

代码语言:yaml
复制
signingKeys:
  - "key:value"

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 安装
  • 快速开始
    • 1.创建 boot.yaml
      • 2.创建 main.go
        • 3.创建 JWT Token
          • 4.验证
          • JWT 拦截器选项
            • 支持的签名算法
              • tokenLookup 格式
                • 多种 signing keys
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档