首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我应该把JWT逻辑放在web api中的什么地方?

我应该把JWT逻辑放在web api中的什么地方?
EN

Stack Overflow用户
提问于 2019-06-05 00:38:01
回答 1查看 107关注 0票数 0

所以我有一个api,可以使用JWT创建、登录等等。现在我的Login类太广泛了,对我喜欢的东西有太多的责任。这就是了;

代码语言:javascript
运行
AI代码解释
复制
    [HttpPost("login")]
    public async Task<IActionResult> Login(UserForLoginDto user)
    {
        var userFromRepo = await _qrepo.Login(user.Username, user.Password);
        //IF no user found in db
        if (userFromRepo == null)
            //Return unauth so if user have wrong login creds, we're not specifying if it's password or username
            return Unauthorized();

        //Token creation
        var claims = new[]
        {
            new Claim(ClaimTypes.NameIdentifier, userFromRepo.Id.ToString()),
            new Claim(ClaimTypes.Name, userFromRepo.Username)
        };

        // Hashed token Key
        // The token is unique and very secret - if you have the token you are able to create tokens that are verifyable for our backend
        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config.GetSection("AppSettings:Token").Value));

        // Signing credentials 
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha512Signature);

        // Security Token DEscripter
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            // our claims
            Subject = new ClaimsIdentity(claims),
            // Expiry date - 1 day from create
            Expires = DateTime.Now.AddDays(1),
            SigningCredentials = creds
        };

        // Token handler
        var tokenHandler = new JwtSecurityTokenHandler();

        // Actual token
        var token = tokenHandler.CreateToken(tokenDescriptor);

        // Return actual token
        return Ok(new
        {
            token = tokenHandler.WriteToken(token)
        });
    }

我希望我的令牌创建从我的控制器方法中分离出来,但我不完全确定什么是最好的方法,那么这应该属于哪里呢?这是我的文件夹结构:

我觉得它不属于我的任何一个文件夹,但可能在helpers中,idk?这方面的标准方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-05 00:59:19

你能把所有令牌生成的东西放在一个单独的服务类中吗?然后使用DI注入服务。还可以给它一个接口,这样你就可以更容易地测试它:

代码语言:javascript
运行
AI代码解释
复制
public interface IJwtTokenGenerator
{
    string GenerateToken(User user);
}

public class JwtTokenGenerator : IJwtTokenGenerator
{
    private readonly IConfiguration _config;

    public JwtTokenGenerator(IConfiguration config)
    {
        _config = config;
    }

    //obviously, change User to whatever your user class name is
    public string GenerateToken(User user)
    {
        //Token creation
        var claims = new[]
        {
            new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
            new Claim(ClaimTypes.Name, user.Username)
        };

        // Hashed token Key
        // The token is unique and very secret - if you have the token you are able to create tokens that are verifyable for our backend
        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config.GetSection("AppSettings:Token").Value));

        // Signing credentials 
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha512Signature);

        // Security Token DEscripter
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            // our claims
            Subject = new ClaimsIdentity(claims),
            // Expiry date - 1 day from create
            Expires = DateTime.Now.AddDays(1),
            SigningCredentials = creds
        };

        // Token handler
        var tokenHandler = new JwtSecurityTokenHandler();

        // Actual token
        var securityToken = tokenHandler.CreateToken(tokenDescriptor);

        return tokenHandler.WriteToken(securityToken);
    }
}

则您的登录操作可能如下所示:

代码语言:javascript
运行
AI代码解释
复制
[HttpPost("login")]
public async Task<IActionResult> Login(UserForLoginDto user)
{
    var userFromRepo = await _qrepo.Login(user.Username, user.Password);
    //IF no user found in db
    if (userFromRepo == null)
        //Return unauth so if user have wrong login creds, we're not specifying if it's password or username
        return Unauthorized();

    //Injected ITokenGenerator (note the interface)
    var token = _tokenGenerator.GenerateToken(userFromRepo);

    // Return actual token
    return Ok(new
    {
        token
    });
}

至于放置这个类和接口的文件夹(应该是两个单独的文件),这主要取决于什么对您或您的团队有意义。也许另一个文件夹叫做"Services",也许是"Authentication",也许是"Authentication/Services“。“Helper”通常用于静态类,但我想您可以将其放入其中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56452919

复制
相关文章
POSTGIS 总结
PostGIS是一个空间数据库,空间数据库像存储和操作数据库中其他任何对象一样去存储和操作空间对象。
小石头
2022/11/10
6.3K0
POSTGIS 总结
sqlserver查询数据库中有多少个表
 SELECT * FROM sysobjects WHERE (xtype = 'U')
jamesjiang
2022/11/20
1.1K0
一篇文章带你玩转PostGIS空间数据库
人类理解世界其实是按照三维的角度,而传统的关系型数据库是二维的,要想描述空间地理位置,点、线、面,我们就需要一个三维数据库,即所谓空间数据库。
半旧518
2023/10/17
8.2K0
一篇文章带你玩转PostGIS空间数据库
统计一行字符中有多少个单词
#include <stdio.h> //只能是单词之间一个空格 int words(char string[]) { int result = 0, i = 0; while(string[i] != 0) { if(string[i++] == ' ') { result++; } } if(string[0] != 0) result++; return result; } //更加好 int words_2(char str[]) { int i = 0
用户4645519
2020/09/07
5380
PostGIS特性
比如,Union操作符融合多边形之间的边界。两个交迭的多边形通过Union运算就会形成一个新的多边形,这个新的多边形的边界为两个多边形中最大边界。
cn華少
2018/09/11
1.7K0
365. 二进制中有多少个1
思路一:遍历每一位,如果是1,计数器加1即可,也是最容易想到的,需要遍历一次,可以用不断除2来做,也可以用位操作,后者更简单些:
和蔼的zhxing
2018/09/04
5320
LintCode 二进制中有多少个1题目分析
这种方法速度比较快,其运算次数与输入n的大小无关,只与n中1的个数有关。如果n的二进制表示中有k个1,那么这个方法只需要循环k次即可。其原理是不断清除n的二进制表示中最右边的1,同时累加计数器,直至n为0 为什么n &= (n – 1)能清除最右边的1呢?因为从二进制的角度讲,n相当于在n - 1的最低位加上1。举个例子,8(1000)= 7(0111)+ 1(0001),所以8 & 7 = (1000)&(0111)= 0(0000),清除了8最右边的1(其实就是最高位的1,因为8的二进制中只有一个1)。再比如7(0111)= 6(0110)+ 1(0001),所以7 & 6 = (0111)&(0110)= 6(0110),清除了7的二进制表示中最右边的1(也就是最低位的1)
desperate633
2018/08/22
2140
PostGIS初探
PostGIS是PostgreSQL的空间扩展,他使得PostgreSQL支持空间数据类型,比如点、线段、折线段、多边形、椭圆等等,并且能够使用高效的空间索引进行存储和查找。
mythsman
2022/11/14
1.1K0
LintCode-365.二进制中有多少个1
给定 32 (100000),返回 1 给定 5 (101),返回 2 给定 1023 (111111111),返回 9
悠扬前奏
2019/05/31
3880
计算几何之判断线段相交
两条线段都满足“另一条线段的两个端点分别位于当前线段的顺时针方向和逆时针方向”,那么这两条线段相交。
灯珑LoGin
2022/10/31
4890
PostGIS空间数据库简明教程
在本文中,我们将介绍 PostGIS 的一些基础知识及其功能,以及一些可用于简化解决方案或提高性能的提示和技巧。
用户1758543
2023/05/09
3.1K0
PostGIS空间数据库简明教程
【实战】如何通过PostGIS实现附近的人
|导言:PostGIS是业界功能最全面,能力最强大的空间地理数据库引擎。现实业务开发中,经常会遇到有附近的某某的需求,如何快速实现呢,PostGIS+PostgreSQL可以帮到你。
腾讯云数据库 TencentDB
2021/11/15
2.1K0
【实战】如何通过PostGIS实现附近的人
一个.java文件中有多少个类(不是内部类)?
归思君
2023/10/16
3330
一个.java文件中有多少个类(不是内部类)?
计算还可以输入多少个字
Demo html页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <ti
joshua317
2018/04/16
7460
计算几何之线段相交问题(平面扫描)
求n条线段的交点,可以用抽选配对的方式来遍历所有的情况,这样子时间复杂度为O(n2).
灯珑LoGin
2022/10/31
1K0
计算几何之线段相交问题(平面扫描)
HDU 1086 计算几何 判断线段相交
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6456    Accepted Submission(s): 3116
csxiaoyao
2019/02/18
5660
PostGIS 报错libcrypto[通俗易懂]
centOS7.4 postgresql版本12,小版本号会随官方更新;遇到问题的是12.5 postgis2.5
全栈程序员站长
2022/09/13
1.3K0
整数的二进制表示中有多少个1的问题
我在剑指offer上面看到这道题,看到这道题是用c++写的,但是我用java编写的时候遇到问题。
actionzhang
2022/11/30
2990
geotools实现两个shp的相交计算
在Armap工具箱‘分析工具->叠加分析’,不得不说,非常好用,本文给你讲讲如何在geotools中实现。
牛老师讲GIS
2018/10/23
2K0
geotools实现两个shp的相交计算
如何在Ubuntu 14.04上安装和配置PostGIS
PostGIS是PostgreSQL关系数据库的空间扩展。PostGIS允许您使用几何和地理数据类型存储空间数据,使用空间函数执行空间查询以确定区域,距离,长度和周长,并在数据上创建空间索引以加速空间查询。
灬半痴
2018/09/28
1.6K0

相似问题

位置固定div缩小时去远

10

缩放时固定div位置

10

固定div位置

13

Div位置固定

24

位置DIV,位置绝对高于DIV,位置固定

05
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文