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)
如果您有任何建议,我将永远感激.谢谢!
翻译成旧的.NET版本并不难.您可以使用Unity WWW或UnityWebRequestAPI.他们中的任何人都应该这样做.
1 .Replace HttpClient用UnityWebRequest.
2 .Replace KeyValuePair,与Dictionary.
3 .Replace DefaultRequestHeaders用SetRequestHeader.
4 .Replace client.PostAsync与UnityWebRequest.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)