python - WebSocket JWT Token 连接授权

标签 python authentication go websocket jwt

我正在尝试与需要传入 jwt token 的 URL(python 客户端)建立 websocket 连接,服务器(在 GO 中实现)监听此请求并应该通过解析 token 进行身份验证。

我尝试使用这部分代码来发出请求 -

def test_auth_token(token)
    conn = create_connection("ws://<IP>:port"+ '/'+ container.uuid + '?token='+token)
    result = conn.recv()
    assert result is not None

此请求命中运行此代码以验证此请求的服务器

func ParseFromRequest(req *http.Request, keyFunc Keyfunc) (token *Token, err 错误) {

// Look for an Authorization header
if ah := req.Header.Get("Authorization"); ah != "" {
    // Should be a bearer token
    if len(ah) > 6 && strings.ToUpper(ah[0:6]) == "BEARER" {
        return Parse(ah[7:], keyFunc)
    }
}

// Look for "access_token" parameter
req.ParseMultipartForm(10e6)
if tokStr := req.Form.Get("access_token"); tokStr != "" {
    return Parse(tokStr, keyFunc)
}

return nil, ErrNoTokenInRequest

尽管我将 token 作为查询参数传递,但每次我都会收到“ErrNoTokenInRequest”输出。服务器端 token 验证由包含上述 GO 例程的外部库完成 - https://github.com/dgrijalva/jwt-go/blob/master/jwt.go

我不确定,服务器找不到我客户端发送的 token 的可能原因是什么?它应该作为有效载荷或 header 或其他东西发送吗?有人可以指出让这个模块工作吗?

使用“access_token”作为查询参数我得到这个异常 -

self = <websocket._core.WebSocket object at 0x10a15a6d0>
host = 'x.x.x.x.', port = 9345
resource = '/v1/stats/fff51e85-f2bb-4ace-8dcc-fde590932cca?access_token=eyJhbGciOiJSUzI1NiJ9.eyJleHAiOjE0MjIxMzEyMzUsInN1YiI6ImNh...vxvBmtZRrUTY5AcvrjbojXqLxFHL_CMsmTZfTXhOiy-7W2V95bqts2Wy4R8oQvsfDylYJWCBTzZNKHvPVFpcl0jQKLm1ms-LOJg1w-k23VfojZucPGtY5A'
options = {}
headers = ['GET /v1/stats/fff51e85-f2bb-4ace-8dcc-fde590932cca?access_token=eyJhbGciOiJSUzI1NiJ9.eyJleHAiOjE0MjIxMzEyMzUsInN1YiI... 'Host: x.x.x.x.:9345', 'Origin: http://x.x.x.x.:9345', 'Sec-WebSocket-Key: BN1n2BcCT/CUGh9MHeyL5g==', ...]
key = 'BN1n2BcCT/CUGh9MHeyL5g=='
header_str = 'GET /v1/stats/fff51e85-f2bb-4ace-8dcc-fde590932cca?access_token=eyJhbGciOiJSUzI1NiJ9.eyJleHAiOjE0MjIxMzEyMzUsInN1YiI6...3:9345
Origin: http://192.168.59.103:9345
Sec-WebSocket-Key: BN1n2BcCT/CUGh9MHeyL5g==
Sec-WebSocket-Version: 13

最佳答案

很简单,服务不希望将 token 作为查询参数传递,而是希望将其包含在请求的 header 中。

使用来自 https://github.com/liris/websocket-client 的 websocket 库的示例

def test_auth_token(token)
    header="Authorization: BEARER " + str(token)
    conn = create_connection("ws://<IP>:port"+ '/'+ container.uuid", header)
    result = conn.recv()
    assert result is not None

关于python - WebSocket JWT Token 连接授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28129139/

相关文章:

ruby-on-rails - 如何使用设备将用户关联到帐户?

ReactJS 如何从获取请求到后端设置 Cookie

python - 用相邻天的数据平均值填补数据缺口

python - 二进制搜索功能

python - 构建时的服务器-数据库通信问题

javascript - 授权时无法提取授权码

Golang listenUDP 多个端口阻塞与 BigTable 连接

json - 将 slice 对象序列化为 JSON 会产生乱码

Go Unicode 组合字符(字素簇)和 MS Windows 控制台 cmd.exe

python - Django表单修改HTML标签