作者:nora抹抹茶I | 来源:互联网 | 2023-06-30 15:38
什么是Swagger?什么是jwt? Swagger就是一个查看api接口的一个文档工具,方便使用测试,你可以理解为方法都被罗列出来,而且postman测试的输入方法url的过程也被解析了,省事。 jwt是一个认证授权的工具,json web token,它相较于传统session,COOKIE这种较麻烦承载认证的验证方式更方便。
怎么使用Swagger+jwt? 1.引用nuGet 包
Swashbuckle.AspNetCore -Swagger Swashbuckle.AspNetCore.Filters -Swagger Microsoft.AspNetCore.Authentication.JwtBearer --JWT
2.IOC容器注册此 俩个 服务
3.配置 中间件
4.jwt需要一个登录方法来实现token,从而达到认证效果
怎么注册服务和配置中间价? 内置的服务和中间件都是这样的
public void ConfigureServices ( IServiceCollection services ) { services. AddControllers ( ) ; }
public void Configure ( IApplicationBuilder app, IWebHostEnvironment env ) { if ( env. IsDevelopment ( ) ) { app. UseDeveloperExceptionPage ( ) ; } app. UseRouting ( ) ; app. UseEndpoints ( endpoints => { endpoints. MapControllers ( ) ; } ) ; }
你会发现比较简洁,在于都是封装好的,不会有复杂的代码,都是一句话Add… app… 所以一般来讲 配置服务和中间件都要封装一下 避免在看上去很多代码。
怎么封装? 1.首先建一个 Extension文件夹 为了统一管理好找 2.建立相应名称含义的类 此案例取名为 JwtSwaggerEx.cs 3.写相应处理代码 下方有代码段 (涉及AppSettings读取配置文件的代码)获取配置文件内容 4.startup类直接调用封装方法
第三步骤封装代码片段,共3个方法 AddSwaggerEx /AddJwtEx /UseSwaggerEx
public static class JwtSwaggerEx { public static IServiceCollection AddSwaggerEx ( this IServiceCollection services) { services. AddSwaggerGen ( c => { c. SwaggerDoc ( "v1" , new OpenApiInfo { Title = "方便测试API" , Version = "v1" } ) ; var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml" ; var xmlPath = Path. Combine ( AppContext. BaseDirectory, xmlFile) ; c. IncludeXmlComments ( xmlPath) ; c. AddSecurityDefinition ( "Bearer" , new OpenApiSecurityScheme ( ) { Description = "在下框中输入请求头中需要添加Jwt授权Token:Bearer Token" , Name = "Authorization" , In = ParameterLocation. Header, Type = SecuritySchemeType. ApiKey, BearerFormat = "JWT" , Scheme = "Bearer" } ) ; c. AddSecurityRequirement ( new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType. SecurityScheme, Id = "Bearer" } } , new string [ ] { } } } ) ; } ) ; return services; } public static IServiceCollection AddJwtEx ( this IServiceCollection services) { services. AddAuthentication ( JwtBearerDefaults. AuthenticationScheme) . AddJwtBearer ( options => { options. TokenValidationParameters = new TokenValidationParameters { ValidIssuer = AppSettings. JwtSetting. Issuer, ValidAudience = AppSettings. JwtSetting. Audience, IssuerSigningKey = new SymmetricSecurityKey ( Encoding. UTF8 . GetBytes ( AppSettings. JwtSetting. SecurityKey) ) , ValidateLifetime = true , ClockSkew = TimeSpan. Zero} ; } ) ; return services; } public static IApplicationBuilder UseSwaggerEx ( this IApplicationBuilder app) { app. UseSwagger ( ) ; app. UseSwaggerUI ( c => { c. SwaggerEndpoint ( "/swagger/v1/swagger.json" , "基础接口" ) ; } ) ; return app; } }
第4步在ConfigureServices 和 Configure 中 加入使用
services. AddSwaggerEx ( ) ; services. AddJwtEx ( ) ; app. UseSwaggerEx ( ) ;
这样swagger+jwt配置就完成了! 启动效果如下:
接下来如何 让jwt的认证 起到作用呢,需要写一个Login登录方法 让token生产
该方法的参数都是模拟的,实际的话可以通过数据库验证用户名密码
[ AllowAnonymous] [ HttpGet] public string Login ( string username, string password ) { var claims = new Claim [ ] { new Claim ( JwtRegisteredClaimNames. Jti, Guid. NewGuid ( ) . ToString ( ) ) , new Claim ( "id" , "ceshi" , ClaimValueTypes. Integer32) , new Claim ( "name" , "ceshi" ) , } ; var key = new SymmetricSecurityKey ( Encoding. UTF8 . GetBytes ( AppSettings. JwtSetting. SecurityKey) ) ; var creds = new SigningCredentials ( key, SecurityAlgorithms. HmacSha256) ; var token = new JwtSecurityToken ( issuer: AppSettings. JwtSetting. Issuer, audience: AppSettings. JwtSetting. Audience, signingCredentials: creds, claims: claims, notBefore: DateTime. Now, expires: DateTime. Now. AddSeconds ( AppSettings. JwtSetting. ExpireSeconds) ) ; string jwtToken = new JwtSecurityTokenHandler ( ) . WriteToken ( token) ; return jwtToken; }
然后开始使用jwt的功能 1:先用一下swagger 方便测试一下 Login方法 得到token的值 2.将token 输入到认证框中 3.这样就token生效了,然后测试别的 控制器中的方法 如果方法特性加了 [Authorize] 就会被去验证,如果你不去把Token给加上的话,就过不去会报401错误。 OK,这样的话就完成了 认证!
注意:1 如果要xml 注释的话 也就是方法中///中的注释显示到swagger上 项目 右键属性 -生成 把xml勾上 不然找不到 2 如果想启动项目就是swagger 就在launchSettings.json 中 设置"launchUrl": “swagger” 不然可能是index控制器