当我通过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
答案 0 :(得分:1)
Auth0 最近(不完全正确,接下来描述的更改将仅在2016年12月6日生效)切换生成和编码客户端应用程序机密的方式。最初,客户端密钥将生成并显示为Base64url编码的字符串,这意味着您必须在使用它之前对其进行解码。
对于新创建的应用程序或明确更新为不再使用Base64url编码模式的应用程序,Auth0 Dashboard上显示的客户端密钥不再是Base64编码的,因此在使用之前不应尝试对其进行解码。 / p>
如果您按照以下步骤使用提供的示例令牌和密码:
development_secret
并检查秘密是base64编码的选项然后正确验证签名。这意味着令牌生成是正确的,问题在于我们如何在Ruby中验证它。您需要检查用于验证的Rails API是否采用任何编码并以预期格式传递密码。
来自OP的注意事项:最终为我修复的是手动base64编码字符串(JWT.base64url_encode 'my_arbitrary_string'
)并将结果值粘贴到我的Auth0设置中的Client Secret。