go - 如何在 go 中测试验证 JWT 路由

标签 go routes jwt jwt-go

我想使用 JWT 身份验证来测试 protected 路由。

已经尝试接收响应并尝试传递 token ,但它仅返回 401 作为代码响应。

package routes

import (
    "fmt"
    "github.com/stretchr/testify/assert"

    "net/http"
    "net/http/httptest"
    "testing"
)

func performRequest(r http.Handler, method, path string, t *testing.T) *httptest.ResponseRecorder {
    token := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InJ1aWJsYWVzZUBnbWFpbC5jb20iLCJleHAiOjE1NTk0MjQxMjIsIm9yaWdfaWF0IjoxNTU5NDIwNTIyfQ.kdIRkLjRc63VQvDcHECId45_8rlCr8QlAmVBcEG2tlE"
    w := httptest.NewRecorder()
    req, _ := http.NewRequest(method, path, nil)
    req.Header.Set("Authorization", fmt.Sprintf("Bearer %v", token))
    r.ServeHTTP(w, req)

    assert.Equal(t, w.Code, http.StatusOK)
    return w
}

func TestStartRouter(t *testing.T) {
    // Assert we encoded correctly,
    // the request gives a 200
    // Perform a GET request with that handler.
    router := StartRouter()

    w := performRequest(router, "GET", "/",t)
    assert.Equal(t, http.StatusOK, w.Code)
    w = performRequest(router, "POST", "/api/v1/signin",t)
    assert.Equal(t, http.StatusOK, w.Code)
    w = performRequest(router, "POST", "/api/v1/signup",t)
    assert.Equal(t, http.StatusOK, w.Code)
    w = performRequest(router, "GET", "/user",t)
    assert.Equal(t, http.StatusOK, w.Code)
    w = performRequest(router, "GET", "/user/id",t)
    assert.Equal(t, http.StatusOK, w.Code)
    w = performRequest(router, "GET", "/customer",t)
    assert.Equal(t, http.StatusOK, w.Code)
    w = performRequest(router, "GET", "/customer/id",t)
    assert.Equal(t, http.StatusOK, w.Code)

}

现在当我运行 go test 时,我只得到代码 401,但想要得到 HTTP 响应代码 200。

最佳答案

只需使用一个验证您的 token 的函数,这里是 jwt-go 的示例

func isValidToken(tokenString, yourSecret string) bool {
    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
        }
        return []byte(yourSecret), nil
    })

    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
        return true
    }
    return false
}

关于go - 如何在 go 中测试验证 JWT 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56415581/

相关文章:

php - 重置密码时避免出现 "auto login"

c# - JWT TOKEN 生成 Client_Assertion

c# - 注入(inject) IOptions<> 的实例

bash - 创建不写入标准输出的用户提示

go - golang 1.18 中逆变类型如何与泛型一起工作?

XML 解码 base64 字符串以在 Golang 中构造

Angular 5 : Cannot match any routes

docker - 使用 Docker 的标准 Go 项目布局导致构建上下文问题

ruby-on-rails - 自定义Rails路由的正确方法

Spring Boot OAuth2 + JWT 和 UserDetailsS​​ervice