Skip to main content

Windows Live - Basic operations

Windows LIVE series:
Astazi o sa incepem sa vorbim despre serviciile de tip CORE care exista pe Windows Live Connect. Nu imi este foarte clar daca sa ofer exemplele in C# sau in JavaScript. Cred ca ar fi mai interesant sa prezint exemplele in JavaScript si din cand in cand o sa prezint si exemple in C#. In .NET avem o librărie, este destul de simplu, iar modul în care totul funcționează este destul de ascuns.
Înainte sa începem trebuie știut ceva foarte importat. Cand un utilizator nou accesează aplicația noastră pentru prima data, iar noi dorim sa accesam anumite servicii ca și cum am fi utilizatorul respectiv, acesta o sa trebuiască sa ne de-a dreptul ca putem sa accesam aceasta informație. In general apare un pop-up, asemănător cu cel de logare, unde userul își da acordul ca aplicația noastră sa acceseze o colecție de servicii în numele sau. In funcție de modul în care facem request-ul acest drept poate sa aibe o durata limitata sau sa fie pe veci. By default dreptul de acces la resursele unui utilizator sunt temporare.
In funcție de platforma, avem la dispoziție diferite librari prin care putem sa accesam mai ușor resursele. Pentru JavaScript avem la dispozitive o librărie cu numele WL.js, iar pentru .NET avem la dispoziție librăria Microsoft.Live. Toate apelurile se pot face și manual prin intermediul apelurilor de tip REST, dar acest lucru consuma timp și este generator de bug-uri.
Oriunde dorim sa folosim librăria WL, este nevoie ca aceasta sa fie inițializata cu id de client pe care l-am primit și url de redirect, care o sa fie apelat de către Live Connect in momentul în care un utilizator se autentifica.
In primul exemplu o sa presupunem ca dorim sa accesam datele de baza a utilizatorului împreuna cu datele de profil. Primul pas este ca utilizatorul sa se logheze:
WL.init({ client_id: {idClient}, redirect_uri: {ourRedirectUrl} });
WL.login(
{ "scope": "wl.basic" },
function (response) {
if (response.status == "connected") {
alert("Utilizator conectat");
}
else {
alert("Autentificare esuata");
}
});
Acuma ca utilizatorul este autentificat, putem sa accesam datele de baza a acestuia. Pentru acest lucru trebuie sa apelam path-ul "me" prin GET. Un obiect în format JSON o sa ne fie returnat si o sa contina toate de profil a acestuia.
WL.api(
"/me", "GET",
function (response) {
if (response.error) {
alert("A aparut o eroare.");
return;
}
// response - o sa conțină toate datele de profil
}
);

In cazul in care sunteti curiosi, iata mai jos un exemplu de răspuns:
{"id":"XXXd9f52e4XXX02X"
"name":"Vunvulea Radu"
"first_name":"Vunvulea"
"last_name":"Radu"
"link":"http://profile.live.com/cid-bb7d9f52e4fdb024/"
"birth_day":null
"birth_month":null
"birth_year":null
"gender":null
"emails":
{
"preferred":"XXX@hotmail.com"
"account":"XXX@hotmail.com"
"personal":null
"business":null
}
"addresses":
{
"personal":
{
"street":null
"street_2":null
"city":null
"state":null
"postal_code":null
"region":null
}
"business":
{
"street":null
"street_2":null
"city":null
"state":null
"postal_code":null
"region":null
}
}
"phones":
{
"personal":null
"business":null
"mobile":null
}
"locale":"ro_RO"
"updated_time":"2012-02-02T06:21:16+0000"
}
Din cate putem sa observam răspunsul este in format JSON, care se poate procesa foarte usor. Odata ce un user este logat cu SCOPE-ul "wl.basic", putem sa accesam orice informatii de baza, precum date de profil, lista de contacte. Ce imi placela acest API este faptul ca, chiar daca ai acces la contacte sau la evenimente din calendar, dreptul de adaugare pe fiecare din ele se obtine printr-un SCOPE separat, a.i. utilizatorul este protejat si stie exact ce poate sa faca o aplicatie cu contul sau.
Sa presupunem ca vrem sa facem retrive la toate evenimentele utilizatorului. In acest caz o sa avem nevoie sa ne logam folosind SCOP-ul "wl.calendars" si sa apelam path-ul "/me/events".
De menționat doua lucruri:
  • cand ne definim scope-ul putem sa avem o lista de genul "scope: "wl.basic wl.calendars"
  • resursele pe care le accesam trebuie sa fie văzute ca È™i o structura de foldere, organizate ierarhic
In exemplul de mai jos încărcam toate evenimentele utilizatorului:
 WL.api({
path: "/me/events",
method: "GET"
}, onResponseReceive);
function onResponseReceive(response)
{
// response contine lista de evenimente
}
In cazul in care dorim sa adaugam un eveniment este nevoie sa facem request la un nou scope "wl.events_create".
 WL.api({
path: "/me/events",
method: "POST",
body: {
name: "Iesire la bere",
description: "Iesire la bere cu Ghita",
start_time: "1/1/2012 20:00",
end_time: "1/1/2012 22:00",
location: "Cluj-Napoca",
is_all_day_event: false,
availability: "busy",
visibility: "public"
}
}, onResponseReceive);
Cand ne vine raspunsul, trebuie sa verificam doar ca proprietatea error nu conține nici o eroare.
Data următoare o sa povestim despre SkyDrive si Messenger.

Comments

Popular posts from this blog

Windows Docker Containers can make WIN32 API calls, use COM and ASP.NET WebForms

After the last post , I received two interesting questions related to Docker and Windows. People were interested if we do Win32 API calls from a Docker container and if there is support for COM. WIN32 Support To test calls to WIN32 API, let’s try to populate SYSTEM_INFO class. [StructLayout(LayoutKind.Sequential)] public struct SYSTEM_INFO { public uint dwOemId; public uint dwPageSize; public uint lpMinimumApplicationAddress; public uint lpMaximumApplicationAddress; public uint dwActiveProcessorMask; public uint dwNumberOfProcessors; public uint dwProcessorType; public uint dwAllocationGranularity; public uint dwProcessorLevel; public uint dwProcessorRevision; } ... [DllImport("kernel32")] static extern void GetSystemInfo(ref SYSTEM_INFO pSI); ... SYSTEM_INFO pSI = new SYSTEM_INFO(

Azure AD and AWS Cognito side-by-side

In the last few weeks, I was involved in multiple opportunities on Microsoft Azure and Amazon, where we had to analyse AWS Cognito, Azure AD and other solutions that are available on the market. I decided to consolidate in one post all features and differences that I identified for both of them that we should need to take into account. Take into account that Azure AD is an identity and access management services well integrated with Microsoft stack. In comparison, AWS Cognito is just a user sign-up, sign-in and access control and nothing more. The focus is not on the main features, is more on small things that can make a difference when you want to decide where we want to store and manage our users.  This information might be useful in the future when we need to decide where we want to keep and manage our users.  Feature Azure AD (B2C, B2C) AWS Cognito Access token lifetime Default 1h – the value is configurable 1h – cannot be modified

ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded

Today blog post will be started with the following error when running DB tests on the CI machine: threw exception: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information. at System.Data.Entity.Infrastructure.DependencyResolution.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName) This error happened only on the Continuous Integration machine. On the devs machines, everything has fine. The classic problem – on my machine it’s working. The CI has the following configuration: TeamCity .NET 4.51 EF 6.0.2 VS2013 It see