strapi jwt的使用

strapi jwt的使用

strapi目前我安装的版本是3.1.6

Nodejs版本12.18.4

测试工具apipost

加入jwt验证文件后无法登陆,老版本3.0.0 beta 尝试一次升级,失败了。后续我还要再尝试一次升级。

1.环境

CENTOS7+宝塔

安装完毕后,直接安装pm2

2.安装strapi(想扩容 要收费的,美元299刀)

yarn create strapi-app my-project --quickstart

npx create-strapi-app my-project --quickstart

这样安装完会自动启动,在控制台里可以看有没有问题,如果想启动调试,可以用(控制台关闭会停止服务):

Npm start

(要在项目根目录下执行)

想要持续性管理要用命令:

Pm2 start npm --start

3.安装JWT验证逻辑文件

新建文件夹:

/home/my-test/extensions/users-permissions/config/policies(就最后一个有用,前面都有)

新建逻辑文件

permissions.js

文件内容:

--------------------------------------------------------------------------------------------------------------------------

const _ = require('lodash');

module.exports = async (ctx, next) => {

    let role;

    if (ctx.state.user) {

        // request is already authenticated in a different way

        return next();

    }

    if (ctx.request && ctx.request.header && ctx.request.header.authorization) {

        try {

            const { id } = await strapi.plugins['users-permissions'].services.jwt.getToken(ctx);

            if (id === undefined) {

                throw new Error('Invalid token: Token did not contain required fields');

            }

            // fetch authenticated user

            ctx.state.user = await strapi.plugins['users-permissions'].services.user.fetchAuthenticatedUser(id);

        } catch (err) {

            return handleErrors(ctx, err, 'unauthorized');

        }

        if (!ctx.state.user) {

            return handleErrors(ctx, 'User Not Found', 'unauthorized');

        }

        role = ctx.state.user.role;

        if (role.type === 'root') {

            return await next();

        }

        const store = await strapi.store({

            environment: '',

            type: 'plugin',

            name: 'users-permissions',

        });

        if (_.get(await store.get({ key: 'advanced' }), 'email_confirmation') &&  !ctx.state.user.confirmed) {

            return handleErrors(ctx, 'Your account email is not confirmed.', 'unauthorized');

        }

        if (ctx.state.user.blocked) {

            return handleErrors(ctx,'Your account has been blocked by the administrator.','unauthorized');

        }

    }

    // Retrieve `public` role.

    if (!role) {

        role = await strapi.query('role', 'users-permissions').findOne({ type: 'public' }, []);

    }

    const route = ctx.request.route;

    const permission = await strapi.query('permission', 'users-permissions').findOne({

        role: role.id,

        type: route.plugin || 'application',

        controller: route.controller,

        action: route.action,

        enabled: true,

    },[]);



    if (!permission) {

        return handleErrors(ctx, undefined, 'forbidden');

    }



    // Execute the policies.

    if (permission.policy) {

        return await strapi.plugins['users-permissions'].config.policies[permission.policy](ctx, next);

    }



    // Execute the action.

    await next();

    };



const handleErrors = (ctx, err = undefined, type) => {throw strapi.errors[type](err);};

--------------------------------------------------------------------------------------------------------------------------

4.重启服务(不多说了)

5.开始设置权限

登录后台→Users→新建个用户(username和password验证用)

6.设置接口访问权限

登录后台→Settings→身份→Public(扩容要钱)进去找到要控制的表API,比如find,选中后右边选择(限制此操作下的)isauthenticated,保存退出,后台设置就完成了,准备测试

7.测试,获得JWT令牌(一般情况都是前端按照KEY生成的,STRAPI是服务器生成的)

打开APIPOST软件,获取地址:

http://10.3.6.98:1337/auth/local

请求BODY选择APPLICATION/JSON:

{

"identifier": "test",

"password": "test"

}

发送请求,返回:

{

"jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNjAxMDIyNjc0LCJleHAiOjE2MDM2MTQ2NzR9.IAdHvzWOaNFuXmWVM8Ib-eriMUi04l0Kr6pHlx0ZCvQ",

"user": {

"id": 1,

"provider": "local",

"confirmed": false,

"blocked": false,

.........................一些信息

"created_at": "2020-09-25T08:05:49.363Z",

"updated_at": "2020-09-25T08:27:06.504Z"

}

}

8.用返回的JWT再请求接口就可以了

打开APIPOST,输入地址:

http://10.3.6.98:1337/tests

选择认证 Bearer auth认证(不需要写“Bearer ”),或自己填写头

Authorization

填写参数(“Bearer ”一定要写,并且有个空格,后面带上TOKEN)

Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJ5YXlhIiwiaWF0IjoxNjAwOTMwNTIwLCJpc3MiOiJ5YXlhIiwic3ViIjoieWF5YSIsImV4cCI6MTYwMDk2NjUyMH0.lj5bxUBoCiAmC4hDrj15vtW0qlKXzdDAZiF9U6cCyCc

这个时候发送请求,就会成功了。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Gin框架中使用JWT(JSON Web Token)可以实现份验证和授权功能。JWT是一种用于在网络应用间传递信息的安全方法,它由三部分组成:header、payload和signature[^1]。 下面是在Gin框架中使用JWT的示例代码[^2]: 1. 导入所需的包: ```go import ( "github.com/gin-gonic/gin" "github.com/dgrijalva/jwt-go" ) ``` 2. 定义JWT的密钥: ```go var jwtKey = []byte("your_secret_key") ``` 3. 创建一个JWT的Claims结构体,用于存储用户的信息: ```go type Claims struct { Username string `json:"username"` jwt.StandardClaims } ``` 4. 创建一个处理登录请求的路由: ```go func login(c *gin.Context) { var loginData LoginData if err := c.ShouldBindJSON(&loginData); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"}) return } // 验证用户名和密码 if loginData.Username == "admin" && loginData.Password == "password" { // 创建JWT的Claims claims := &Claims{ Username: loginData.Username, StandardClaims: jwt.StandardClaims{ ExpiresAt: time.Now().Add(time.Hour * 24).Unix(), // 设置过期时间 }, } // 创建JWT token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) tokenString, err := token.SignedString(jwtKey) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to generate token"}) return } // 返回JWT给客户端 c.JSON(http.StatusOK, gin.H{"token": tokenString}) } else { c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid credentials"}) } } ``` 5. 创建一个需要身份验证的路由: ```go func protectedRoute(c *gin.Context) { // 从请求头中获取JWT authHeader := c.GetHeader("Authorization") if authHeader == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "Missing authorization header"}) return } // 解析JWT tokenString := authHeader[7:] // 去除Bearer前缀 claims := &Claims{} token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) { return jwtKey, nil }) if err != nil { if err == jwt.ErrSignatureInvalid { c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token signature"}) return } c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid token"}) return } if !token.Valid { c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token"}) return } // 验证通过,继续处理请求 c.JSON(http.StatusOK, gin.H{"message": "Protected route"}) } ``` 6. 在路由中注册处理函数: ```go func main() { r := gin.Default() r.POST("/login", login) r.GET("/protected", protectedRoute) r.Run(":8080") } ``` 以上代码演示了在Gin框架中使用JWT进行身份验证和授权的基本流程。用户可以通过发送登录请求获取JWT,然后在需要身份验证的路由中将JWT放入请求头中进行验证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

My的梦想已实现

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值