C#解码长Base64字符串

时间:2017-11-13 12:56:28

标签: c# json.net jwt

我正在使用Unity Free + NodeJS与我的队友编写一个小项目。

服务器的NodeJs和客户端的Unity。

如果您输入了有效的登录数据,服务器将使用njwt返回一个jwt,可以使用各种在线工具和c#进行解码。

但是,这行:byte[] _dec = Convert.FromBase64String(part);不会返回错误,但也会阻止执行更多代码。我不知道为什么。

以下是更多样本,以了解正在发生的事情。

LoginMenu.cs

ws.OnMessage += (sender, e) => {
    JObject res = JObject.Parse(e.Data);

    switch ((string)res["type"])
    {
        // If we get a token from the server
        // login was successful
        case "jwt":
            Debug.Log("Res was JWT");
            UserAccountManager.instance.LogIn((string)res["jwt"]);
            Debug.LogWarning("FINISHED");
            break;
        // Only 1 case for now
    }
};

UserAccountManager.cs

public static UserAccountManager instance;
void Awake() {
    if (instance != null)
    {
        Destroy(gameObject);
        return;
    }

    instance = this;
    DontDestroyOnLoad(this);
}

void Set_Jwt(string _jwt)
{
    Jwt = _jwt;
    Jwt_data = decode_jwt(_jwt);

    playerUsername = (string)Jwt_data["username"];
    Debug.Log("Jwt set");
    Debug.LogWarning(playerUsername);
}

private JObject decode_jwt(string _jwt)
{
    string[] splitted = _jwt.Split('.');
    var part = splitted[1];
    // Code only runs until here
    byte[] _dec = Convert.FromBase64String(part);
    string decodedjwt = Encoding.UTF8.GetString(_dec);

    return JObject.Parse(decodedjwt);
}

public void LogIn(string _jwt) {
    Debug.LogWarning("LogIn called");
    Set_Jwt(_jwt);

    isLoggedIn = true;
    Debug.Log("Trying to load " + loggedInSceneName);
    SceneManager.LoadScene(loggedInSceneName);
}

编辑:

我在新的C#ConsoleApplication中编写了几乎相同的代码,它抛出了一个System.FormatException:“base64 Char数组的长度无效”

static void Main(string[] args)
    {
        string jwt = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpc3MiOiJncy5hd2Vzb21lc3R1ZmYuYXQiLCJpYXQiOjE1MTA1OTkyNzQsImV4cCI6MTUxMDYwMjg3MywidWlkIjoiMTY1ZWMxZjAtYzhhNC0xMWU3LTk2ZWQtYzNjNGQ4NTRmM2I4IiwiYXV0aCI6dHJ1ZSwidXNlcm5hbWUiOiJnYWJlbml6aGVyZSIsImlwIjoiMTk0LjIwOC4xMzguMTI4IiwianRpIjoiNjg4NWM0N2YtMjk3NS00N2MyLTgzYTktN2RmMjhmODE3NDljIn0.tRhx3mUbGBxoGFFr0t6dnPMrdlUT4UKJKLBY_9IiJdBePWp1S10Z91875z6OFK92ymACRR_wO3_1_h6fKXAPTQ";
        string[] splitted = jwt.Split('.');
        var part = splitted[1];

        byte[] arr = Convert.FromBase64String(part);
        string res = Encoding.UTF8.GetString(arr);
        Console.WriteLine(res);

        Console.Read();
    }

我现在该怎么办?

1 个答案:

答案 0 :(得分:0)

我终于修好了。这是一个非常小的错误。整个令牌是正确的b64,但是当我分开中间部分时,它可以被4分割。我添加了一个=然后它解码得很好。