2016-10-01 74 views
1

我正在開發j2ee認證/授權系統。我想使用JWT令牌,使用JWS對有效負載進行簽名並使用JWE對其進行加密。如何使用JWE生成JWT/JWS

I found a decent tutorial from bitbuckets jose4j

這個例子顯示了它們產生JWK使用EllipticCurveJsonWebKey。我不明白這可以如何用於認證/授權。您不需要將密鑰存儲在屬性文件或JNDI條目中,然後使用該密鑰簽署/加密JWT?通過這種方式,當我收到一個http請求時,我可以使用相同的密鑰來驗證JWT。我發現的大部分教程都使用了一個類似的例子。

這怎麼能用相同的服務器端密鑰完成?

+0

您是否試圖在您的實現中兼容OAuth2.0/OIDC,還是僅僅使用JWT(與JWS和JWE)保持用戶會話? – ingenious

+0

@ingenious我希望爲用戶提供與Google等OAuth2提供商一起登錄的選項,但現在主要目標是保持用戶會話。 –

回答

1

第一件事是第一件事 - 去結賬這篇關於authentication with OAuth2.0的文章。根據您的背景,您可能需要閱讀OAuth & OpenID Connect自己。

但是,如果您只是希望將您的服務器端會話保存在經過簽名和加密的JWT中,那也是可以的。在您的智威湯遜,你需要一對夫婦的說法,至少是一些說明:

  • 在會話創建時(IAT)
  • 多久是誰創建的會話仍然有效(EXP)
  • 會議期間,那是你的身份驗證系統(ISS)
  • 誰是這屆認證,這是你的用戶ID或東西(子)

之後,您可以添加一個觀衆,最好一個隨機數。但是,如果你正在加密所有你可能會在沒有隨機數的情況下進行加密。

the OIDC core spec中提及所提出的權利要求通常是一個好主意。

這裏是棘手的地方。你基本上有兩個選擇 - 你可以爲服務器端生成一個字符串,這對所有應用程序都是完全不透明的,併成爲會話。然後提供一個令牌自檢端點,客戶端可以將此字符串發送到並檢索上述索賠(以及您決定映射到會話的所有附加索賠)。這也意味着您將需要一些存儲空間,這些不透明的字符串與用戶聲明一起保存。

另外,你可以簽署(並可以加密)整個束,並通過電線發送。只有當您需要註銷用戶時,您才需要使用令牌的ID。使用私鑰完成令牌簽名,只有您的應用程序知道該私鑰,並且任何客戶端的驗證都是通過公鑰完成的,您的應用程序可以共享這些公鑰,例如,通過提供JWKs端點。

根據你在JWT中的聲明,你可能並不需要加密它......如果你這樣做,那麼是的,你還必須管理加密密鑰。

同時檢查this article可以很好地瞭解令牌認證中的內容。

+0

就在我認爲自己對這件事情有把握的時候..你一起走了,把它吹起來了。謝謝你提供的信息,這非常有幫助。 –