Unity中的OAuth2身份验证和操作

Ist*_*van 3 c# oauth unity-game-engine

我需要在Unity中为Windows Mobile应用程序实现OAuth2身份验证和一些操作.我已经设法使其作为控制台应用程序(使用.NET 4.0及更高版本)工作,但是,Unity仅支持.NET 3.5,因此简单地复制代码不起作用.有没有办法让它在Unity中运行?这是我的验证码:

private static async Task<string> GetAccessToken()
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("https://someurl.com");
            var content = new FormUrlEncodedContent(new[]
            {
                new KeyValuePair<string, string>("grant_type", "client_credentials"),
                new KeyValuePair<string, string>("client_id", "login-secret"),
                new KeyValuePair<string, string>("client_secret", "secretpassword")
            });
            var result = await client.PostAsync("/oauth/token", content);
            string resultContent = await result.Content.ReadAsStringAsync();
            var json = JObject.Parse(resultContent);
            return json["access_token"].ToString();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是我的OAuth2功能之一:

private static async Task<string> GetMeasurements(string id, DateTime from, DateTime to)
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("https://someurl.com");
            var content = new FormUrlEncodedContent(new[]
            {
                new KeyValuePair<string, string>("MeasurePoints", id),
                new KeyValuePair<string, string>("Sampling", "Auto"),
                new KeyValuePair<string, string>("From", from.ToString("yyyy-MM-ddTHH:mm:ssZ")),
                new KeyValuePair<string, string>("To", to.ToString("yyyy-MM-ddTHH:mm:ssZ"))
            });
            client.DefaultRequestHeaders.Add("Authorization", "Bearer " + GetAccessToken().Result);
            var result = await client.PostAsync("/api/v2/Measurements", content);
            string resultContent = await result.Content.ReadAsStringAsync();
            var rootArray = JArray.Parse(resultContent);
            string measurements = "";
            foreach (JObject item in rootArray)
            {
                measurements = item.GetValue("Measurements").ToString();
            }

            return measurements;
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果您有任何建议,我将永远感激.谢谢!

Pro*_*mer 9

翻译成旧的.NET版本并不难.您可以使用Unity WWWUnityWebRequestAPI.他们中的任何人都应该这样做.

1 .Replace HttpClientUnityWebRequest.

2 .Replace KeyValuePair,与Dictionary.

3 .Replace DefaultRequestHeadersSetRequestHeader.

4 .Replace client.PostAsyncUnityWebRequest.Send

5.对于Json,使用unity的JsonUtility

6.对于GetMeasurements函数中的Json数组,请使用JsonHelper此帖子中的类.

而已.我能够快速移植.没有测试它,但它能够编译,应该让你开始.

GetAccessToken功能:

[Serializable]
public class TokenClassName
{
    public string access_token;
}

private static IEnumerator GetAccessToken(Action<string> result)
{
    Dictionary<string, string> content = new Dictionary<string, string>();
    //Fill key and value
    content.Add("grant_type", "client_credentials");
    content.Add("client_id", "login-secret");
    content.Add("client_secret", "secretpassword");

    UnityWebRequest www = UnityWebRequest.Post("https://someurl.com//oauth/token", content);
    //Send request
    yield return www.Send();

    if (!www.isError)
    {
        string resultContent = www.downloadHandler.text;
        TokenClassName json = JsonUtility.FromJson<TokenClassName>(resultContent);

        //Return result
        result(json.access_token);
    }
    else
    {
        //Return null
        result("");
    }
}
Run Code Online (Sandbox Code Playgroud)

GetMeasurements功能:

[Serializable]
public class MeasurementClassName
{
    public string Measurements;
}

private static IEnumerator GetMeasurements(string id, DateTime from, DateTime to, Action<string> result)
{
    Dictionary<string, string> content = new Dictionary<string, string>();
    //Fill key and value
    content.Add("MeasurePoints", id);
    content.Add("Sampling", "Auto");
    content.Add("From", from.ToString("yyyy-MM-ddTHH:mm:ssZ"));
    content.Add("To", to.ToString("yyyy-MM-ddTHH:mm:ssZ"));
    content.Add("client_secret", "secretpassword");

    UnityWebRequest www = UnityWebRequest.Post("https://someurl.com/api/v2/Measurements", content);

    string token = null;

    yield return GetAccessToken((tokenResult) => { token = tokenResult; });

    www.SetRequestHeader("Authorization", "Bearer " + token);
    www.Send();

    if (!www.isError)
    {
        string resultContent = www.downloadHandler.text;
        MeasurementClassName[] rootArray = JsonHelper.FromJson<MeasurementClassName>(resultContent);

        string measurements = "";
        foreach (MeasurementClassName item in rootArray)
        {
            measurements = item.Measurements;
        }

        //Return result
        result(measurements);
    }
    else
    {
        //Return null
        result("");
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

string id = "";
DateTime from = new DateTime();
DateTime to = new DateTime();

StartCoroutine(GetMeasurements(id, from, to, (measurementResult) =>
{
    string measurement = measurementResult;

    //Do something with measurement
    UnityEngine.Debug.Log(measurement);

}));
Run Code Online (Sandbox Code Playgroud)