JWT跨域认证

新建shop项目

新建bean包,再其包下新建User

 

package com.example.shop.bean;

public class User {
    private String username;
    private String password;
    // 可以根据需要添加其他字段,比如角色、邮箱等

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    // 可以根据需要添加其他的 getter 和 setter 方法

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

新建utils包,再其包下新建JwtUtils,Result和ResultCode

 ResultCode代码如下

package com.example.shop.utils;

public interface ResultCode {
    public static Integer SUCCESS= 20000;//成功
    public static Integer ERROR=20001;//失败
}

Result代码如下

package com.example.shop.utils;

import java.util.HashMap;
import java.util.Map;

public class Result {
    private Boolean success;
    private Integer code;
    private String message;
    private Map<String, Object> data = new HashMap<>();

    // 私有构造方法
    private Result() {}

    // 成功静态方法
    public static Result ok() {
        Result r = new Result();
        r.setSuccess(true);
        r.setCode(ResultCode.SUCCESS);
        r.setMessage("成功");
        return r;
    }

    // 失败静态方法
    public static Result error() {
        Result r = new Result();
        r.setSuccess(false);
        r.setCode(ResultCode.ERROR);
        r.setMessage("失败");
        return r;
    }

    public Boolean getSuccess() {
        return success;
    }

    public void setSuccess(Boolean success) {
        this.success = success;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Map<String, Object> getData() {
        return data;
    }

    public void setData(Map<String, Object> data) {
        this.data = data;
    }

    public Result success(Boolean success) {
        this.setSuccess(success);
        return this;
    }

    public Result message(String message) {
        this.setMessage(message);
        return this;
    }

    public Result code(Integer code) {
        this.setCode(code);
        return this;
    }

    public Result data(String key, Object value) {
        this.data.put(key, value);
        return this;
    }

    public Result data(Map<String, Object> map) {
        this.setData(map);
        return this;
    }
}

 JwtUtils代码如下

package com.example.shop.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class JwtUtils {
    // 7天过期,单位秒
    private static final long expire = 604800;
    // 32位秘钥
    private static final String secret = "abcdfghiabcdfghiabcdfghiabcdfghi";

    // 生成token
    public static String generateToken(String username) {
        Date now = new Date();
        Date expiration = new Date(now.getTime() + 1000 * expire);
        return Jwts.builder()
                .setHeaderParam("typ", "JWT") // 设置头部信息
                .setSubject(username) // 设置主题
                .setIssuedAt(now) // 设置签发时间
                .setExpiration(expiration) // 设置过期时间
                .signWith(SignatureAlgorithm.HS512, secret) // 设置签名使用的算法和秘钥
                .compact(); // 生成token
    }

    // 解析token,获取Claims
    public static Claims getClaimsByToken(String token){
        return Jwts.parser()
                .setSigningKey(secret) // 设置秘钥
                .parseClaimsJws(token) // 解析token
                .getBody(); // 获取token中的payload部分
    }
}

 新建controller包,,在其下新建UserController

 UserController代码如下

package com.example.shop.controller;

import org.springframework.web.bind.annotation.*;
import com.example.shop.utils.Result;
import com.example.shop.utils.JwtUtils;
import com.example.shop.bean.User;

@RestController
@RequestMapping("/user")
@CrossOrigin
public class UserController {

    @PostMapping("/login")
    public Result login(@RequestBody User user) {
        String token = JwtUtils.generateToken(user.getUsername());
        return Result.ok().data("token", token);
    }

    @GetMapping("/info")
    public Result info(@RequestParam String token) {
        String username = JwtUtils.getClaimsByToken(token).getSubject();
        String url = "https://img2.baidu.com/it/u=1325995315,4158780794&fm=26&fmt=auto&gp=0.ipg";
        return Result.ok().data("name", username).data("avatar", url);
    }

    @PostMapping("/logout")
    public Result logout() {
        return Result.ok();
    }
}

添加依赖

 

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

 运行localhost/user/login

输入和结果如下

 

 

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.net中使用JWT(JSON Web Token)实现认证是一种常见的做法。是指前端应用程序在一个上发送请求,但请求的目标资源位于另一个上,由于浏览器的同源策略,默认情况下是不允许请求的。 在ASP.NET中,可以通过配置CORS策略以允许请求。首先,在Web.config或应用程序的Startup.cs文件中添加CORS中间件,并允许特定的来源或Http请求方法: ```csharp // Startup.cs public void ConfigureServices(IServiceCollection services) { services.AddCors(options => { options.AddPolicy("AllowCorsPolicy", builder => builder .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader()); }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseCors("AllowCorsPolicy"); //其他中间件配置 } ``` 然后,在控制器或API端点中,通过`Authorize`属性进行JWT认证: ```csharp // Controller.cs [Authorize] [ApiController] [Route("api/[controller]")] public class MyController : ControllerBase { // ... } ``` 这将确保只有带有有效JWT的请求才能访问该控制器的API。 此外,在生成JWT时,需要将适当的CORS头信息包含在令牌中: ```csharp // JwtGenerator.cs public string GenerateJwtToken() { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes("your_secret_key"); var tokenDescriptor = new SecurityTokenDescriptor { // 设置其他Jwt相关参数 Subject = new ClaimsIdentity(new Claim[] { new Claim(ClaimTypes.Name, "your_name") }), // 设置CORS Header = new JwtHeader(new SigningCredentials( new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256)) { {"Access-Control-Allow-Origin", "your_origin_domain"} } }; var token = tokenHandler.CreateToken(tokenDescriptor); return tokenHandler.WriteToken(token); } ``` 通过在生成JWT时设置`Access-Control-Allow-Origin`头,将允许指定的进行请求。 总结而言,使用.net中的JWT和CORS,可以实现安全的认证。配置CORS策略以允许特定的请求,并在生成JWT时设置适当的CORS头信息,以确保只有带有有效JWT的请求才能访问受保护的API。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值