【问题标题】:C# Decoding long Base64 StringsC# 解码长 Base64 字符串
【发布时间】:2017-11-14 06:26:40
【问题描述】:

我正在使用 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: "Invalid Length for base64 Char array"

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/ 连接单词时选择 _ 或大写更改(例如:Set_Jwt 或 LogIn),并保持一致(例如:SetJwt)。 2/ 变量名称:_ 通常表示私有字段(不是参数,也不是局部变量)。 3/ 对方法使用 PascalCasing(例如:decode_jwt vs DecodeJwt)。更多建议,欢迎阅读C# coding conventions
  • @AlG 没什么。如果我在该行之前和之后放置一个 Debug.Log(),则只有之前。真的,没什么
  • @Icepickle 谢谢,我会继续阅读的
  • 您是否已经通过设置断点在方法内部进行了调试?我可以想象 OnMessageHandler 中的错误在某处没有被正确捕获,但你应该能够逐步完成它

标签: c# json.net jwt


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多