如何正确提供传统的Firebase JWT令牌作为" auth"到REST API?

时间:2016-06-05 08:50:47

标签: rest authentication firebase jwt

我想将Firebase REST API与自定义数据库身份验证令牌一起使用。 我从console.firebase.google.com的项目设置中获取了数据库密钥。根据该页面,此秘密可用于使用旧版Firebase令牌生成器创建自定义数据库身份验证令牌。" 所以我在https://www.firebase.com/docs/rest/guide/user-auth.html下做了他们所说的"在没有助手库的情况下生成令牌"在https://jwt.io/introduction/

header='{"alg":"HS256","typ":"JWT"}'
claims='{"v":0,"iat":1465114351,"exp":1465117951,"d":{"uid":"test"}}'
b64header=`echo -n $header | base64 -w 0`
b64claims=`echo -n $claims | base64 -w 0`
echo -n "$b64header.$b64claims."
echo -n "$b64header.$b64claims" | openssl sha256 -binary -hmac $SECRET | base64 -w 0

以这种方式生成的令牌可以正常工作( 200 OK ):

curl -v -o output.json -D output.txt "$URL/test.json?auth=$TOKEN"

但是当我改变JWT声明中的时间戳时,

claims='{"v":0,"iat":1465114158,"exp":1465117758,"d":{"uid":"test"}}'

我收到 400 Bad Request {{#34;错误" :" 无法验证MAC。"}而是。

我注意到了:

  1. 在" good" JWT没有+标志
  2. 在"坏" JWT签名部分中有一个+号。
  3. 但即使我对" auth"进行了网址编码。参数,

    curl -v -o output.json -D output.txt -G --data-urlencode "auth=$TOKEN" "$URL/test.json"
    

    它仍然以同样的方式失败。

    我做错了什么?

1 个答案:

答案 0 :(得分:0)

您的base64编码错误,您需要使用base64url,/使用+_代替-。填充也被剥离。结果与最终对整个字符串进行url编码非常不同。

header='{"alg":"HS256","typ":"JWT"}'
claims='{"v":0,"iat":1465114158,"exp":1465117758,"d":{"uid":"test"}}'
b64header=`echo -n $header | base64 -w 0 | tr -d '=' | tr '/+' '_-'`
b64claims=`echo -n $claims | base64 -w 0 | tr -d '=' | tr '/+' '_-'`
echo -n "$b64header.$b64claims."
echo -n "$b64header.$b64claims" | openssl sha256 -binary -hmac $SECRET | base64 -w 0 | tr -d '=' | tr '/+' '_-'

JWT spec定义编码如下:

  

使用URL和文件名安全字符集的Base64编码         在RFC 4648的第5节中定义,所有尾随' ='         省略字符(如第3.2节所允许)并且没有         包含任何换行符,空格或其他附加内容         字符。