public LoginWithUserAsync ( String username, String password, int expiresIn = 3600 ) : Task |
||
username | String | The Particle account username |
password | String | The Particle account password |
expiresIn | int | How many seconds the token will be valid for. 0 means forever. Short lived tokens are better for security. |
return | Task |
public async Task<Result> LoginWithUserAsync(String username, String password, int expiresIn = 3600)
{
if (String.IsNullOrWhiteSpace(username))
{
throw new ArgumentNullException(nameof(username));
}
if (String.IsNullOrWhiteSpace(password))
{
throw new ArgumentNullException(nameof(password));
}
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes("particle:particle")));
var data = new Dictionary<String, String>();
data["grant_type"] = "password";
data["username"] = username;
data["password"] = password;
data["expires_in"] = expiresIn.ToString();
// BaseAddress did not seam to work on Linux so changed to use UriBuilder
UriBuilder b = new UriBuilder(baseUri);
b.Path = "/oauth/token";
try
{
var postResults = await client.PostAsync(b.Uri, new FormUrlEncodedContent(data));
if (postResults.StatusCode == System.Net.HttpStatusCode.OK)
{
var results = await postResults.Content.ReadAsStringAsync();
var ret = await Task.Run(() => JsonConvert.DeserializeObject<AuthenticationResults>(results));
if (ret != null)
{
if (!String.IsNullOrWhiteSpace(ret.AccessToken))
{
authResults = ret;
authResults.Username = username;
authResults.Password = password;
FirePropertyChanged(nameof(IsAuthenticated));
return new Result
{
Success = true
};
}
}
}
else if (postResults.StatusCode == System.Net.HttpStatusCode.BadRequest)
{
var results = await postResults.Content.ReadAsStringAsync();
var ret = await Task.Run(() => JsonConvert.DeserializeObject<Result>(results));
if (ret != null)
{
ret.Success = false;
return ret;
}
}
return new Result
{
Success = false,
Error = postResults.StatusCode.ToString()
};
}
catch (HttpRequestException re)
{
return new Result
{
Success = false,
Error = re.Message,
Exception = re
};
}
}
public async Task AuthenticationTestAsync() { using (var cloud = new ParticleCloud()) { var exc = Assert.Throws<ArgumentNullException>(() => { cloud.LoginWithUserAsync(null, "sadf").GetAwaiter().GetResult(); }); Assert.AreEqual("username", exc.ParamName); exc = Assert.Throws<ArgumentNullException>(() => { cloud.LoginWithUserAsync("test", null).GetAwaiter().GetResult(); }); Assert.AreEqual("password", exc.ParamName); var results = await cloud.LoginWithUserAsync("*****@*****.**", "test123"); Assert.IsFalse(results.Success, "User some how authenticated?"); Assert.AreEqual("User credentials are invalid", results.ErrorDescription); results = await cloud.LoginWithUserAsync(ConfigurationManager.AppSettings["Username"], ConfigurationManager.AppSettings["Password"]); Assert.IsTrue(results.Success, "User did not authenticate"); } }