Java应用程序的简单令牌认证
“我喜歡編寫身份驗證和授權(quán)代碼。” ?從來沒有Web開發(fā)人員。 厭倦了一次又一次地建立相同的登錄屏幕? 嘗試使用Okta API進(jìn)行托管身份驗證,授權(quán)和多因素身份驗證。
JSON Web令牌已Swift成為保護(hù)Web應(yīng)用程序安全的標(biāo)準(zhǔn),并取代了Cookie和會話等舊技術(shù)。 正確使用它們可以解決一系列安全問題,包括跨站點腳本攻擊(XSS),中間人攻擊(MITM)和跨站點請求偽造(CSRF)。 它們還為我們提供了可檢查的元數(shù)據(jù)和強大的密碼簽名的好處。 在本文中,我將深入探討JWT。 首先,我將介紹一些理論基礎(chǔ),解釋它們?nèi)绾喂ぷ鳌?之后,我將向您展示如何使用Okta配置Spring Boot應(yīng)用程序以使用JWT身份驗證。
JSON Web令牌是一個開放標(biāo)準(zhǔn),并且有許多可用的庫允許創(chuàng)建,驗證和檢查JWT。 您將使用Java JWT (又名JJWT),這是一個Java庫,提供端到端JWT的創(chuàng)建和驗證。 JJWT由Les Hazlewood創(chuàng)建, Les Hazlewood是Stormpath的前聯(lián)合創(chuàng)始人兼CTO Apache Shiro的主要撰稿人,目前是Okta自己的高級架構(gòu)師。 根據(jù)Apache 2.0許可,它是開源的。
了解JWT及其在身份驗證中的作用
首先讓我們研究一下authentication和token在這種情況下的含義。
身份驗證證明用戶就是他們所說的真實身份 。
令牌是一個獨立的信息塊。 它可能具有內(nèi)在價值,也可能沒有。 我將向您展示一種特定類型的令牌, 它確實具有內(nèi)在價值,并通過會話ID解決了許多問題。
什么是JSON Web令牌? JWT是一種開放標(biāo)準(zhǔn)( RFC 7519 ),用于使用JSON在各方之間作為數(shù)字簽名的字符串令牌傳輸信息。 可以使用HMAC算法或使用RSA或ECDSA的公用/專用密鑰對對它們進(jìn)行簽名 。
換句話說:JWT是JSON令牌,是URL安全,緊湊且自包含的字符串。 通常,它們攜帶有關(guān)用戶的已驗證身份的信息。 它們通常經(jīng)過編碼和加密。 它們Swift成為網(wǎng)絡(luò)上令牌實現(xiàn)的事實上的標(biāo)準(zhǔn)。 URL安全意味著令牌字符串可以在URL中使用,因為所有特殊字符都已被編碼為簡單的字母數(shù)字字符。 JWT也被認(rèn)為是不透明的,因為字符串本身沒有解碼或解密就不會提供任何信息。
令牌通常被認(rèn)為是一種授權(quán)機制,但是它們也可以用作在Web應(yīng)用程序和服務(wù)器之間安全存儲和傳輸信息的一種方式,與使用會話ID的方式非常相似。
將JWT與OAuth 2.0結(jié)合使用
許多OAuth 2.0實現(xiàn)都將JWT用于其訪問令牌。 應(yīng)該指出,OAuth 2.0和JWT規(guī)范是彼此完全獨立的,彼此之間沒有任何依賴關(guān)系。 將JWT用作OAuth 2.0的令牌機制會帶來很多好處,如下所示。
無論使用哪種JWT實施,都必須將漂亮的Web令牌存儲在某個地方。 Cookie和HTML5 Web存儲是兩個流行的選項。 兩種選擇都有好處和潛在的風(fēng)險。 對此的討論不在本文討論范圍之內(nèi),但是值得閱讀上面提到的典型攻擊:跨站點腳本攻擊(XSS),中間人攻擊(MITM)和跨站點請求偽造(CSRF)。 Okta使用HTML5網(wǎng)絡(luò)存儲。
無論將JWT存儲在何處,都可以用JWT完全替換會話ID,并獲得直接從會話ID / JWT訪問元信息的額外好處。
看一下JWT的結(jié)構(gòu)
那是很多首字母縮寫詞。 讓我們看一下JWT。 在野外,JWT很害羞。 有些人甚至可能說他們太丑陋或無聊了(取決于您對206個字符串的感覺)。
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vdHJ1c3R5YXBwLmNvbS8iLCJleHAiOjEzMDA4MTkzODAsInN1YiI6InVzZXJzLzg5ODM0NjIiLCJzY29wZSI6InNlbGYgYXBpL2J1eSJ9.43DXvhrwMGeLLlP4P4izjgsBB2yrpo82oiUPhADakLs就像生活中的大多數(shù)事情一樣,請不要憑空判斷JWT(請記住,它們是不透明的)。 如果仔細(xì)看,您會發(fā)現(xiàn)字符串中有兩個句點。 這些界定了JWT的不同部分:
窺視令牌頭
我知道我說過有些人認(rèn)為JWT很無聊。 甚至不透明。 但是,如果您知道如何與他們交談,JWT非常有趣。 讓我們解碼示例??JWT并查看其中的內(nèi)容。
標(biāo)頭只是通過Base64Url編碼的。 它告訴我們令牌的類型和使用的哈希算法,通常是HMAC SHA256或RSA。
{"typ": "JWT","alg": "HS256" }順便說一下, jsonwebtoken.io是用于編碼和解碼JWT的出色在線工具。
查看有效載荷
令牌的第二部分是有效負(fù)載或聲明 。
{"iss": "http://trustyapp.com/","exp": 1300819380,"sub": "users/8983462","scope": "self api/buy" }有效負(fù)載包含聲明 。 聲明是有關(guān)實體(通常是用戶)和任何其他數(shù)據(jù)的聲明。 索賠有以下三種:
在上面的示例中:
- iss是發(fā)行令牌的人。 這是已注冊的索賠。
- exp是令牌過期的時間。 也是已注冊的索賠。
- 子是主題。 通常是一個用戶標(biāo)識符。 也是已注冊的索賠。
- scope是OAuth 2.0常用的自定義私人聲明。
范圍聲明通常用于提供授權(quán)信息。 例如,讓應(yīng)用程序知道用戶有權(quán)訪問應(yīng)用程序的哪一部分。 當(dāng)然,這并不能免除服務(wù)器執(zhí)行自己的授權(quán)檢查的責(zé)任。 Web應(yīng)用程序安全性的一般原則是冗余。 客戶端應(yīng)用程序提供一個檢查點,服務(wù)器提供另一個檢查點。
JSON數(shù)據(jù)經(jīng)過Base64URL編碼以創(chuàng)建編碼的有效負(fù)載。 編碼的標(biāo)頭和有效負(fù)載用于創(chuàng)建簽名。
檢查令牌簽名
簽名是JWT結(jié)構(gòu)的最后一部分。 它獲取標(biāo)頭,然后有效負(fù)載向哈希算法添加一個秘密,并吐出與JWT其余部分中未更改的數(shù)據(jù)相對應(yīng)的哈希。 使用簽名,客戶端應(yīng)用程序和服務(wù)器可以驗證它們接收的令牌是原始的,未更改的令牌。
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )了解此簽名不提供機密性是非常重要的。 此信息是公開可見的。 簽名保證令牌未被篡改,但不會隱藏數(shù)據(jù)(小孩可以在叔叔的iPhone 4上解碼Base64)。 如果要發(fā)送敏感信息,必須對JWT進(jìn)行加密。
通常以從屬權(quán)利要求的形式存儲用戶標(biāo)識符的做法。 當(dāng)JWT簽名時,它稱為JWS。 加密后,稱為JWE。
無國籍是JWT的一大好處。 服務(wù)器不需要存儲任何會話數(shù)據(jù)。 它可以全部存儲在令牌中,并在應(yīng)用程序和服務(wù)器之間來回傳遞。 這看似是一個奇怪的電子飛盤游戲,但此模型的伸縮性很好(只要會話狀態(tài)相對較小,它應(yīng)該確實如此)。 從JWT解碼會話狀態(tài)要比在每個請求上訪問數(shù)據(jù)庫僅從會話存儲中檢索一些基本用戶狀態(tài)信息快得多,并且性能更高。
使用Java創(chuàng)建和驗證JWT
我已經(jīng)提到過我們的JJWT項目嗎? 查看其GitHub頁面 。 這是針對Java的完全開源的JWT解決方案。
讓我們看一個使用JJWT創(chuàng)建JWT的示例。
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; byte[] key = getSignatureKey(); String jwt = Jwts.builder().setIssuer("http://trustyapp.com/") .setSubject("users/1300819380") .setExpiration(expirationDate) .put("scope", "self api/buy") .signWith(SignatureAlgorithm.HS256,key) .compact();該庫使用了流暢的Builder API。 請注意用于設(shè)置聲明的設(shè)置器。 標(biāo)準(zhǔn)聲明具有預(yù)定義的設(shè)置器,例如setSubject("users/1300819380") ,而自定義聲明使用鍵值put()方法。 例如范圍聲明, put("scope", "self api/buy") 。
驗證JWT一樣容易。
String subject = "HACKER"; try { Jws jwtClaims = Jwts.parser().setSigningKey(key).parseClaimsJws(jwt); subject = claims.getBody().getSubject(); // OK, you can trust this JWT } catch (SignatureException e) { // don't trust this JWT! }如果對JWT進(jìn)行了任何篡改,則解析聲明將引發(fā)SignatureException并且subject變量的值將保持HACKER 。 如果它是有效的JWT,則將從中提取subject : claims.getBody().getSubject() 。
了解OAuth 2.0以Java進(jìn)行令牌身份驗證
稍后,您將使用Okta的OAuth 2.0實現(xiàn)來創(chuàng)建Spring Boot應(yīng)用程序。 但是首先,您應(yīng)確保了解什么是OAuth,什么不是OAuth。
簡而言之,OAuth 2.0是“授權(quán)的行業(yè)標(biāo)準(zhǔn)協(xié)議”(來自O(shè)Auth.net網(wǎng)站 )。 授權(quán)意味著它為應(yīng)用程序提供了一種方法,以確保用戶有權(quán)執(zhí)行操作或訪問資源。 OAuth 2.0 不提供用于驗證用戶身份的工具。
那是身份驗證。
還有另一個稱為OpenID Connect或OIDC的協(xié)議層,通常與提供身份驗證的OAuth 2.0配對。 OIDC建立在OAuth 2.0的基礎(chǔ)上,并提供一種驗證用戶身份的方法,通常是讓用戶使用用戶名和密碼登錄,或者使用許多社交登錄選項之一。 因為OIDC 確實與OAuth 2.0一起驗證用戶的身份,所以它們一起為Web應(yīng)用程序和服務(wù)器提供了完整的身份驗證和授權(quán)協(xié)議。
記得:
- OIDC是身份驗證,還是我是誰?
- OAuth是授權(quán),還是該怎么辦?
在Java中配置Okta OIDC應(yīng)用程序以進(jìn)行令牌認(rèn)證
很快,您將像專家一樣生成和驗證JWT。 但是首先,您需要轉(zhuǎn)到developer.okta.com并創(chuàng)建一個OpenID Connect(OIDC)應(yīng)用程序。 如果尚未注冊免費的開??發(fā)者帳戶。 我是否提到過它完全免費?
登錄到Okta開發(fā)人員儀表板。 轉(zhuǎn)到應(yīng)用程序 ,然后單擊添加應(yīng)用程序按鈕。
選擇Web應(yīng)用程序類型,然后單擊“ 下一步” 。
在下一頁上,您需要給新應(yīng)用程序起一個易記的名稱。 您可以隨意命名。 您還需要選中“ 客戶端憑據(jù)”復(fù)選框。 這將激活您將要使用的client_credentials授予類型。
單擊完成 。
請注意下一頁底部的客戶端ID和客戶端密鑰 。 稍后您將需要這些。
安裝HTTPie
我們將使用一個很棒的命令行實用工具來運行一些示例:HTTPie。 如果尚未安裝,請訪問其網(wǎng)站并安裝。
申請JWT
時機已到。 我知道你很興奮 您終于要見識JWT。
我知道您很想離開,但是您還需要執(zhí)行一個初步的步驟。 您需要對上述Okta OIDC應(yīng)用程序中的客戶端ID和客戶端密鑰進(jìn)行編碼,以便在HTTP基本授權(quán)標(biāo)頭中使用。
通用格式為:
Authorization: Basic Base64Encode(< your client id >:< your client secret >)
注意中間的: 。 獲取您的客戶ID,并使用冒號將其加入到您的客戶秘密中。 Base64對結(jié)果字符串進(jìn)行編碼(提示:使用base64encode.org )。 然后將其包含在您的請求中。 它看起來像這樣:
Authorization: Basic ABChZzU4NDg5YW1aTDCBCB4waDc6TUp3YWN4RU5WNzQ1bEdQNWJPdlFETV9iaDE5NGp1eHQ3SXJfdWEzQQ==
互聯(lián)網(wǎng)上有各種實用程序可以為您完成此任務(wù)。 盡管這些對于教程和從頭開始開發(fā)可能會有所幫助,但出于顯而易見的原因,但使用它們來編碼生產(chǎn)憑證并不是一個好主意。
接下來,您需要的是Okta OIDC應(yīng)用程序的令牌請求URL。 這將是您的Okta授權(quán)服務(wù)器基本URL加/v1/token 。 從頂部菜單轉(zhuǎn)到API ,然后選擇“ 授權(quán)服務(wù)器” 。 查看默認(rèn)服務(wù)器的Issuer URI 。 添加/v1/token 。
例如,類似于: https://{yourOktaDomain}/oauth2/default/v1/token
使用HTTPie,您的終端命令將如下所示:
http -f POST https://{yourOktaDomain}/oauth2/default/v1/token \ 'Authorization: Basic MG9hZzU4NDg5YW1aTDBNRU4wa...' \ grant_type=client_credentials這里發(fā)生了什么?
-f是表單標(biāo)志。 Content-Type設(shè)置為application/x-www-form-urlencoded; charset=utf-8 application/x-www-form-urlencoded; charset=utf-8并使用key=value表示法分析命令行以獲取表單數(shù)據(jù)。
POST是HTTP請求類型。
https://{yourOktaDomain}/oauth2/default/v1/token是令牌請求URL。
'Authorization: Basic ...'設(shè)置基本auth標(biāo)頭。
grant_type=client_credentials是一個表單值,它告訴Okta我們正在請求的授予類型。 一秒鐘內(nèi)將對此進(jìn)行更多介紹。
如果運行此命令,請繼續(xù)! –您將收到invalid scope錯誤。
HTTP/1.1 400 Bad Request Cache-Control: no-cache, no-store Connection: close Content-Type: application/json;charset=UTF-8 ...{"error": "invalid_scope","error_description": "The authorization server resource does not have any configured default scopes, 'scope' must be provided." }使用client_credentials授予類型實際上只是一種方便。 這是一種授予類型,它使我們無需遵循瀏覽器重定向即可請求JWT。 client_credentials通常用于API交互。
根據(jù)OAuth規(guī)范 ,“客戶端使用客戶端憑據(jù)授予類型來獲取用戶上下文之外的訪問令牌。 客戶端通常使用它來訪問有關(guān)其自身的資源,而不是訪問用戶的資源。”
將Okta用作單一登錄提供程序(一種更常見的用例)時,可以使用“ 授權(quán)代碼授予” 。 這種授予類型(其中應(yīng)用程序允許用戶登錄并交換訪問令牌的授權(quán)代碼),但是需要一系列重定向,而這些重定向?qū)⒑茈y從命令行客戶端(例如HTTPie)進(jìn)行管理。 因此,本教程使用“客戶端證書”授予類型來方便地演示一些基本的OAuth / JWT功能。
您希望能想到:“好極了,但是范圍誤差呢?”
很高興你問!
范圍提供了一種定義和限制令牌授予的訪問權(quán)限的方法。 在對用戶進(jìn)行授權(quán)和身份驗證時,通常會使用一系列范圍,例如openid email profile 。 這些作用域告訴服務(wù)器,該應(yīng)用程序希望訪問用戶的個人資料,電子郵件地址,并希望發(fā)出OpenID身份驗證請求。
客戶證書授予類型要求我們定義一個自定義范圍。 這就是invalid scope錯誤所抱怨的。
讓我們修復(fù)它!
添加自定義范圍
返回至developer.okta.com 。 在頂部菜單中,轉(zhuǎn)到API和授權(quán)服務(wù)器 。
從服務(wù)器列表中單擊默認(rèn)服務(wù)器。
單擊“ 作用域”選項卡,然后單擊“ 添加作用域”按鈕。
將范圍命名為“ customScope”,對其進(jìn)行描述,然后單擊“ 創(chuàng)建” 。 您需要匹配的名稱,但是描述是任意的。
再次運行令牌請求
重新運行請求,這次使用自定義范圍。
http -f POST https://{yourOktaDomain}/oauth2/default/v1/token \ 'Authorization: Basic MG9hZzU4NDg5YW1aTDBN...' \ grant_type=client_credentials \ scope=customScope這次您將獲得令牌!
HTTP/1.1 200 OK Cache-Control: no-cache, no-store Connection: Keep-Alive Content-Type: application/json;charset=UTF-8 Pragma: no-cache ...{"access_token": "eyJraWQiOiJldjFpay1DS3UzYjJXS3QzSVl1MlJZc3...","expires_in": 3600,"scope": "customScope","token_type": "Bearer" }注意Cache-Control和Pragma標(biāo)頭。 您不希望此響應(yīng)被緩存在任何地方。 access_token是瀏覽器在后續(xù)請求中將使用的內(nèi)容。 請記住,不需要將JWT用作OAuth 2.0訪問令牌。 它們非常方便,因為您可以在其中編碼防篡改(并且可能是機密的)元數(shù)據(jù)。
使用您的訪問令牌
要在請求中包含訪問令牌,請使用類型為Bearer的Authorization標(biāo)頭。 下面是一個示例GET請求。
GET /admin HTTP/1.1 Authorization: Bearer eyJraWQiOiJldjFpay1DS3UzYjJXS3QzSVl1MlJZc3...輸入Spring Boot以使用Java進(jìn)行令牌認(rèn)證
您準(zhǔn)備好使用Java嗎? 我已經(jīng)準(zhǔn)備好使用Java。
您要做的第一件事是從GitHub存儲庫克隆我們的示例應(yīng)用程序 。
現(xiàn)在,使用以下終端命令檢出start分支:
git clone -b start https://github.com/oktadeveloper/okta-spring-boot-token-auth-example.git此應(yīng)用程序非常簡單。 至少,它看起來超級簡單。 實際上,在后臺,Spring Boot和Okta做出了相當(dāng)大的努力,以為您提供功能齊全的REST資源服務(wù)器,該服務(wù)器具有使用OAuth 2.0和Okta OIDC應(yīng)用程序進(jìn)行的JWT令牌身份驗證的功能。 AM!
唯一需要進(jìn)行的配置是在src/main/resources/application.yml文件中。 您需要從上面創(chuàng)建的幾個步驟的Okta OIDC應(yīng)用程序中填寫您的客戶端ID和客戶端密鑰 。 您使用這些來生成令牌。 它們大致(如果是斜視,則有點類似)對應(yīng)于OIDC應(yīng)用程序的用戶名和密碼。
server: port: 8080 okta: oauth2: issuer: https://{yourOktaDomain}/oauth2/default clientId: {yourClientId}clientSecret: {yourClientSecret}這就是您需要做的! 至此,您已經(jīng)擁有了一個功能齊全(如果不是很令人興奮的話)的Spring Boot資源服務(wù)器。
該應(yīng)用程序的入口點位于Application.java文件中:
@EnableResourceServer @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }您會注意到這是老式的main()方法所在的地方。 這些天感覺有點像遺物,但這就是所有魔力的開始。 在每個愚蠢的貓錄像和Facebook激烈的政治辯論背后,都有一個main()方法開始了這一切。
您正在使用SpringApplication.run()方法來引導(dǎo)Spring框架,該框架將加載Application類。 這將拾取@EnableResourceServer和@SpringBootApplication批注。 @SpringBootApplication告訴Spring加載Spring Boot。 @EnableResourceServer將Spring Boot應(yīng)用程序配置為通過OAuth令牌(可能與OAuth 2.0單一登錄相對)對請求進(jìn)行身份驗證。
@EnableResourceServer有幾個含義,值得指出。 如果您看一下有關(guān)注釋的文檔 ,則會看到幾個要點:如果要配置資源服務(wù)器,則需要定義ResourceServerConfigurerAdapter bean; 并以3的硬編碼順序添加了WebSecurityConfigurerAdapter bean。
你為什么要在乎呢? 因為在更復(fù)雜的Web應(yīng)用程序中,您將要同時使用ResourceServerConfigurerAdapter和WebSecurityConfigurerAdapter來配置權(quán)限。 與使用@EnableOAuth2Sso批注時所做的WebSecurityConfigurerAdapter ,這與簡單地使用WebSecurityConfigurerAdapter @EnableOAuth2Sso ,所以我想警告您。 通常,資源服務(wù)器端點將以/api或其他內(nèi)容開頭,并由ResourceServerConfigurerAdapter進(jìn)行配置和保護(hù),而其他任何純HTML端點將由WebSecurityConfigurerAdapter進(jìn)行配置。 但是,您需要將@Order(Ordered.HIGHEST_PRECEDENCE)添加到WebSecurityConfigurerAdapter以使其優(yōu)先于具有硬編碼順序的默認(rèn)順序。
如果要查看如何完成此操作的更具體示例,請查看full-config分支 。 您也可以在最后的鏈接中瀏覽Siva Tech文章。
除了這些,讓我們看一下HelloController類。
@RestController public class HelloController { @RequestMapping("/") public String home(java.security.Principal user) { return "Hello " + user.getName(); } }@RestController批注是@Controller和@ResponseBody批注的組合。
@Controller告訴Spring Boot此類是控制器類,并查找URL請求到內(nèi)部方法的映射。
@ResponseBody指示控制器方法返回原始響應(yīng)數(shù)據(jù),并且不映射到模板名稱。 這就是它返回簡單字符串的方式,而不是使用Spring的模型和視圖模板系統(tǒng)。
@RequestMapping("/")表示將home()方法映射到基本URL。
注意使用了依賴注入來獲取java.security.Principal 。 這項工作需要大量自動調(diào)整。 Spring和Okta會根據(jù)OAuth 2.0和OpenID Connect規(guī)范共同驗證令牌并進(jìn)行來回通信,對用戶進(jìn)行身份驗證,并提供JWT授權(quán)令牌,該令牌包含具有用戶“名稱”的元數(shù)據(jù)。
運行Spring Boot App
好的。 一起讓它成為現(xiàn)實!
使用以下命令運行Spring Boot應(yīng)用程序: ./gradlew bootRun 。
您應(yīng)該看到很多文本以如下形式結(jié)尾:
... [main] INFO org.springframework.jmx.export.annotation.AnnotationMBeanExporter - Registering beans for JMX exposure on startup [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path '' [main] INFO com.okta.springboottokenauth.Application - Started Application in 21.209 seconds (JVM running for 21.709) [2018-10-11 10:31:58.646] - 22235 INFO [http-nio-8080-exec-1] --- org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]: Initializing Spring FrameworkServlet 'dispatcherServlet' [http-nio-8080-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'dispatcherServlet': initialization started [http-nio-8080-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'dispatcherServlet': initialization completed in 13 ms使用JWT進(jìn)行身份驗證
現(xiàn)在運行Spring Boot應(yīng)用程序,使用HTTPie運行不帶令牌的GET請求:
http GET http://localhost:8080您將獲得401 /未經(jīng)授權(quán):
HTTP/1.1 401 Cache-Control: no-store Content-Type: application/json;charset=UTF-8 ... {"error": "unauthorized","error_description": "Full authentication is required to access this resource" }重新運行它,這次包括您的令牌(取決于經(jīng)過了多少時間,您可能需要請求一個新令牌):
http GET :8080 'Authorization: Bearer eyJraWQiOiJldjFpay1DS3UzYjJXS3QzSVl1...'提示:如果收到顯示“ Invalid JOSE Header kid”的invalid_token錯誤,則很有可能用不正確的值更新了application.yml 。
假設(shè)您的令牌仍然有效,您將獲得一個HTTP 200:
HTTP/1.1 200 Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Length: 26 Content-Type: text/plain;charset=UTF-8 ...Hello 0oag58489amZL0MEN0h70oag58489amZL0MEN0h7將是您的客戶ID。
請記住,您使用的是client_credentials授予類型,并且已將客戶端ID和客戶端密鑰作為憑據(jù)發(fā)送給服務(wù)器。 因此,授權(quán)服務(wù)器將您的客戶ID作為您的“名稱”發(fā)送回去。 在不同的情況下,例如使用授權(quán)碼授予,這將是用戶的名稱(或者可能是他們的電子郵件地址或用戶名)。
了解有關(guān)使用Java進(jìn)行令牌身份驗證和構(gòu)建安全應(yīng)用程序的更多信息
了解令牌身份驗證對于構(gòu)建現(xiàn)代Web應(yīng)用程序至關(guān)重要。 有兩種用于簽名和加密令牌的主要方法:哈希和公鑰/私鑰。 兩種方法都是互聯(lián)網(wǎng)安全的基礎(chǔ)。 在HMAC上查看Wikipedia頁面 ,以繼續(xù)學(xué)習(xí)JWT中使用的基于哈希的消息認(rèn)證代碼(HMAC)。 要了解公共/專用密鑰加密, Red Hat進(jìn)行了出色的介紹 。
一旦您對這兩種技術(shù)真正感到滿意,就可以看一下關(guān)于Medium的有關(guān)JWT的出色教程 。
您可能還需要查看RFC規(guī)范 。
在Spring結(jié)束時,我發(fā)現(xiàn)Siva Tech Lab的本教程對說明如何使用OAuth 2.0實施Spring Boot應(yīng)用程序很有幫助。
以下是Okta博客的其他一些鏈接,可幫助您繼續(xù)前進(jìn):
- Spring Boot,OAuth 2.0和Okta入門
- 確保Spring Boot應(yīng)用程序安全的10種絕佳方法
- 如果您的JWT被盜怎么辦?
- 使用Spring Boot 2.0和OAuth 2.0構(gòu)建并保護(hù)微服務(wù)
如果您對此帖子有任何疑問,請在下面添加評論。 有關(guān)更多精彩內(nèi)容, 請在Twitter上關(guān)注@oktadev , 在Facebook上關(guān)注我們,或訂閱我們的YouTube頻道 。
Java Apps的簡單令牌身份驗證最初于2018年10月16日發(fā)布在Okta開發(fā)人員博客上。
“我喜歡編寫身份驗證和授權(quán)代碼。” ?從來沒有Web開發(fā)人員。 厭倦了一次又一次地建立相同的登錄屏幕? 嘗試使用Okta API進(jìn)行托管身份驗證,授權(quán)和多因素身份驗證。
翻譯自: https://www.javacodegeeks.com/2018/10/simple-token-authentication-java-apps.html
總結(jié)
以上是生活随笔為你收集整理的Java应用程序的简单令牌认证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 赞美梅花的词语 有哪些赞美梅花的词语
- 下一篇: 临洮怎么读 临洮读音简介