Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Artikel ini akan menjelaskan prosedur integrasi aplikasi dengan myITS SSO

Prerequisite

Info

Baca:
Registrasi Aplikasi Client pada myITS Security Management
Daftar Kontrol Akses User pada myITS SSO

Aplikasi yang akan diintegrasikan harus sudah terdaftar pada myITS SSO. Anda bisa mendaftarkan aplikasi yang ingin diintegrasikan dengan menghubungi DPTSI-ITS untuk didaftarkan pada myITS SSO.
Setelah mendaftarkan aplikasi, DPTSI akan memberikan beberapa informasi terkait aplikasi sebagai berikut:

...

  1. Buat function untuk login pada controller, dan definisikan variable

    Code Block
    public function login() // nama boleh beda 
    {
        try {
            // variable disimpan di config, di file config mengambil variable dari .env agar mudah disesuaikan
            // variable di bawah harus sama dengan apa yang diberikan oleh DPTSI, jika ada perubahan harap hubungi DPTSI lagi
            $provider       = config('openid.provider'); // antara my.its.ac.id dan dev-my.its.ac.id
            $provider       = config('openid.provider');
            $clientId       = config('openid.clientId');
            $clientSecret   = config('openid.clientSecret');
            $redirectUri    = config('openid.redirectUri');
            $scope          = config('openid.scope');
            ...
  2. Buat instance OIDC dan set beberapa attributes

    Code Block
    languagephp
            ...
            $oidc = new OpenIDConnectClient($provider, $clientId, $clientSecret);
    
            $oidc->setRedirectURL($redirectUri);
            $oidc->addScope($scope);
    
            // jika pada environment dev, maka set false pada host dan peer verify
            if(strtolower(config('app.env')) != 'production' && strtolower(config('app.env')) != 'prod') {
                $oidc->setVerifyHost(false);
                $oidc->setVerifyPeer(false);
            }
            ...
  3. Panggil function utama

    Code Block
    languagephp
             ...
             $oidc->authenticate(); // Jika tidak ada login session user, akan redirect ke my.its.ac.id/signin
             // Jika sudah ada session user maka dilanjutkan mengeksekusi kode di bawahnya
             $userInfo = $oidc->requestUserInfo(); //  ambil data user berdasarkan scope yang sudah ditentukan di awal
             $idToken = $oidc->getIdToken(); // ID token digunakan untuk logout session SSO
             ...
  4. Ambil data yang diperlukan dari OIDC, dan lakukan sesuai kebutuhan aplikasi

    Code Block
            ...
            // Apabila aplikasi punya kemampuan untuk create dan update data user yang login
            $user = User::updateOrCreate([
                  'id_user'                   => $userInfo->sub // sub adalah primary key dari user SSO dengan tipe UUID
              ], [
                  'id_user'                   => $userInfo->sub,
                  'username'                  => $userInfo->preferred_username,
                  'primary_email'             => $userInfo->email,
                  'alternate_email'           => $userInfo->alternate_email,
                  'phone'                     => $userInfo->phone,
                  'picture'                   => $userInfo->picture,
                  'updater'                   => $userInfo->sub,
            ]);
    
            $user_session = array();
            $user_roles = array();
    
            foreach ($userInfo->group as $group) {
                if(in_array($group->group_name, self::USED_ROLE)) {
                    $user_roles[] = [
                        'id' => $group->group_id,
                        'name' => $group->group_name,
                    ];
                }
            }
    
            foreach ($userInfo->role as $role) {
                if(in_array($role->role_name, self::USED_ROLE)) {
                    $user_roles[] = [
                        'id' => $role->role_id,
                        'name' => $role->role_name,
                        'org_id' => $role->org_id,
                        'org_name' => $role->org_name,
                        'client_id' => $role->client_id,
                    ];
                }
            }
    
            $user_session['id_token']       = $idToken;
            $user_session['user_roles']     = $user_roles;
            $user_session['active_role']    = $user_roles[0];
    
            // user session diset agar bisa dipakai untuk perluan authorization
            session([
                'auth' => $user_session,
            ]);
            ...
  5. Login pada auth laravel

    Code Block
             ...
             // Jika kita sudah mendapatkan session OIDC/SSO, maka selanjutnya adalah
             // menghubungkan user yang login dengan SSO pada auth bawaan laravel
             Auth::login($user);
    
             // setelah itu redirect ke halaman default setelah login berhasil
             return redirect()->route('Dashboard::index');
          } catch (OpenIDConnectClientException $e) {
              // Jika gagal login, hapus semua session, termasuk auth bawaan laravel
              Auth::logout();
              Session::flush();
              Session::save();
    
              if ($e->getMessage() === self::OIDC_ERROR_STATE_UNDETERMINED) {
                  return redirect('expired');
              }
    
              return redirect('error');
          }
  6. Logout

    Code Block
    public function logout()
    {
        try {
            // set variable yang dibutuhkan
            ...
            
            $oidc = new OpenIDConnectClient($provider, $clientId, $clientSecret);
    
            // set host dan peer verify 
            ...
            
            $idToken = session('auth.id_token');
            $oidc->signOut($accessToken$idToken, $redirect);
            
            return redirect()->route('Home::index'); // atau diredirect ke halaman login
          } catch (OpenIDConnectClientException $e) {
              // handle error
              ...
          }
    }

...