首頁>
5
回覆列表
  • 1 # 1234567啊額

    . Token的原理

    1)將荷載payload,以及Header信息進行Base64加密,形成密文payload密文,header密文。

    2)將形成的密文用句號鏈接起來,用服務端秘鑰進行HS256加密,生成簽名.

    3)將前面的兩個密文後面用句號鏈接簽名形成最終的token返回給服務端

    說明:

    (1)用戶請求時攜帶此token(分為三部分,header密文,payload密文,簽名)到服務端,服務端解析第一部分(header密文),用Base64解密,可以知道用了什麼算法進行簽名,此處解析發現是HS256。

    (2)服務端使用原來的秘鑰與密文(header密文+"."+payload密文)同樣進行HS256運算,然後用生成的簽名與token攜帶的簽名進行對比,若一致說明token合法,不一致說明原文被修改。

    (3)判斷是否過期,客戶端通過用Base64解密第二部分(payload密文),可以知道荷載中授權時間,以及有效期。通過這個與當前時間對比發現token是否過期。

  • 2 # 都豆兜

    首先把變量聲明語句的規則,用形式化的方法表達一下。它的左邊是一個非終結符(Non-terminal)。右邊是它的產生式(Production Rule)。在語法解析的過程中,左邊會被右邊替代。如果替代之後還有非終結符,那麼繼續這個替代過程,直到最後全部都是終結符(Terminal),也就是 Token。只有終結符才可以成為 AST 的葉子節點。這個過程,也叫做推導(Derivation)過程。

    intDeclaration : Int Identifier (’=’ additiveExpression)?;

    上面的文法翻譯成程序語句,代碼如下

    SimpleASTNode node = null;

    Token token = tokens.peek(); // 預讀

    if (token != null && token.getType() == TokenType.Int) { // 匹配 Int

    token = tokens.read(); // 消耗掉 int

    if (tokens.peek().getType() == TokenType.Identifier) { // 匹配標識符

    token = tokens.read(); // 消耗掉標識符

    // 創建當前節點,並把變量名記到 AST 節點的文本值中,

    // 這裡新建一個變量子節點也是可以的

    node = new SimpleASTNode(ASTNodeType.IntDeclaration, token.getText());

    token = tokens.peek(); // 預讀

    if (token != null && token.getType() == TokenType.Assignment) {

    tokens.read(); // 消耗掉等號

    SimpleASTNode child = additive(tokens); // 匹配一個表達式

    if (child == null) {

    throw new Exception("inval