摘要:去中心化應(yīng)用程序的常見(jiàn)設(shè)計(jì)不僅依賴于以太坊區(qū)塊鏈,還依賴于層。每個(gè)用戶的所有登錄操作在以太坊區(qū)塊鏈上變得不可公開。用于驗(yàn)證用戶身份的機(jī)制與以太坊用于保證以太坊區(qū)塊鏈安全性的機(jī)制相同。以太坊,主要是針對(duì)工程師使用進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。
去中心化應(yīng)用程序(DApp)的常見(jiàn)設(shè)計(jì)不僅依賴于以太坊區(qū)塊鏈,還依賴于API層。在這種情況下,DApp通過(guò)用戶的以太坊帳戶與智能合約進(jìn)行交互,并通過(guò)交換用戶憑據(jù)而發(fā)布的JWT token與API層進(jìn)行交互。
目標(biāo)是使用以太坊帳戶作為用戶憑據(jù)來(lái)請(qǐng)求JWT Token。
最簡(jiǎn)單的方法可能是請(qǐng)求用戶使用其他隨機(jī)生成的數(shù)據(jù)在以太坊上進(jìn)行交易,然后在發(fā)出JWT之前檢查交易和隨機(jī)數(shù)據(jù)。這種方法有幾個(gè)副作用:
1.用戶必須進(jìn)行交易并支付gas以進(jìn)行簡(jiǎn)單的身份驗(yàn)證。
2.用戶必須等待12-120秒(基于耗費(fèi)的gas)才能完成身份驗(yàn)證過(guò)程。
3.每個(gè)用戶的所有登錄操作在以太坊區(qū)塊鏈上變得不可公開。
這種方式不實(shí)用,并且有一些用戶體驗(yàn)限制,我們需要一種方法讓用戶證明他擁有與他想要用來(lái)登錄的帳戶相關(guān)的私鑰,而不是只(當(dāng)然)要求私鑰,而不管他是否進(jìn)行交易。
解決方案Metamask團(tuán)隊(duì)成員Dan Finlay的這篇文章向我啟發(fā)了本教程?;旧?,你的DApp可以提示用戶使用他的私鑰對(duì)短信進(jìn)行簽名。此簽名操作不會(huì)生成交易,并且它由Metamask附加組件透明地處理(順便說(shuō)一句,你的帳戶需要解鎖)。簽名后,帳戶,消息和簽名將發(fā)送到API Token endpoint。驗(yàn)證方法首先通過(guò)接受簽名和明文消息作為輸入的函數(shù)從簽名中推斷帳戶(也稱為公鑰)。如果計(jì)算的以太坊地址等于用戶提供的帳戶,則為該帳戶發(fā)出JWT Token。
請(qǐng)務(wù)必注意,整個(gè)身份驗(yàn)證流程不需要用戶名/密碼或OAuth外部服務(wù)。用于驗(yàn)證用戶身份的機(jī)制與以太坊用于保證以太坊區(qū)塊鏈安全性的機(jī)制相同。這要?dú)w功于Go ethereum(Geth)通過(guò)Metamask插件提供JSON RPC中的web3.personal.sign。
服務(wù)器端調(diào)用對(duì)應(yīng)的JSON RPC以從簽名中檢索帳戶:web3.personal.ecrecover。在本教程中,我們將構(gòu)建一個(gè)Asp.Net Core 2項(xiàng)目作為API層,并構(gòu)建一個(gè)簡(jiǎn)單的HTML/javascript客戶端作為DApp,以實(shí)際演示此身份驗(yàn)證過(guò)程。
1.從DApp用戶單擊登錄按鈕。這需要Metamask提供的web3對(duì)象。
2.Metamask要求用戶通過(guò)JSON RPC的web3.personal.sign簽署消息。
3.簽名將發(fā)送到API層,該層通過(guò)JSON RPC的web3.personal.ecrecover驗(yàn)證帳戶。
4.驗(yàn)證后,API層將發(fā)布JWT。
先決條件1.為Chrome或Firefox安裝Metamask插件。這個(gè)附加組件“將以太坊帶到你的瀏覽器上”。實(shí)際上,Metamask提供了一個(gè)web3對(duì)象,用于與你的DApp中的以太坊區(qū)塊鏈進(jìn)行交互,處理你的私鑰并在瀏覽器中管理交易。
2.可選的。運(yùn)行Geth節(jié)點(diǎn)。我將向你展示兩種從簽名中恢復(fù)以太坊帳戶的方法,其中一種方法需要你的API層針對(duì)Geth節(jié)點(diǎn)調(diào)用JSON RPC。注意:Infura現(xiàn)在還不行,因?yàn)樗鼈儾辉试S大多數(shù)web3.personal.*的JSON RPC接口。出于開發(fā)目的,運(yùn)行Geth節(jié)點(diǎn)非常簡(jiǎn)單。在生產(chǎn)環(huán)境中,出于安全考慮,運(yùn)行Geth節(jié)點(diǎn)并不是一項(xiàng)簡(jiǎn)單的任務(wù)。最好的方法是依靠AWS或Azure提供的區(qū)塊鏈即服務(wù)堆棧(BaaS)。
3.開發(fā)堆棧:Visual Studio 2017和節(jié)點(diǎn)包管理器(NPM)。
4.以太坊/Asp.Net核心/前端開發(fā)的基礎(chǔ)知識(shí),JWT認(rèn)證流程的基礎(chǔ)知識(shí)。
開始打開Visual Studio 2017,創(chuàng)建EthereumJwtSolution并添加兩個(gè)Asp.Net Core 2 Web應(yīng)用程序項(xiàng)目:EthereumJwtApi和EthereumJwtClient。為兩個(gè)項(xiàng)目選擇空項(xiàng)目腳手架。
EthereumJwtClient只是一個(gè)HTML/Javascript客戶端。我們將在Asp.Net Core上構(gòu)建客戶端應(yīng)用程序,只是為了在IIS Express上輕松運(yùn)行它。
我們需要準(zhǔn)備EthereumJwtApi來(lái)創(chuàng)建和處理JWT token,以保護(hù)一些安全端點(diǎn)。任務(wù)很簡(jiǎn)單,因?yàn)锳sp.Net Core 2有一個(gè)內(nèi)置的JWT機(jī)制,可以插入我們的應(yīng)用程序。 打開Startup.cs并修改ConfigureServices方法:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = Configuration["Jwt:Issuer"], ValidAudience = Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])) }; }); services.AddCors(options => { options.AddPolicy("CorsPolicy", builder => builder.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials() .Build()); }); services.AddMvc();
然后修改Configure方法:
if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseCors("CorsPolicy"); app.UseAuthentication(); app.UseMvc();
我們告訴我們的API應(yīng)用程序使用JWT身份驗(yàn)證服務(wù)。為了與我們的用戶合作,我們還需要配置Cors策略。我們?cè)?b>appsetting.json中定義設(shè)置JWT配置:
"Jwt": { "Key": "averysecretpassphrase", // A random and secure passhphrase "Issuer": "http://localhost:49443/", // This API base URI "Audience": "http://localhost:51149/" // The client base URI },
為測(cè)試目的創(chuàng)建一個(gè)簡(jiǎn)單的可能安全端點(diǎn):
[Route("api/[controller]")] public class ValuesController : Controller { // GET api/values [HttpGet, Authorize] public IEnumerableGet() { return new string[] { "Secret 1", "Secret 2" }; } }
TokenController.cs將處理JWT請(qǐng)求和相關(guān)的token問(wèn)題:
[Route("api/[controller]")] public class TokenController : Controller { private IConfiguration _config; public TokenController(IConfiguration config) { _config = config; } [AllowAnonymous] [HttpPost] public async TaskCreateToken([FromBody]LoginVM login) { var user = await Authenticate(login); if (user != null) { var tokenString = BuildToken(user); return Ok(new { token = tokenString }); } return Unauthorized(); } private string BuildToken(UserVM user) { var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, user.Account), new Claim(JwtRegisteredClaimNames.GivenName, user.Name), new Claim(JwtRegisteredClaimNames.Email, user.Email), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"])); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken(_config["Jwt:Issuer"], _config["Jwt:Audience"], claims, expires: DateTime.Now.AddMinutes(30), signingCredentials: creds); return new JwtSecurityTokenHandler().WriteToken(token); } private async Task Authenticate(LoginVM login) { // TODO: this method will authenticate the user recovering the Ethereum address from signature using the Geth RPC web3.personal.ecrecover API UserVM user = user = new UserVM { Account = login.Account, Name = string.Empty, Email = string.Empty }; return user; } private async Task Authenticate2(LoginVM login) { // TODO: This method will authenticate the user recovering his Ethereum address through underlaying offline ecrecover method. UserVM user = user = new UserVM { Account = login.Account, Name = string.Empty, Email = string.Empty }; return user; }
這是一個(gè)典型的JWT控制器,核心方法,Authenticate和Authenticate2尚未實(shí)現(xiàn)。一旦實(shí)現(xiàn),他們將完成相同的工作:從簽名中恢復(fù)以太坊地址,并檢查它是否等于客戶端提供的以太坊地址。
LoginVM表示客戶端提供的用戶憑據(jù),UserVM表示“服務(wù)器端”登錄用戶:
public class LoginVM { public string Signer { get; set; } // Ethereum account that claim the signature public string Signature { get; set; } // The signature public string Message { get; set; } // The plain message public string Hash { get; set; } // The prefixed and sha3 hashed message } public class UserVM { public string Account { get; set; } // Unique account name (the Ethereum account) public string Name { get; set; } // The user name public string Email { get; set; } // The user Email }
Authenticate方法將Signature和Message屬性作為ecRecover函數(shù)的輸入,Authenticate2方法將采用Signature和Hash屬性。我稍后會(huì)解釋其中的差異。
======================================================================
分享一些以太坊、EOS、比特幣等區(qū)塊鏈相關(guān)的交互式在線編程實(shí)戰(zhàn)教程:
java以太坊開發(fā)教程,主要是針對(duì)java和android程序員進(jìn)行區(qū)塊鏈以太坊開發(fā)的web3j詳解。
python以太坊,主要是針對(duì)python工程師使用web3.py進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。
php以太坊,主要是介紹使用php進(jìn)行智能合約開發(fā)交互,進(jìn)行賬號(hào)創(chuàng)建、交易、轉(zhuǎn)賬、代幣開發(fā)以及過(guò)濾器和交易等內(nèi)容。
以太坊入門教程,主要介紹智能合約與dapp應(yīng)用開發(fā),適合入門。
以太坊開發(fā)進(jìn)階教程,主要是介紹使用node.js、mongodb、區(qū)塊鏈、ipfs實(shí)現(xiàn)去中心化電商DApp實(shí)戰(zhàn),適合進(jìn)階。
C#以太坊,主要講解如何使用C#開發(fā)基于.Net的以太坊應(yīng)用,包括賬戶管理、狀態(tài)與交易、智能合約開發(fā)與交互、過(guò)濾器和交易等。
EOS教程,本課程幫助你快速入門EOS區(qū)塊鏈去中心化應(yīng)用的開發(fā),內(nèi)容涵蓋EOS工具鏈、賬戶與錢包、發(fā)行代幣、智能合約開發(fā)與部署、使用代碼與智能合約交互等核心知識(shí)點(diǎn),最后綜合運(yùn)用各知識(shí)點(diǎn)完成一個(gè)便簽DApp的開發(fā)。
java比特幣開發(fā)教程,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲(chǔ)、去中心化共識(shí)機(jī)制、密鑰與腳本、交易與UTXO等,同時(shí)也詳細(xì)講解如何在Java代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構(gòu)造裸交易等,是Java工程師不可多得的比特幣開發(fā)學(xué)習(xí)課程。
php比特幣開發(fā)教程,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲(chǔ)、去中心化共識(shí)機(jī)制、密鑰與腳本、交易與UTXO等,同時(shí)也詳細(xì)講解如何在Php代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構(gòu)造裸交易等,是Php工程師不可多得的比特幣開發(fā)學(xué)習(xí)課程。
原文在這里以太坊 區(qū)塊鏈 Asp.Net Core API
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/24353.html
摘要:上一篇用以太坊區(qū)塊鏈保證的安全上我們介紹了基本的解決方案,這一篇我們重點(diǎn)來(lái)看客戶端。是以太坊的實(shí)現(xiàn)。以太坊,主要是針對(duì)工程師使用進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。這里是原文以太坊區(qū)塊鏈的安全設(shè)計(jì) 上一篇用以太坊區(qū)塊鏈保證Asp.Net Core的API安全(上)我們介紹了基本的解決方案,這一篇我們重點(diǎn)來(lái)看客戶端。 正如我們所說(shuō),我們的DApp是一個(gè)簡(jiǎn)單的HTML/ES6客戶端。我們將在Asp...
摘要:以太坊背后的主要人物是。以太坊通過(guò)在區(qū)塊鏈上引入智能合約,徹底改變了加密世界。以太坊使用名為以太坊虛擬機(jī)的虛擬機(jī)執(zhí)行其智能合約。以太坊最終將利用協(xié)議轉(zhuǎn)向權(quán)益證明。截至目前,以太坊在可擴(kuò)展性方面都失敗了。 不同的區(qū)塊鏈智能合約和區(qū)塊鏈技術(shù)現(xiàn)在風(fēng)靡一時(shí)。越來(lái)越多的人出于某種原因試圖進(jìn)入這個(gè)神奇的世界。如果你是這項(xiàng)技術(shù)的新手并正在尋找基于區(qū)塊鏈的開發(fā)平臺(tái)的快速入門,那么本指南非常適合你。我們...
摘要:最初,我對(duì)以太坊區(qū)塊鏈,智能合約和應(yīng)用程序提出了大量疑問(wèn)。即使需要額外的工具來(lái)設(shè)置開發(fā)環(huán)境,現(xiàn)在微軟將使用新的針對(duì)以太坊區(qū)塊鏈產(chǎn)品。 最近區(qū)塊鏈技術(shù)引起了我的注意。我剛開始了解它,就看到了區(qū)塊鏈去中心化架構(gòu)的巨大潛力,并且它能夠簡(jiǎn)化各種現(xiàn)有繁瑣的流程,通過(guò)各種形式的合約。 作為一名.NET開發(fā)人員,我主要使用的是一些提供中心數(shù)據(jù)源的架構(gòu),因此區(qū)塊鏈的去中心化概念對(duì)我來(lái)說(shuō)是全新的。我很快...
閱讀 1511·2021-10-08 10:05
閱讀 3168·2021-09-26 10:10
閱讀 958·2019-08-30 15:55
閱讀 562·2019-08-26 11:51
閱讀 507·2019-08-23 18:10
閱讀 3948·2019-08-23 15:39
閱讀 716·2019-08-23 14:50
閱讀 847·2019-08-23 14:46