解码Auth0令牌时遇到问题

时间:2016-11-21 13:21:09

标签: ruby jwt auth0

当我通过Angular应用程序中的Lock进行身份验证时,我有一个Auth0为我提供的JWT。

我将此标记复制并粘贴到名为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客户端的客户端密钥。我在我的Rails应用程序中使用Knock,它尝试解码令牌like this

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

decode_key等于:

JWT.base64url_decode Rails.application.secrets.auth0_client_secret

这次尝试失败了。我收到以下错误:

  

*** JWT :: VerificationError异常:提出签名验证

我想这是有道理的。如果我可以在不使用密钥的情况下解码令牌就好了,那么我想我的令牌一定不能用我的Auth0客户端密码来创建。但是我不知道这是事实。

所以我的问题是:Knock似乎需要使用我的Auth0客户端密钥解码令牌,但使用我的客户端密钥解码令牌不起作用。我怎样才能让它发挥作用?

修改

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

这是我的客户ID:j3JtzcbsiMI2GBdFvFoqEN38qKSVb6CE

这是我的客户秘密:development_secret

1 个答案:

答案 0 :(得分:1)

Auth0 最近(不完全正确,接下来描述的更改将仅在2016年12月6日生效)切换生成和编码客户端应用程序机密的方式。最初,客户端密钥将生成并显示为Base64url编码的字符串,这意味着您必须在使用它之前对其进行解码。

对于新创建的应用程序或明确更新为不再使用Base64url编码模式的应用程序,Auth0 Dashboard上显示的客户端密钥不再是Base64编码的,因此在使用之前不应尝试对其进行解码。 / p>

如果您按照以下步骤使用提供的示例令牌和密码:

  1. 访问jwt.io
  2. 粘贴您的令牌
  3. 更新验证签名部分以包含您的development_secret并检查秘密是base64编码的选项
  4. 然后正确验证签名。这意味着令牌生成是正确的,问题在于我们如何在Ruby中验证它。您需要检查用于验证的Rails API是否采用任何编码并以预期格式传递密码。

    来自OP的注意事项:最终为我修复的是手动base64编码字符串(JWT.base64url_encode 'my_arbitrary_string')并将结果值粘贴到我的Auth0设置中的Client Secret。