日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java应用程序的简单令牌认证

發(fā)布時間:2023/12/3 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java应用程序的简单令牌认证 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

“我喜歡編寫身份驗證和授權(quán)代碼。” ?從來沒有Web開發(fā)人員。 厭倦了一次又一次地建立相同的登錄屏幕? 嘗試使用Okta API進行托管身份驗證,授權(quán)和多因素身份驗證。

JSON Web令牌已Swift成為保護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算法或使用RSAECDSA的公用/專用密鑰對對它們進行簽名

換句話說:JWT是JSON令牌,是URL安全,緊湊且自包含的字符串。 通常,它們攜帶有關(guān)用戶的已驗證身份的信息。 它們通常經(jīng)過編碼和加密。 它們Swift成為網(wǎng)絡(luò)上令牌實現(xiàn)的事實上的標(biāo)準(zhǔn)。 URL安全意味著令牌字符串可以在URL中使用,因為所有特殊字符都已被編碼為簡單的字母數(shù)字字符。 JWT也被認為是不透明的,因為字符串本身沒有解碼或解密就不會提供任何信息。

令牌通常被認為是一種授權(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(請記住,它們是不透明的)。 如果仔細看,您會發(fā)現(xiàn)字符串中有兩個句點。 這些界定了JWT的不同部分:

  • 標(biāo)頭
  • 有效載荷/主體(或要求)
  • 密碼簽名。
  • eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 . eyJpc3MiOiJodHRwOi8vdHJ1c3R5YXBwLmNvbS8iLCJleHAiOjEzMDA4MTkzODAsInN1YiI6InVzZXJzLzg5ODM0NjIiLCJzY29wZSI6InNlbGYgYXBpL2J1eSJ9 . 43DXvhrwMGeLLlP4P4izjgsBB2yrpo82oiUPhADakLs

    窺視令牌頭

    我知道我說過有些人認為JWT很無聊。 甚至不透明。 但是,如果您知道如何與他們交談,JWT非常有趣。 讓我們解碼示例??JWT并查看其中的內(nèi)容。

    標(biāo)頭只是通過Base64Url編碼的。 它告訴我們令牌的類型和使用的哈希算法,通常是HMAC SHA256或RSA。

    {"typ": "JWT","alg": "HS256" }

    順便說一下, jsonwebtoken.io是用于編碼和解碼JWT的出色在線工具。

    查看有效載荷

    令牌的第二部分是有效負載聲明

    {"iss": "http://trustyapp.com/","exp": 1300819380,"sub": "users/8983462","scope": "self api/buy" }

    有效負載包含聲明 。 聲明是有關(guān)實體(通常是用戶)和任何其他數(shù)據(jù)的聲明。 索賠有以下三種:

  • 已注冊的聲明: RFC 7519規(guī)范中定義的一組建議的聲明。 一些示例是issexpaud
  • 公共聲明:可由令牌用戶定義但應(yīng)遵循命名約定以避免沖突的用戶定義聲明(應(yīng)在IANA JSON Web令牌注冊表中定義,或定義為包含抗沖突名稱空間的URI),因為它們在公共命名空間中。
  • 私人聲明:用于在達成協(xié)議的各方之間共享信息的任意自定義聲明(不必擔(dān)心名稱沖突,因為它們是私有的)。
  • 在上面的示例中:

    • 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)建編碼的有效負載。 編碼的標(biāo)頭和有效負載用于創(chuàng)建簽名。

    檢查令牌簽名

    簽名是JWT結(jié)構(gòu)的最后一部分。 它獲取標(biāo)頭,然后有效負載向哈希算法添加一個秘密,并吐出與JWT其余部分中未更改的數(shù)據(jù)相對應(yīng)的哈希。 使用簽名,客戶端應(yīng)用程序和服務(wù)器可以驗證它們接收的令牌是原始的,未更改的令牌。

    HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )

    了解此簽名不提供機密性是非常重要的。 此信息是公開可見的。 簽名保證令牌未被篡改,但不會隱藏數(shù)據(jù)(小孩可以在叔叔的iPhone 4上解碼Base64)。 如果要發(fā)送敏感信息,必須對JWT進行加密。

    通常以從屬權(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進行了任何篡改,則解析聲明將引發(fā)SignatureException并且subject變量的值將保持HACKER 。 如果它是有效的JWT,則將從中提取subject : claims.getBody().getSubject() 。

    了解OAuth 2.0以Java進行令牌身份驗證

    稍后,您將使用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)用程序以進行令牌認證

    很快,您將像專家一樣生成和驗證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和客戶端密鑰進行編碼,以便在HTTP基本授權(quán)標(biāo)頭中使用。

    通用格式為:

    Authorization: Basic Base64Encode(< your client id >:< your client secret >)

    注意中間的: 。 獲取您的客戶ID,并使用冒號將其加入到您的客戶秘密中。 Base64對結(jié)果字符串進行編碼(提示:使用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ù)器” 。 查看默認服務(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)將對此進行更多介紹。

    如果運行此命令,請繼續(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)進行管理。 因此,本教程使用“客戶端證書”授予類型來方便地演示一些基本的OAuth / JWT功能。

    您希望能想到:“好極了,但是范圍誤差呢?”

    很高興你問!

    范圍提供了一種定義和限制令牌授予的訪問權(quán)限的方法。 在對用戶進行授權(quán)和身份驗證時,通常會使用一系列范圍,例如openid email profile 。 這些作用域告訴服務(wù)器,該應(yīng)用程序希望訪問用戶的個人資料,電子郵件地址,并希望發(fā)出OpenID身份驗證請求。

    客戶證書授予類型要求我們定義一個自定義范圍。 這就是invalid scope錯誤所抱怨的。

    讓我們修復(fù)它!

    添加自定義范圍

    返回至developer.okta.com 。 在頂部菜單中,轉(zhuǎn)到API授權(quán)服務(wù)器

    從服務(wù)器列表中單擊默認服務(wù)器。

    單擊“ 作用域”選項卡,然后單擊“ 添加作用域”按鈕。

    將范圍命名為“ customScope”,對其進行描述,然后單擊“ 創(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進行令牌認證

    您準(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)用程序進行的JWT令牌身份驗證的功能。 AM!

    唯一需要進行的配置是在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單一登錄相對)對請求進行身份驗證。

    @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進行配置和保護,而其他任何純HTML端點將由WebSecurityConfigurerAdapter進行配置。 但是,您需要將@Order(Ordered.HIGHEST_PRECEDENCE)添加到WebSecurityConfigurerAdapter以使其優(yōu)先于具有硬編碼順序的默認順序。

    如果要查看如何完成此操作的更具體示例,請查看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ī)范共同驗證令牌并進行來回通信,對用戶進行身份驗證,并提供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進行身份驗證

    現(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 0oag58489amZL0MEN0h7

    0oag58489amZL0MEN0h7將是您的客戶ID。

    請記住,您使用的是client_credentials授予類型,并且已將客戶端ID客戶端密鑰作為憑據(jù)發(fā)送給服務(wù)器。 因此,授權(quán)服務(wù)器將您的客戶ID作為您的“名稱”發(fā)送回去。 在不同的情況下,例如使用授權(quán)碼授予,這將是用戶的名稱(或者可能是他們的電子郵件地址或用戶名)。

    了解有關(guān)使用Java進行令牌身份驗證和構(gòu)建安全應(yīng)用程序的更多信息

    了解令牌身份驗證對于構(gòu)建現(xiàn)代Web應(yīng)用程序至關(guān)重要。 有兩種用于簽名和加密令牌的主要方法:哈希和公鑰/私鑰。 兩種方法都是互聯(lián)網(wǎng)安全的基礎(chǔ)。 在HMAC上查看Wikipedia頁面 ,以繼續(xù)學(xué)習(xí)JWT中使用的基于哈希的消息認證代碼(HMAC)。 要了解公共/專用密鑰加密, Red Hat進行了出色的介紹 。

    一旦您對這兩種技術(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ù)前進:

    • Spring Boot,OAuth 2.0和Okta入門
    • 確保Spring Boot應(yīng)用程序安全的10種絕佳方法
    • 如果您的JWT被盜怎么辦?
    • 使用Spring Boot 2.0和OAuth 2.0構(gòu)建并保護微服務(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進行托管身份驗證,授權(quán)和多因素身份驗證。

    翻譯自: https://www.javacodegeeks.com/2018/10/simple-token-authentication-java-apps.html

    總結(jié)

    以上是生活随笔為你收集整理的Java应用程序的简单令牌认证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 青青青国产 | 伊人自拍 | 伊人称影院 | 日韩欧美视频网站 | 亚洲成人少妇 | 海角社区在线视频播放观看 | 久久中文字幕网 | 韩国三级国产 | 国产91欧美| 久久久久无码国产精品一区 | 精品少妇久久久久久888优播 | 手机在线一区二区 | 国产乱淫av片免费 | 久草视频福利 | 开心春色激情网 | heyzo亚洲| 国产一级久久久 | 色欲AV无码精品一区二区久久 | www.成年人 | 草草色 | 在办公室被c到呻吟的动态图 | 手机天堂av | 一级做a爰片毛片 | 成人亚洲综合 | 久久精品视频国产 | 久久国产精品网站 | 超碰在线99 | 国产精品乱轮 | 亚洲熟女少妇一区二区 | 亚洲精品视频在线看 | av中文字幕免费观看 | 欧美极品少妇xxxxⅹ免费视频 | 爱爱免费网站 | 人妻熟人中文字幕一区二区 | 天堂中文在线资源 | 国产91高清 | 日本理论片午伦夜理片在线观看 | 少妇av | 久久久999视频 | 国产高清精品在线观看 | 黄色网久久 | 麻豆免费下载 | 西西人体大胆4444ww张筱雨 | 日日影院 | 久久国内精品 | 蜜桃久久久 | 黄色av网站免费 | 97视频总站 | 性感美女视频一二三 | 韩国伦理在线看 | 国产色呦呦| 日日干干 | 农村寡妇一区二区三区 | 天堂999 | 日韩欧美视频在线播放 | 性欧美大战久久久久久久免费观看 | 国产欧美一区二区三区视频 | 国产乱妇无码大片在线观看 | 亚洲五十路 | 视频在线观看一区二区 | 日韩福利一区二区三区 | 胖女人毛片 | 国产精品视频一区在线观看 | 在线免费观看a视频 | 国产精品久久久久久久久久久久午夜片 | 97免费在线视频 | 亚洲av永久无码精品一百度影院 | 女人脱了内裤趴开腿让男躁 | 欧美色图一区二区三区 | 久久精品在线免费观看 | 精人妻无码一区二区三区 | 国产黄色激情视频 | 国产成人无码精品久久久性色 | 亚洲男人影院 | 日韩一级在线观看视频 | 久久久久国产精品 | 91视频亚洲 | 超碰在 | 日韩欧美高清dvd碟片 | 密桃av在线 | 日日夜夜人人 | 爱爱视频一区二区 | 在线播放日韩 | 亚洲高清在线播放 | 久久久无码一区二区三区 | 欧美一级一片 | 91久久精品一区二区三区 | 在线中文字幕一区 | 麻豆91在线 | 久久久久久亚洲av毛片大全 | 精品人妻一区二区三区免费看 | 中文字幕亚洲专区 | 中文字幕在线观看视频一区 | 国产第1页| www.国产色| 欧美视频一区二区三区四区 | 精品视频三区 | 国产传媒在线播放 | 亚洲精品久久一区二区三区777 |