2016-11-21 29 views
2

我有一個JWT是Auth0提供的我,當我在一個角度應用程序通過鎖定認證。解碼Auth0令牌時遇到

我複製並粘貼此令牌到名爲token一個Ruby變量。

這裏是我得到的Rails的控制檯上,當我嘗試令牌解碼:

> JWT.decode token, nil, false 
=> [{"iss"=>"https://benfranklinlabs.auth0.com/", "sub"=>"auth0|58306f91c08814e01015f434", "aud"=>"8NWWMzcPNXEvxogqwRar18hJuYAvsrG0", "exp"=>1479766470, "iat"=>1479730470}, {"typ"=>"JWT", "alg"=>"HS256"}] 

這是好的,但我認爲在解碼過程中應該需要我Auth0客戶端密鑰。我使用Knock與試圖令牌like this解碼我的Rails應用程序:

JWT.decode token, decode_key, true, options.merge(verify_options) 

而且decode_key等於這樣的:

JWT.base64url_decode Rails.application.secrets.auth0_client_secret 

而這種嘗試失敗。我得到以下錯誤:

*** JWT::VerificationError Exception: Signature verification raised

我想這是有道理的。如果我可以在沒有使用密鑰的情況下正確解碼令牌,那麼我想我的令牌一定不是用我的Auth0 Client Secret創建的。但我並不知道這是事實。

所以我的問題是這樣的:山寨版似乎需要用我的Auth0端密碼令牌進行解碼,但使用我的客戶端密鑰不起作用令牌解碼。我怎樣才能使它工作?

編輯:

這裏是我的令牌:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2JlbmZyYW5rbGlubGFicy5hdXRoMC5jb20vIiwic3ViIjoiYXV0aDB8NTgzMDZmOTFjMDg4MTRlMDEwMTVmNDM0IiwiYXVkIjoiajNKdHpjYnNpTUkyR0JkRnZGb3FFTjM4cUtTVmI2Q0UiLCJleHAiOjE0Nzk3NzE4ODMsImlhdCI6MTQ3OTczNTg4M30.MuUbdC7TLBcteKCry-sioeZVStI9TZ6TdsP5WG_6K08

這裏是我的客戶ID:j3JtzcbsiMI2GBdFvFoqEN38qKSVb6CE

這裏是我的客戶祕密:development_secret

+0

啊,我需要澄清。我剛剛瞭解到'JWT.decode token'中的'true',decode_key,true'意味着'verify'。如果我將該參數設置爲「false」,則無論使用密鑰還是不使用密鑰。如果我將該參數設置爲「true」,則無論是否使用密鑰都會失敗。 –

回答

1

Auth0 最近 (不完全正確, 接下來描述的更改僅在12月生效r 6th 2016)切換客戶端應用程序祕密的生成和編碼方式。最初,客戶端密鑰將生成並顯示爲Base64url編碼的字符串,這意味着在使用它之前必須將其解碼。

對於新創建的應用程序或顯式更新爲不再使用Base64url編碼模式的應用程序,Auth0儀表板上顯示的客戶機密鑰不再使用Base64編碼,因此在使用它之前不應嘗試對其進行解碼。


使用所提供的樣品令牌和祕密,如果您按照下列步驟操作:

  1. 訪問jwt.io
  2. 粘貼您的令牌
  3. 更新驗證簽名部分,包括您的development_secret並檢查選項密碼是base64編碼

th簽名已被正確驗證。這意味着令牌生成是正確的,問題在於我們如何在Ruby中驗證它。您需要檢查用於驗證的Rails API是否採用了任何編碼,並以預期格式傳遞祕密。從OP


注:最終什麼固定的,對我來說是手動使用Base64編碼字符串(JWT.base64url_encode 'my_arbitrary_string')並粘貼在我的Auth0設置所得到的值到客戶端密鑰。

+0

感謝您的信息。當嘗試使用未解碼的Client Secret解碼令牌時,我仍然會收到'JWT :: VerificationError:引發的簽名驗證'。 –

+0

但要清楚的是,當我使用我的Auth0 Client Secret手動創建自己的令牌,然後嘗試解碼令牌時,我可以很好地解碼令牌。這只是Auth0創建的令牌,似乎不起作用。 –

+0

確認您複製了整個密碼並且沒有包含任何尾隨空格。此外,您可以設置一個臨時祕密,生成一個令牌並重置密鑰。這樣做後,包括令牌和臨時祕密在你的問題,這將使外部故障排除更容易。還要確保令牌包含敏感信息。 –