解码 Auth0 令牌时遇到问题

Having trouble decoding an Auth0 token

我有一个 JWT,当我在 Angular 应用程序中通过 Lock 进行身份验证时,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 with my Rails application which tries to decode the token 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 Exception: Signature verification raised

我想这是有道理的。如果我可以在不使用密钥的情况下很好地解码令牌,那么我想我的令牌一定不是在考虑了我的 Auth0 Client Secret 的情况下创建的。不过我不知道这是事实。

所以我的问题是:Knock 似乎需要使用我的 Auth0 Client Secret 解码令牌,但使用我的 Client Secret 解码令牌不起作用。我怎样才能让它工作?

编辑:

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

这是我的客户 ID:j3JtzcbsiMI2GBdFvFoqEN38qKSVb6CE

这是我的客户机密:development_secret

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

对于新创建的应用程序或显式更新为不再使用 Base64url 编码模式的应用程序,Auth0 仪表板上显示的客户端密码不再使用 Base64 编码,因此您不应在使用前尝试对其进行解码.


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

  1. 访问jwt.io
  2. 粘贴你的令牌
  3. 更新验证签名部分以包含您的 development_secret 并选中秘密为 base64 编码的选项

则签名验证正确。这意味着令牌生成是正确的,问题在于我们如何在 Ruby 中验证它。您需要检查用于验证的 Rails API 是否采用任何编码并以预期格式传递密码。


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