Unity中的OAuth2身份validation和操作

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

private static async Task GetAccessToken() { using (var client = new HttpClient()) { client.BaseAddress = new Uri("https://someurl.com"); var content = new FormUrlEncodedContent(new[] { new KeyValuePair("grant_type", "client_credentials"), new KeyValuePair("client_id", "login-secret"), new KeyValuePair("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(); } } 

这是我的OAuth2function之一:

 private static async Task 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("MeasurePoints", id), new KeyValuePair("Sampling", "Auto"), new KeyValuePair("From", from.ToString("yyyy-MM-ddTHH:mm:ssZ")), new KeyValuePair("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; } } 

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

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

1.使用UnityWebRequest HttpClient

2.使用Dictionary替换KeyValuePair

3.使用SetRequestHeader替换DefaultRequestHeaders

4.使用 client.PostAsync替换UnityWebRequest.Send

5.对于Json,使用unity的JsonUtility

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

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

GetAccessToken函数

 [Serializable] public class TokenClassName { public string access_token; } private static IEnumerator GetAccessToken(Action result) { Dictionary content = new Dictionary(); //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(resultContent); //Return result result(json.access_token); } else { //Return null result(""); } } 

GetMeasurementsfunction

 [Serializable] public class MeasurementClassName { public string Measurements; } private static IEnumerator GetMeasurements(string id, DateTime from, DateTime to, Action result) { Dictionary content = new Dictionary(); //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(resultContent); string measurements = ""; foreach (MeasurementClassName item in rootArray) { measurements = item.Measurements; } //Return result result(measurements); } else { //Return null result(""); } } 

用法

 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); })); 

我想你应该看看这个: https : //docs.unity3d.com/Manual/UnityWebRequest.html

这个类提供了你想要的function,可以在协程中使用。

或者:使用UNIRX发布并获取异步。 这个lib有很棒的Web处理部分。 https://github.com/neuecc/UniRx