如何使用Swagger為.NET Core 3.0應(yīng)用添加JWT授權(quán)說明文檔

簡介

本教程采用WHY-WHAT-HOW黃金圈思維模式編寫基跑,黃金圈法則強(qiáng)調(diào)的是從WHY為什么學(xué)橡淆,到WHAT學(xué)到什么棋枕,再到HOW如何學(xué)。從模糊到清晰的學(xué)習(xí)模式逸爵。大家的時(shí)間都很寶貴幅疼,我們做事前先想清楚為什么要做,學(xué)完能達(dá)到什么樣的目標(biāo)堂飞,然后我們再考慮要達(dá)到這個(gè)目的灌旧,通過什么樣的方法來實(shí)現(xiàn)绑咱。

嘗試一些事,遭遇失敗后從中學(xué)習(xí)枢泰,比什么事都不做更好描融。—馬克.佐克伯

為什么要學(xué)衡蚂?

對于開發(fā)人員來說窿克,調(diào)試API接口和生成API文檔是一件極其頭疼的事情。我們在百忙之中讳窟,還不得不為前端開發(fā)人員編寫接口文檔让歼,來描述系統(tǒng)中N個(gè)接口的參數(shù)及返回狀態(tài),再借助PostMan等第三方工具來測試API的正確性丽啡。在Swagger誕生后谋右,這項(xiàng)體力活終于得到了極大的改善,我們不但可以自動構(gòu)建漂亮的交互式API說明文檔补箍,還可以直接調(diào)試API接口的正確性改执。最新版的Swagger已經(jīng)完美支持Open Api規(guī)范及JWT Token授權(quán)訪問等。

能學(xué)到什么坑雅?

  • 使用 Swagger 生成精美的API接口文檔
  • 使用 Swagger 調(diào)試JWT授權(quán)接口
  • 使用 Swagger 生成各個(gè)類庫中視圖模型的描述

怎么做辈挂?

Swagger項(xiàng)目開源地址:https://github.com/domaindrivendev/Swashbuckle.AspNetCore

創(chuàng)建一個(gè).NET Core項(xiàng)目

首先,新建一個(gè).NET Core 3.0 Web Api 項(xiàng)目裹粤,打開Nuget安裝管理器终蒂,勾選左下角的顯示預(yù)覽發(fā)行包,搜索Swashbuckle.AspNetCore遥诉,版本選擇5.0.0-rc4的點(diǎn)添加拇泣,注意因?yàn)?NET Core 3.0剛出不久,目前支持的庫很多都是預(yù)覽版矮锈,這里我選5.0.0-beta是會報(bào)錯(cuò)霉翔,選5.0.0-rc4使用正常。

創(chuàng)建項(xiàng)目
創(chuàng)建項(xiàng)目
創(chuàng)建項(xiàng)目
創(chuàng)建項(xiàng)目

設(shè)置生成XML描述信息

耐心等待幾秒鐘添加完成后苞笨,我們選中左側(cè)剛才創(chuàng)建的Api項(xiàng)目债朵,右鍵>屬性(Mac里叫選項(xiàng)),勾選生成XML文檔瀑凝,這個(gè)是用來生成為Swagger所用的描述信息序芦。

創(chuàng)建項(xiàng)目

開始配置Swagger

然后我們打開Startup.cs文件,來對Swagger配置進(jìn)行一些必要的配置粤咪,在ConfigureServices方法我們添加一下Swagger配置:

services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo
    {
        Version = "v1",
        Title = "Crypto Exchange",
        Description = "基于.NET Core 3.0 的區(qū)塊鏈數(shù)字貨幣交易所",
        Contact = new OpenApiContact 
        {
            Name = "Microfisher",
            Email = "276679490@qq.com",
            Url = new Uri("http://cnblogs.com/microfisher"),
        },
    });

    // 加載程序集的xml描述文檔
    var baseDirectory = System.AppDomain.CurrentDomain.BaseDirectory;
    var xmlFile = System.AppDomain.CurrentDomain.FriendlyName+ ".xml";
    var xmlPath = Path.Combine(baseDirectory, xmlFile);
    c.IncludeXmlComments(xmlPath);
})

參數(shù)都很簡單谚中,就是Swagger界面上顯示的一些信息,注意這里一定要習(xí)慣使用Path.Combine來拼接路徑,很多同學(xué)喜歡雙斜杠來拼接藏杖,在Mac和Linux下是會出問題的将塑,既然已經(jīng)擁抱開源技術(shù),盡量使用Mac或Linux來開發(fā).NET Core吧蝌麸。然后我們在Configure方法里添加以下代碼:

app.UseSwagger();
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "Crypto Exchange");
    // 訪問Swagger的路由后綴
    c.RoutePrefix = "swagger";
});

預(yù)覽一下小成果

到這里為止点寥,我們的Swagger的最基本的配置就完成了,其中RoutePrefix是訪問Swagger的路由来吩,如果設(shè)置為空則不需要輸入/swagger后綴來訪問「冶纾現(xiàn)在我們F5啟動項(xiàng)目看看,我的本地網(wǎng)址是https://localhost:5000弟疆,所以直接訪問:https://localhost:5000/swagger如下圖所示戚长,我去這界面也太丑了,說好的精美絕倫呢怠苔?不急不急同廉,我們慢慢調(diào)優(yōu):

創(chuàng)建項(xiàng)目

啟用API文檔的JWT授權(quán)

目前很多網(wǎng)站都使用了JWT(JSON WEB TOKEN)來作為賬戶系統(tǒng)的認(rèn)證授權(quán),JWT以它的簡單柑司、高效迫肖、分布式優(yōu)勢很快成為了網(wǎng)站的流行驗(yàn)證方式。這里我們不做過多的介紹攒驰,如果大家感興趣我可以再寫一篇長文來介紹JWT的優(yōu)勢和使用方法蟆湖。我們繼續(xù)來為Swagger添加JWT授權(quán)認(rèn)證,依舊打開Startup.cs文件玻粪,修改上面ConfigureServices方法中的代碼:

services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo
    {
        Version = "v1",
        Title = "Crypto Exchange",
        Description = "基于.NET Core 3.0 的區(qū)塊鏈數(shù)字貨幣交易所",
        Contact = new OpenApiContact
        {
            Name = "Microfisher",
            Email = "276679490@qq.com",
            Url = new Uri("http://cnblogs.com/microfisher"),
        },
    });

    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
    {
        Description = "在下框中輸入請求頭中需要添加Jwt授權(quán)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[] { }
        }
    });

    var baseDirectory = System.AppDomain.CurrentDomain.BaseDirectory;
    var xmlFile = System.AppDomain.CurrentDomain.FriendlyName + ".xml";
    var xmlPath = Path.Combine(baseDirectory, xmlFile);
    c.IncludeXmlComments(xmlPath);
});

預(yù)覽一下授權(quán)設(shè)置

然后再啟動項(xiàng)目隅津,你會發(fā)現(xiàn)右側(cè)多了一個(gè)Authorize綠色的帶鎖按鈕,這個(gè)按鈕點(diǎn)開后就可以設(shè)置我們的JWT Token信息了劲室,格式是:Bearer 你的Token字符串伦仍,注意Bearer于Token之間有個(gè)空格。設(shè)置好Token后痹籍,你請求任意的API接口時(shí)呢铆,Swagger會自動附帶Token到請求的Header中晦鞋。

創(chuàng)建項(xiàng)目
創(chuàng)建項(xiàng)目

創(chuàng)建一個(gè)RESTFUL接口

上面我們已經(jīng)實(shí)現(xiàn)了Swagger的各項(xiàng)配置蹲缠,現(xiàn)在我們來刪除默認(rèn)生成的控制器WeatherForecastController及視圖模型WeatherForecast,新建一個(gè)AccountController及幾個(gè)視圖模型悠垛,讓Swagger返回帶描述的接口文檔线定。

//[Authorize]
[Produces("application/json")]
[Route("v1/[controller]")]
[ApiController]
public class AccountController : ControllerBase
{
    /// <summary>
    /// 創(chuàng)建信息
    /// </summary>
    /// <param name="createViewModel">參數(shù)</param>
    /// <returns>狀態(tài)</returns>
    [HttpPost]
    public StatusViewModel Post([FromBody]CreateViewModel createViewModel)
    {
        return new StatusViewModel { };
    }

    /// <summary>
    /// 刪除信息
    /// </summary>
    /// <param name="deleteViewModel">參數(shù)</param>
    /// <returns></returns>
    [HttpDelete]
    public StatusViewModel Delete([FromQuery]DeleteViewModel deleteViewModel)
    {
        return new StatusViewModel { };
    }

    /// <summary>
    /// 查詢信息
    /// </summary>
    /// <param name="queryViewModel">參數(shù)</param>
    /// <returns></returns>
    [HttpGet]
    public StatusViewModel Get([FromQuery]QueryViewModel queryViewModel)
    {
        return new StatusViewModel { };
    }

    /// <summary>
    /// 修改信息
    /// </summary>
    /// <param name="updateViewModel">參數(shù)</param>
    /// <returns></returns>
    [HttpPut]
    public StatusViewModel Put([FromQuery]UpdateViewModel updateViewModel)
    {
        return new StatusViewModel { };
    }
}

創(chuàng)建幾個(gè)視圖模型

再按自己喜歡的風(fēng)格新建幾個(gè)視圖模型,用///為各個(gè)字段添加summary后如下:

public class UpdateViewModel
{
    /// <summary>
    /// ID
    /// </summary>
    public long Id { get; set; }

    /// <summary>
    /// 賬號
    /// </summary>
    public long Account { get; set; }

    /// <summary>
    /// 密碼
    /// </summary>
    public long Password { get; set; }
}

測試最終成果

最后我們來看看效果确买,隨便展開一個(gè)API接口斤讥,可以看到我們給視圖模型寫的注釋已經(jīng)顯示在Swagger上了,前端開發(fā)人員一看就懂,輸入一些接口參數(shù)芭商,點(diǎn)一下執(zhí)行就能看到返回值了:

創(chuàng)建項(xiàng)目

再看我們的請求Header中已經(jīng)包含了JWT授權(quán)信息(Bearer 123456789)是我隨意設(shè)置的派草,讓你們前端調(diào)試的時(shí)候換成你們的Token就行了。

創(chuàng)建項(xiàng)目

項(xiàng)目代碼铛楣,喜歡請加個(gè)星

https://github.com/microfisher/Tutorials

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末近迁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子簸州,更是在濱河造成了極大的恐慌鉴竭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岸浑,死亡現(xiàn)場離奇詭異搏存,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)矢洲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門璧眠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人读虏,你說我怎么就攤上這事蛆橡。” “怎么了掘譬?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵泰演,是天一觀的道長。 經(jīng)常有香客問我葱轩,道長睦焕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任靴拱,我火速辦了婚禮垃喊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘袜炕。我一直安慰自己本谜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布偎窘。 她就那樣靜靜地躺著乌助,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陌知。 梳的紋絲不亂的頭發(fā)上他托,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音仆葡,去河邊找鬼赏参。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的把篓。 我是一名探鬼主播纫溃,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼韧掩!你這毒婦竟也來了皇耗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤揍很,失蹤者是張志新(化名)和其女友劉穎郎楼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窒悔,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呜袁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了简珠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阶界。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖聋庵,靈堂內(nèi)的尸體忽然破棺而出膘融,到底是詐尸還是另有隱情,我是刑警寧澤祭玉,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布氧映,位于F島的核電站,受9級特大地震影響脱货,放射性物質(zhì)發(fā)生泄漏岛都。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一振峻、第九天 我趴在偏房一處隱蔽的房頂上張望臼疫。 院中可真熱鬧,春花似錦扣孟、人聲如沸烫堤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸽斟。三九已至,卻和暖如春料仗,著一層夾襖步出監(jiān)牢的瞬間湾盗,已是汗流浹背伏蚊。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工立轧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓氛改,卻偏偏與公主長得像帐萎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子胜卤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容