golang前后端jwt對接


0x0 什么是jwt

JWT是JSON Web Token的縮寫,可以用作授權認證。傳統的授權認證一般采用session,由於session存儲在服務端,加大了服務端的計算量,
而且多台服務器之間存在着session同步的問題。而JWT存儲在客戶端,不僅減少了服務端的計算量,而且天生支持分布式。

0x1 jwt的結構

JWT由三部分組成:
Header:頭部,表明類型和加密算法
Claims:聲明,即載荷(承載的內容)
Signature:簽名,這一部分是將header和claims進行base64轉碼后,並用header中聲明的加密算法加鹽(secre)后構成。
即:
tmpstr = base64(header)+base64(claims)
signature = encrypt(tmpstr,secret)
最后三者用"."連接,即:
token = base64(header).base64(claims).signature

詳細的介紹可以看jwt中文文檔.
另外jwt官網有調試工具,可以輔助查錯。

0x2 在web中如何使用

客戶端發送登錄請求(這個登錄請求是不需要jwt驗證的),在登錄請求里返回token。
客戶端把token保存起來,以后其它需要token的請求就在header里帶上token。

0x3 實戰

在echo框架中使用jwt

這里是官方文檔教程,說的比較清楚了。
我們僅需要在登錄接口里生成jwt的token,並返回,jwt中間件會自動幫我們做jwt的驗證。可以把先做分組路由,在分組里使用jwt中間件。
如果不使用框架,可以直接用jwt-go

配合axios.js

我們的前端使用了vue+axios,他嫌每次都拼接header麻煩,於是幫他在網上查了一下,可以配置axios為自動添加header。
axios的代碼如下:參考了這篇博客

require('es6-promise').polyfill(); // 引入一次就行
import axios from 'axios';

// 創建 axios 實例
const Axios = axios.create({
    baseURL: 'your base url',
    timeout: 5000,
    
});

Axios.interceptors.request.use(
    config => {
        if (config.method === 'post') {
            const formData = new FormData();
            Object.keys(config.data).forEach(key => formData.append(key, config.data[key]));
            config.data = formData;
        }

        if (config.url !="/login" && localStorage.token != undefined ){
            config.headers.Authorization = 'Bearer ' + localStorage.token;
        }
        return config;
    },
    error => {
        return Promise.reject(error);
    }
);

Axios.interceptors.response.use(
    res => {
        return Promise.resolve(res);
    },
    error => {
        return Promise.reject(error);
    }
);

// 將 Axios 實例添加到Vue的原型對象上
export default {
    install(Vue) {
        Object.defineProperty(Vue.prototype, '$Axios', { value: Axios });
    }
};

注意if (config.method === 'post') 這里是把post過去的數據轉為表單,如果不加這一句,提交過去的是文本了,在服務器端無法用getpost(key)這種方式獲取參數了。

0x4 調試

要善於利用官網調試工具,我便在jwt加密上掉坑里了。
加密時使用的是HS256,而驗證時用的是HS512。

0x5 擴展

由於jwt載荷使用的是base64編碼,可以很容易被破解,所以不要放入敏感信息,也不建議放入過多的信息。
jwt里可以存過期時間,所以可以用來做時效性的應用,而且不需要使用數據庫。
另外也要避免jwt的重放攻擊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM