亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Java安全驗(yàn)證之JWT實(shí)踐

Codeing_ls / 940人閱讀

摘要:有效載荷的第二部分是有效載荷,其中包含聲明。這些是自定義聲明,用于在同意使用這些聲明的各方之間共享信息,這些信息既沒有注冊(cè)也沒有公開聲明。由于令牌是憑證,因此必須非常小心以防止出現(xiàn)安全問題。授予授權(quán)后,授權(quán)服務(wù)器會(huì)向應(yīng)用程序返回。

先給出JWT的官方文檔

什么是JWT?

JSON Web Token(JWT)是一個(gè)開放標(biāo)準(zhǔn)(RFC 7519),它定義了一種緊湊且獨(dú)立的方式,用于在各方之間作為JSON對(duì)象安全地傳輸信息。

什么時(shí)候應(yīng)該使用JWT?

授權(quán):這是使用JWT的最常見方式。一旦用戶登錄,每個(gè)后續(xù)請(qǐng)求將包括JWT,允許用戶訪問該令牌允許的路由,服務(wù)和資源。Single Sign On是一種現(xiàn)在廣泛使用JWT的功能,因?yàn)樗拈_銷很小,并且能夠在不同的域中輕松使用。

信息交換:JSON Web令牌是在各方之間安全傳輸信息的好方法。因?yàn)镴WT可以通過簽名(使用公鑰/私鑰對(duì) )核實(shí)發(fā)送人的身份。此外,由于使用標(biāo)頭和有效負(fù)載計(jì)算簽名,您還可以驗(yàn)證內(nèi)容是否未被篡改。

JWT令牌結(jié)構(gòu)

JWT令牌由Header、Payload、Signature三部分組成,每部分之間用點(diǎn)號(hào)分隔,通常的形式為xxxxx.yyyyy.zzzzz,下面分別對(duì)每部分做詳細(xì)介紹。

Header(頭)

Header通常由兩部分組成:令牌的類型,即JWT,以及使用的簽名算法,例如HMAC SHA256或RSA。

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

這個(gè)JSON被編碼為Base64Url,形成JWT的第一部分。

Payload(有效載荷)

JWT的第二部分是有效載荷,其中包含聲明( claims)。聲明包含實(shí)體(通常是用戶)和其他自定義信息。聲明有三種類型:registered, publicprivate claims 。

registered claims :這是一組預(yù)定義聲明,不是強(qiáng)制性的,但建議使用,以提供一組有用的,可互操作的聲明。其中包括: iss(發(fā)行人), exp(到期時(shí)間),sub(主題), aud(受眾)。

請(qǐng)注意:聲明名稱只有三個(gè)字符,因?yàn)镴WT需要保持簡潔。

public claims:這些可以由使用JWT的人隨意定義。但為避免沖突,應(yīng)在 IANA JSON Web Token Register中定義它們,或者將其定義為包含防沖突命名空間的URI。

private claims:這些是自定義聲明,用于在同意使用這些聲明的各方之間共享信息,這些信息既沒有注冊(cè)也沒有公開聲明。

Payload經(jīng)過Base64Url編碼,形成JWT的第二部分。

請(qǐng)注意:對(duì)于JWT令牌,雖然可以防止被篡改,但任何人都可以讀取。除非加密,否則不要將秘密信息放在JWT的有效載荷或頭元素中。

Signature(簽名)

Signature由Base64Url加密的Header、Payload再使用Header中指定的算法加密之后再和secret組成。

如果要使用HMACSHA256算法,將按以下方式創(chuàng)建簽名:

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

Signature用于驗(yàn)證消息在此過程中未被更改,并且,在使用私鑰簽名的令牌的情況下,它還可以驗(yàn)證JWT的發(fā)件人的身份。

總結(jié)

最后將JWT的三部分由點(diǎn)號(hào)分隔作為一個(gè)字符串,其可以在HTML和HTTP環(huán)境中輕松傳遞,并且比基于XML的標(biāo)準(zhǔn)的Token(如SAML)更加簡潔。

JWT工作流程

在身份驗(yàn)證中,當(dāng)用戶使用其憑據(jù)成功登錄時(shí),將返回JSON Web Token。由于令牌是憑證,因此必須非常小心以防止出現(xiàn)安全問題。一般情況下,您不應(yīng)該將令牌保留的時(shí)間超過要求。

每當(dāng)用戶想要訪問受保護(hù)的路由或資源時(shí),用戶發(fā)送JWT到相應(yīng)的地址,通常在Authorization標(biāo)頭中。請(qǐng)求頭的的內(nèi)容應(yīng)如下所示:

Authorization: Bearer 

在某些情況下,這可以是無狀態(tài)授權(quán)機(jī)制。服務(wù)器的受保護(hù)路由將檢查Authorization標(biāo)頭中的有效JWT ,如果存在,則允許用戶訪問受保護(hù)資源。如果JWT包含必要的數(shù)據(jù),則可以減少查詢數(shù)據(jù)庫以進(jìn)行某些操作的需要,盡管可能并非總是如此。

如果在標(biāo)Authorization頭中發(fā)送Token,則跨域資源共享(CORS)將不會(huì)成為問題,因?yàn)樗皇褂胏ookie。

下圖顯示了如何獲取JWT并用于訪問API或資源:

應(yīng)用程序或客戶端向授權(quán)服務(wù)器發(fā)送授權(quán)請(qǐng)求。

授予授權(quán)后,授權(quán)服務(wù)器會(huì)向應(yīng)用程序返回JWT。

應(yīng)用程序使用JWT來訪問受保護(hù)資源(如API)。

請(qǐng)注意:使用JWT時(shí),Token中包含的所有信息都會(huì)向用戶或其他方公開,即使他們無法更改。所以您不應(yīng)該在令牌中放置秘密信息。

JWT中的JAVA實(shí)現(xiàn)

JWT的java實(shí)現(xiàn)非常多,詳細(xì)何以查看官方文檔。

其中常用的有com.auth0.java-jwt和io.jsonwebtoken.jjwt

這里我采用 jjwt 作為演示,因?yàn)樗腉ithub中的Star比較多。

Maven依賴

    io.jsonwebtoken
    jjwt-api
    0.10.5


    io.jsonwebtoken
    jjwt-impl
    0.10.5
    runtime


    io.jsonwebtoken
    jjwt-jackson
    0.10.5
    runtime

創(chuàng)建Token
    //Sample method to construct a JWT
    public static String createJWT(String id, String issuer, String subject, long ttlMillis) {

        //The JWT signature algorithm we will be using to sign the token
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);

        //We will sign our JWT with our ApiKey secret
        byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary( APP_ID + APP_SECRET);
        Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());

        //Let"s set the JWT Claims
        JwtBuilder builder = Jwts.builder().setId(id)
                .setIssuedAt(now)
                .setSubject(subject)
                .setIssuer(issuer)
                .signWith(signatureAlgorithm, signingKey);

        //if it has been specified, let"s add the expiration
        if (ttlMillis >= 0) {
            long expMillis = nowMillis + ttlMillis;
            Date exp = new Date(expMillis);
            builder.setExpiration(exp);
        }

        //Builds the JWT and serializes it to a compact, URL-safe string
        return builder.compact();

    }
解析Token
     //Sample method to validate and read the JWT
    public static Claims parseJWT(String jwt) {

        //This line will throw an exception if it is not a signed JWS (as expected)
        Claims claims = Jwts.parser()
                .setSigningKey(DatatypeConverter.parseBase64Binary(APP_ID + APP_SECRET))
                .parseClaimsJws(jwt).getBody();
//        System.out.println("ID: " + claims.getId());
//        System.out.println("Subject: " + claims.getSubject());
//        System.out.println("Issuer: " + claims.getIssuer());
//        System.out.println("Expiration: " + claims.getExpiration());
        return claims;
    }

其中APP_IDAPP_SECRET可以自定義為你想要的任何值,但是不能過于簡單。

你會(huì)發(fā)現(xiàn)我們?cè)偈褂玫臅r(shí)候沒有設(shè)置Header的值,因?yàn)閖jwt為了我們使用方便會(huì)根據(jù)使用的簽名算法或壓縮算法自動(dòng)設(shè)置它們。

使用
@Test
public void createJWT(){

    String jwt = JWTUtil.createJWT("1", "111", "admin", JWTUtil.DAY_TTL);
    System.out.println(jwt);
}

@Test
public void parseJWT(){
            Claims claims = JWTUtil.parseJWT("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxIiwiaWF0IjoxNTQ4Mjk1NjQ0LCJzdWIiOiJhZG1pbiIsImlzcyI6IjExMSIsImV4cCI6MTU0ODMzODg0NH0.WRkyeG3MfVor02Ya4732fgGydXhtkkKSDwbxOIZ2i9Y");
    System.out.println(claims);
}

如果想使用jjwt更復(fù)雜的功能或者其他的Java實(shí)現(xiàn)可以去他們相應(yīng)的Github上學(xué)習(xí)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/73195.html

相關(guān)文章

  • Spring Security

    摘要:框架具有輕便,開源的優(yōu)點(diǎn),所以本譯見構(gòu)建用戶管理微服務(wù)五使用令牌和來實(shí)現(xiàn)身份驗(yàn)證往期譯見系列文章在賬號(hào)分享中持續(xù)連載,敬請(qǐng)查看在往期譯見系列的文章中,我們已經(jīng)建立了業(yè)務(wù)邏輯數(shù)據(jù)訪問層和前端控制器但是忽略了對(duì)身份進(jìn)行驗(yàn)證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護(hù)REST API 重拾后端之Spring Boot(一):REST API的搭建...

    keelii 評(píng)論0 收藏0
  • 論微服務(wù)安全

    摘要:微服務(wù)能夠?yàn)閼?yīng)用程序設(shè)計(jì)提供一種更具針對(duì)性范圍性與模塊性的實(shí)現(xiàn)方案。安全微服務(wù)部署模式可謂多種多樣但其中使用最為廣泛的當(dāng)數(shù)每主機(jī)服務(wù)模式。在微服務(wù)環(huán)境下,安全性往往成為最大的挑戰(zhàn)。不同微服務(wù)之間可通過多種方式建立受信關(guān)系。 每個(gè)人都在討論微服務(wù),每個(gè)人也都希望能夠?qū)崿F(xiàn)微服務(wù)架構(gòu),而微服務(wù)安全也日漸成為大家關(guān)注的重要問題。今天小數(shù)與大家分享的文章,就從應(yīng)用層面深入探討了應(yīng)對(duì)微服務(wù)安全挑戰(zhàn)...

    plokmju88 評(píng)論0 收藏0
  • Java經(jīng)典

    摘要:請(qǐng)注意,我們?cè)诹牧膯卧獪y(cè)試遇到問題多思考多查閱多驗(yàn)證,方能有所得,再勤快點(diǎn)樂于分享,才能寫出好文章。單元測(cè)試是指對(duì)軟件中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證。 JAVA容器-自問自答學(xué)HashMap 這次我和大家一起學(xué)習(xí)HashMap,HashMap我們?cè)诠ぷ髦薪?jīng)常會(huì)使用,而且面試中也很頻繁會(huì)問到,因?yàn)樗锩嫣N(yùn)含著很多知識(shí)點(diǎn),可以很好的考察個(gè)人基礎(chǔ)。但一個(gè)這么重要的東西,我為什么沒有在一開始...

    xcold 評(píng)論0 收藏0
  • 理解JWT(JSON Web Token)認(rèn)證及python實(shí)踐

    摘要:認(rèn)證服務(wù)器,即服務(wù)提供商專門用來處理認(rèn)證的服務(wù)器。它與認(rèn)證服務(wù)器,可以是同一臺(tái)服務(wù)器,也可以是不同的服務(wù)器??蛻舳耸褂蒙弦徊将@得的授權(quán),向認(rèn)證服務(wù)器申請(qǐng)令牌。認(rèn)證服務(wù)器對(duì)客戶端進(jìn)行認(rèn)證以后,確認(rèn)無誤,同意發(fā)放令牌。 最近想做個(gè)小程序,需要用到授權(quán)認(rèn)證流程。以前項(xiàng)目都是用的 OAuth2 認(rèn)證,但是Sanic 使用OAuth2 不太方便,就想試一下 JWT 的認(rèn)證方式。這一篇主要內(nèi)容是 ...

    BigTomato 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<