Authentification et opérations OAuth2 dans Unity

Je dois implémenter l’authentification OAuth2 et certaines opérations pour une application Windows Mobile dans Unity. J’ai réussi à le faire fonctionner comme une application console (avec .NET 4.0 et versions ultérieures). Cependant, Unity ne prend en charge que les versions antérieures à .NET 3.5. Y a-t-il un moyen de le faire fonctionner dans Unity? Voici mon code d’authentification:

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); ssortingng resultContent = await result.Content.ReadAsSsortingngAsync(); var json = JObject.Parse(resultContent); return json["access_token"].ToSsortingng(); } } 

Et voici l’une de mes fonctions OAuth2:

 private static async Task GetMeasurements(ssortingng 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.ToSsortingng("yyyy-MM-ddTHH:mm:ssZ")), new KeyValuePair("To", to.ToSsortingng("yyyy-MM-ddTHH:mm:ssZ")) }); client.DefaultRequestHeaders.Add("Authorization", "Bearer " + GetAccessToken().Result); var result = await client.PostAsync("/api/v2/Measurements", content); ssortingng resultContent = await result.Content.ReadAsSsortingngAsync(); var rootArray = JArray.Parse(resultContent); ssortingng measurements = ""; foreach (JObject item in rootArray) { measurements = item.GetValue("Measurements").ToSsortingng(); } return measurements; } } 

Si vous avez des suggestions, je vous serai reconnaissant pour l’éternité. Merci!

Ce n’est pas si difficile à traduire en ancienne version .NET. Vous pouvez utiliser les API WWW ou UnityWebRequest . N’importe lequel d’entre eux devrait le faire.

1. Remplacez HttpClient par UnityWebRequest .

2. Remplacez KeyValuePair par Dictionary .

3. Remplacez DefaultRequestHeaders par SetRequestHeader .

4. Remplacez client.PostAsync avec UnityWebRequest.Send

5. Pour Json, utilisez JsonUtility de l’unité

6 .Pour la masortingce Json dans votre fonction GetMeasurements , utilisez la classe JsonHelper de ce post.

C’est tout. J’ai pu faire un portage rapide. Je ne l’ai pas testé mais il a été capable de comstackr et devrait vous aider à démarrer.

Fonction GetAccessToken :

 [Serializable] public class TokenClassName { public ssortingng 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) { ssortingng resultContent = www.downloadHandler.text; TokenClassName json = JsonUtility.FromJson(resultContent); //Return result result(json.access_token); } else { //Return null result(""); } } 

Fonction GetMeasurements :

 [Serializable] public class MeasurementClassName { public ssortingng Measurements; } private static IEnumerator GetMeasurements(ssortingng 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.ToSsortingng("yyyy-MM-ddTHH:mm:ssZ")); content.Add("To", to.ToSsortingng("yyyy-MM-ddTHH:mm:ssZ")); content.Add("client_secret", "secretpassword"); UnityWebRequest www = UnityWebRequest.Post("https://someurl.com/api/v2/Measurements", content); ssortingng token = null; yield return GetAccessToken((tokenResult) => { token = tokenResult; }); www.SetRequestHeader("Authorization", "Bearer " + token); www.Send(); if (!www.isError) { ssortingng resultContent = www.downloadHandler.text; MeasurementClassName[] rootArray = JsonHelper.FromJson(resultContent); ssortingng measurements = ""; foreach (MeasurementClassName item in rootArray) { measurements = item.Measurements; } //Return result result(measurements); } else { //Return null result(""); } } 

Utilisation :

 ssortingng id = ""; DateTime from = new DateTime(); DateTime to = new DateTime(); StartCoroutine(GetMeasurements(id, from, to, (measurementResult) => { ssortingng measurement = measurementResult; //Do something with measurement UnityEngine.Debug.Log(measurement); })); 

Je pense que vous devriez vérifier ceci: https://docs.unity3d.com/Manual/UnityWebRequest.html

cette classe fournit les fonctionnalités que vous souhaitez, utilisables dans une coroutine.

Vous pouvez également utiliser UNIRX pour publier et obtenir une version asynchrone. Cette librairie contient d’excellentes parties pour la gestion Web. https://github.com/neuecc/UniRx