CategoriesProgramming

Membuat Planner dengan Microsoft Graph API

Microsoft Graph adalah platform dari Microsoft yang menghubungkan banyak layanan dan perangkat yang sudah disediakan oleh Microsoft. Dengan menggunakan Microsoft Graph, pengembang dapat melakukan integrasi layanan dengan layanan – layanan yang ada di Microsoft 365. Misal dalam tulisan ini saya ingin menggunakan layanan Microsoft Planner untuk membuat Task menggunakan API sendiri.

Berikut adalah langkah – langkahnya:

  1. Registrasi Aplikasi

Langkah pertama adalah mendaftarkan aplikasi di Azure Portal. Tampilan seperti di gambar dibawah.

Pada form diatas, isi Name dengan nama Aplikasi yang diinginkan. Pada Supported account types pilih sesuai dengan kebutuhan aplikasimu. Untuk detilnya bisa klik link “Help me choose..”. Next pada Field Redirect URI bisa dikosongi saja. Lalu tekan tombol Register dibawah.

  1. Tambahkan API Permissions

Jadi agar bisa mengakses API dari MS Graph diperlukan permission yang diberikan oleh Admin Organisasi. Untuk mengetahui apa saja permission dari endpoint yang akan kita gunakan, bisa

membuka dokumentasi disini. Seperti contoh pada endpoint Get Group, di bagian Permissions terlihat apa saja Permission yang dibutuhkan.

Selain Permissions, yang perlu diperhatikan adalah Permissions Type, karena beda type akan beda juga permissions yang dibutuhkan. Lalu untuk menambahkan permissions langkahnya adalah:

  1. Masuk ke menu API permissions
  2. Klik tombol “Add a permission” dan akan muncul pop up untuk memilih API apa yang akan ditambahkan
  3. Pilih Microsoft Graph
  4. Pilih type permissions yang dibutuhkan
  5. Pilih permissions yang dibutuhkan
  6. Tekan tombol Add permissions
  7. Langkah terakhir, tunggu Admin Organisasi untuk melakukan approval.
  1. Buat Aplikasi

Aplikasi yang kita buat adalah ASP .Net 5 Web API.

Pada Startup.cs tambahkan baris kode ini

services.AddMicrosoftIdentityWebApiAuthentication(Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
    .AddInMemoryTokenCaches();

Tambahkan element ini pada appsettings.json. Ganti Domain, ClientId, TenantId, ClientSecret dan Scopes sesuai dengan yang ada di Aplikasi yang sudah diregistrasi tadi.

"AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "[Your_Organization_Domain]",
    "ClientId": "[Your_Registered_Application_Client_Id]",
    "TenantId": "[Your_Registered_Application_Tenant_Id]",
    "ClientSecret": "[Your_Registered_Application_Client_Secret]"
  },
"GraphBeta": {
    "BaseUrl": "https://graph.microsoft.com/v1.0",
    "Scopes": "[Your_Permission_Scope]"
  }

Untuk mendapatkan access token sendiri ada beberapa macam metode, kali ini saya akan menggunakan metode Username Password Authentication karena saya tidak ingin menggunakan UI login/signin setiap mendapatkan access token.

Berikut adalah fungsi untuk mendapatkan access token.

public async Task<AuthenticationResult> GetToken()
        {
            string authority = _config["AzureAd:Instance"] + _config["AzureAd:Domain"];
            string[] scopes = new string[] { "GroupMember.Read.All", "Group.Read.All", "Group.ReadWrite.All", "People.Read.All", "User.Read", "Directory.AccessAsUser.All", "Directory.Read.All", "Directory.ReadWrite.All", "User.Read.All", "User.ReadWrite.All" };
            IPublicClientApplication app;
            app = PublicClientApplicationBuilder.Create(_config["AzureAd:ClientId"])
                  .WithAuthority(authority)
                  .Build();
            var accounts = await app.GetAccountsAsync();

            UsernamePasswordProvider authProvider = new UsernamePasswordProvider(app, scopes);

            AuthenticationResult result = null;

            if (accounts.Any())
            {
                result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault()).ExecuteAsync();
            }
            else
            {
                try
                {
                    var securePassword = new SecureString();
                    foreach (char c in PASSWORD)
                        securePassword.AppendChar(c); 

                    result = await app.AcquireTokenByUsernamePassword(scopes, EMAIL, securePassword).ExecuteAsync();
                }
                catch (Exception e)
                {
                    // See details below
                    throw new Exception(e.Message);
                }
            }
            return result;
        }
  1. Call MS Graph API

Langkah selanjutnya adalah melakukan request API MS Graph ke endpoint yang dibutuhkan, karena saya ingin membuat Task di Planner maka perlu membuat fungsi seperti ini.

public async Task<object> PostPlannerTask(CreateTask post)
{
    PostTaskResult data = new PostTaskResult();
    using (var httpClient = new HttpClient())
            {
                CreateTask taskPost = new CreateTask()
                {
                    bucketId = post.BucketId,
                    planId = post.PlanId,
                    title = post.Platform + " " + post.Description,
                    assignments = new Dictionary<string, CreateTaskAssignments>()
                };
                httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", TOKEN);
                var json = JsonConvert.SerializeObject(taskPost);
                var postContent = new StringContent(json, Encoding.UTF8, "application/json");
                using (var response = await httpClient.PostAsync(APIURI + "planner/tasks", postContent))
                {
                    string apiResponse = await response.Content.ReadAsStringAsync();
                    if (apiResponse.Contains("error"))
                    {
                        return JsonConvert.DeserializeObject<ErrorRoot>(apiResponse);
                    }
                    else
                    {
                        data = JsonConvert.DeserializeObject<PostTaskResult>(apiResponse);
                    }
                }
            }
            return data;
}

Bisa dilihat dari fungsi tersebut saya menggunakan HTTP dalam melakukan request. Sedangkan ada beberapa metode yang bisa dilihat di dokumentasi disini. Dan untuk membuat sebuah Task di Microsoft Planner, dibutuhkan PlanId terlebih dahulu. Untuk mendapatkannya diperlukan melakukan request di endpoint lain seperti Get Group, Get Plan in Group dll. Semua itu terangkum disini.

Selamat mencoba

Published by Andhika

ASP.Net developer and game addict

Leave a Reply

Your email address will not be published. Required fields are marked *