使用者驗證與授權 - Token Based Authentication:驗證 JSON Web Token

昨天我們學會了在 ASP.NET Core Web API 發行 JSON Web Token 並且使用 https://jwt.io 網站所提供的測試工具驗證所發行的 JSON Web Token 的內容確實有照我們的意思發行,今天再來學習,當《前端》拿著 JSON Web Token 回來請求任何需要授權要求的 API 服務時,如何驗證該 Token 是否有效。

審核 JSON Web Token

首先,在 Web API 專案的 Startup.cs 的 Configure() 方法中加入我們想怎麼驗證由《前端》送過來的 Token 的設定,程式碼如下所示:

public void Configure(IApplicationBuilder app,
    IHostingEnvironment env,
    ILoggerFactory loggerFactory,
    DemaeDbInitializer seeder)
{
    // 省略
    app.UseJwtBearerAuthentication(new JwtBearerOptions()
    {
        AutomaticAuthenticate = true,
        AutomaticChallenge = true,
        TokenValidationParameters = new TokenValidationParameters()
        {
            ValidIssuer = Configuration["Tokens:Issuer"],
            ValidAudience = Configuration["Tokens:Audience"],
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"])),
            ValidateLifetime = true
        }
    });
    // 省略
}

上述程式碼比較值的留意的是 TokenValidationParameters 所包含的參數,可藉由檢查幾個回傳回來的參數是否與當初發行時所給的參數值相符,且也檢查當初簽名的 Key 是否一致,以確認該 Token 的真偽,最後也檢查是否過期。這些審核機制可自行組合,往後有機會再深入討論。

成果測試

首先測試刻意不夾帶 JSON Web Token 下達請求,果然如預期的回傳 401 未授權的狀態碼: 

接著在 Headers 夾帶先前所產生的 JWT 即可正確查詢,請留意在 JWT 字串前要加上 bearer 空格後才貼上(讀者要一字一字地敲,阿源哥哥也不反對啦)所產生的 JWT 字串。

看來已經成功實作完成,所以今天就暫時學到這裡,下星期一再來學習如何由 Xamarin.Forms 使用 JSON Web Token 登入存取受保護的資料。