如何使用jose-jwt在jwt中添加声明

时间:2016-07-28 09:33:34

标签: c# json jwt

我正在使用jose jwt库来创建jwt令牌,我不知道如何在有效载荷中使用声明标记。我想存储用户名和一些与之相关的其他数据。下面是我用来生成代码的代码

        byte[] secretKey = Base64UrlDecode("-----BEGIN PRIVATE KEY-----");
        DateTime issued = DateTime.Now;
        DateTime expire = DateTime.Now.AddHours(10);

        var payload = new Dictionary<string, object>()
        {
            {"iss", "service email"},
            {"aud", "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit"},
            {"sub", "service email"},
            {"iat", ToUnixTime(issued).ToString()},
            {"exp", ToUnixTime(expire).ToString()}
        };

        string token = JWT.Encode(payload, secretKey, JwsAlgorithm.HS256);

        return token; 

1 个答案:

答案 0 :(得分:2)

JWT规范讨论了三种类型的声明:Registered, Public and Private.

<强>注册

The usual ones,例如isssubexp等。

公开声明

IANA JWT Claims Registry用于指定应公开使用以在服务之间标准化它们的声明。这些包含许多有用的内容,例如nameemailaddress等。

私人声明

如果您只在自己的应用程序中或在已知应用程序之间使用令牌,则可以实际添加所需的任何声明。

最好避免将IANA JWT Claims Registry的声明用于其他目的(即不要使用name存储用户的用户名)。

因此,在您的情况下,您的代码可能就像这样添加用户名(来自IANA注册管理机构的声明)

byte[] secretKey = Base64UrlDecode("-----BEGIN PRIVATE KEY-----");
DateTime issued = DateTime.Now;
DateTime expire = DateTime.Now.AddHours(10);

var payload = new Dictionary<string, object>()
{
    {"iss", "service email"},
    {"aud", "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit"},
    {"sub", "service email"},
    {"iat", ToUnixTime(issued).ToString()},
    {"exp", ToUnixTime(expire).ToString()},
    {"preferred_username", "MyAwesomeUsername"}        
};

string token = JWT.Encode(payload, secretKey, JwsAlgorithm.HS256);

return token;

虽然如果仅供内部使用,我可能会自己只使用usernameusr

要记住的另一件事(而且很多人都错了)是JWT并没有加密任何东西。内容是base64编码的,但任何掌握你的令牌的人都可以读取其中的所有内容。因此,如果用户可以看到它们的可能性很小,请确保不要对其敏感。