1 開始 , 首先這里要感謝以下兩位大佬的資料。
- 1.1
百小僧
Furion開源框架提供的技術支持。 https://gitee.com/monksoul/Furion, 有興趣的同學可以start. - 1.2
QiXiao_柒小(東)
的文章 https://www.cnblogs.com/7tiny/archive/2019/06/13/11012035.html 有興趣的同學可以評論。 - 1.3 項目地址:https://gitee.com/zero530/fur-jwtdemo
2 創建項目,利用Furion 腳手架,輕松創建項目
- 2.1 文檔參考
- 2.2 創建成功
3 打開項目,run起來,可以看到swagger已經啟動了
4 右鍵Controller文件夾,添加Controller - ValuesController
- 4.1 代碼, 請留意要繼承
ControllerBase
public class ValuesController : ControllerBase
{
[Route("api/value1")]
public string Value1()
{
return "this is value1";
}
[Route("api/value2")]
public string Value2()
{
return "this is value 2 with auth!";
}
}
- 4.2 運行結果
5 我們做點手腳,加個權限進去,再訪問,發現權限已經啟用, 方法value2()
已經報錯
- 5.1 代碼
[Authorize]
[Route("api/value2")]
public string Value2()
{
return "this is value 2 with auth!";
}
- 5.2 結果 , 打開神一樣的Fiddle,發現value1()是200, value2()是401(UnAuthorized)
- value1
- value2
6 我們新建一個授權方法,開始手擼代碼
- 6.1 創建AuthController
- 6.2 將下面的代碼填入方法, 我這里不做過多的原理解釋,也不重復造輪子了, 網上有太多的資料。
假設有賬號和密碼的參數就給於授權
當前真實環境中不可能如此。
[AllowAnonymous]
[Route("api/auth")]
[HttpGet]
public string Auth(string userName, string pwd)
{
string output = string.Empty;
if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(pwd))
{
// 生成 token
var jwtSettings = App.GetOptions<JWTSettingsOptions>();
var datetimeOffset = new DateTimeOffset(DateTime.Now);
if (jwtSettings.ExpiredTime != null)
output = JWTEncryption.Encrypt(jwtSettings.IssuerSigningKey,
new Dictionary<string, object>()
{
{"UserId", userName}, // 存儲Id
//{"IsAdmin", true}, // 管理員登錄
{JwtRegisteredClaimNames.Iat, datetimeOffset.ToUnixTimeSeconds()},
{JwtRegisteredClaimNames.Nbf, datetimeOffset.ToUnixTimeSeconds()},
{
JwtRegisteredClaimNames.Exp,
new DateTimeOffset(
DateTime.Now.AddSeconds(
jwtSettings.ExpiredTime.Value * 60 * 60 * 24 * 30))
.ToUnixTimeSeconds()
},
{JwtRegisteredClaimNames.Iss, jwtSettings.ValidIssuer},
{JwtRegisteredClaimNames.Aud, jwtSettings.ValidAudience}
});
//// 設置 Swagger 刷新自動授權
//if (_httpContextAccessor.HttpContext != null)
// _httpContextAccessor.HttpContext.Response.Headers["access-token"] = output.AccessToken;
}
return output;
}
-
6.3 查看結果 ,fiddle查看,雙擊左邊的url, 就會得到生成好的token
-
生成
-
雙擊查看token
-
7 我們手動將token放到請求的header,模擬客戶端的請求
-
7.1 復制那段生成好的token, 可以切換到textview中, 請注意在token前面加上
Authorization: Bearer
User-Agent: Fiddler
Host: localhost:44342
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiJjYWkiLCJpYXQiOjE2MDgwNDY3MjQsIm5iZiI6MTYwODA0NjcyNCwiZXhwIjoxNjU5ODg2NzI0LCJpc3MiOiJkb3RuZXRjaGluYSIsImF1ZCI6InBvd2VyYnkgRnVyaW9uIn0.xNxexPeDUniDCnBwrIjbV62ZFnVdma91Ut7rtx4-t7Q
-
7.2 結果如下圖
-
雙擊
-
8 延伸, 當超時后如何刷新token? 還有如何強制token失效? 我們下一章繼續。