JWT授权 GOLANG模拟并发

2018/11/29
JWT授权 PHP颁发和验证 Golang请求测试

直接上代码吧

加密client php端


composer require lcobucci/jwt
密钥放在了header头部token字段

<?php
use \Lcobucci\JWT\Builder;
use \Lcobucci\JWT\Signer\Hmac\Sha256;

require 'vendor/autoload.php';

$builder = new Builder();
$signer  = new Sha256();

$secret = "suspn@)!*";

//设置header和payload,以下的字段都可以自定义
$builder->setIssuer("suspn.com") //发布者
        ->setAudience("suspn.com") //接收者
        ->setId("abc", true) //对当前token设置的标识
        ->setIssuedAt(time()) //token创建时间
        ->setExpiration(time() + 30) //过期时间
        ->setNotBefore(time() + 5) //当前时间在这个时间前,token不能使用
        ->set('uid', 30061); //自定义数据

//设置签名
$builder->sign($signer, $secret);
//获取加密后的token,转为字符串
$token = (string)$builder->getToken();
var_dump($token);

解析php server端

<?php
use \Lcobucci\JWT\Parser;
use \Lcobucci\JWT\Signer\Hmac\Sha256;

require 'vendor/autoload.php';

$signer  = new Sha256();

$secret = "suspn@)!*";
//获取token
$token = isset($_SERVER['HTTP_TOKEN']) ? $_SERVER['HTTP_TOKEN'] : '';

if (!$token) {
    invalidToken('Invalid token');
}

try {
    //解析token
    $parse = (new Parser())->parse($token);// 获取全部信息,返回一个数组,var_dump($parse->getClaims());// 获取单条信息var_dump($parse->getClaim('aud'));....

    //验证token合法性
    if (!$parse->verify($signer, $secret)) {
        invalidToken('Invalid token');
    }

    //验证是否已经过期
    if ($parse->isExpired()) {
        invalidToken('Already expired');
    }

    //获取数据
    $user = $parse->getClaim('uid');
    print_r($user);
    

} catch (Exception $e) {
    //var_dump($e->getMessage());
    invalidToken('Invalid token');
}

function invalidToken($msg) {
    header('HTTP/1.1 403 forbidden');
    exit($msg);
}

client golang端 授权测试端 方法很多 http请求就行啦,方便的就postman吧


package main

import (
	"fmt"
	"net/http"
	"time"
)

const token = "xxx"

var starttime = time.Now()

func main() {
	ch := make(chan bool)

	fmt.Println("开始时间为", starttime.Format("2006-01-02 15:04:05"))

	go func() {
		for {

			var client http.Client
			req, err := http.NewRequest("GET", "http://www.phptest.me/appserver/server.php", nil)
			if err != nil {
				panic(err)
			}
			req.Header.Set("token", token)
			res, err := client.Do(req)

			if err != nil {
				panic(err)
			}

			fmt.Println(res.StatusCode)
			if res.StatusCode == 403 {
				ch <- true
			}

			time.Sleep(time.Second * 1)
			starttime = starttime.Add(time.Second * 1)
		}
	}()

	fmt.Println(<-ch)
	fmt.Printf("<----------%s---------->\n", "JWT Server 服务授权失败")

	fmt.Println("授权结束时间为", starttime.Format("2006-01-02 15:04:05"))
}

个人随笔

安静的等待,你若盛开,蝴蝶自来

承接高质量 网站开发 app开发 如有需要请点击About联系

作者 @承鹏辉