Drupal REST service Basic Authentication dgn Swift

Untuk mengakses REST server yang memerlukan authentication, maka kita memerlukan user dan password. Tergantung bagaimana user dan password ini dikirimkan ke server, ada beberapa cara proses authentication ini yaitu:

  • Session Based
  • Basic Authentication
  • oAuth 2 legged
  • oAuth 3 legged

Masing-masing ada kelemahan dan keunggulannya.

Session based authentication adalah standard yang disediakan oleh Drupal. User sekali diminta untuk login, kemudian diberikan session ID, sama seperti kalau kita mengakses drupal melalui internet browser. Selama session ini belum expire maka tidak perlu login lagi.

Basic Authentication mengharuskan kita mengirim user dan password kita dalam httpHeader berbarengan dengan pada saat kita request resource. Dengan Basic Authentication, maka informasi user dan password ini harus selalu dikirim setiap mengakses server. Tetapi tentu saja user cukup sekali saja memasukkan user dan password untuk kemudian disimpan ke dalam device dalam keychain atau lainnya.

Kedua mekanisme authentication di atas mengharuskan user memasukkan user dan password melalui aplikasi kita. Hal ini membuka peluang aplikasi untuk melakukan hal-hal yang tidak kita inginkan terhadap password kita.

Metode oAuth mengeliminir keharusan aplikasi meminta user memasukkan password, tetapi permintaan user dan password langsung dihandle di server, misalnya facebook server. Kemudian aplikasi hanya diberikan token yang mana dengan token itu sudah bisa digunakan untuk mengakses resource di server. Tentu saja penjelasan ini simplifikasi saja, nanti akan saya bahas dalam tulisan terpisah. Saat ini kita fokus pada Basic Authentication.

Berikut ini adalah codenya:

super.viewDidLoad() // Do any additional setup after loading the view. 
let apiURL = NSURL(string: "http://api.rustamaji.net/api/node/2.json")
let request = NSMutableURLRequest(URL: apiURL!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: 5)
let userpass = "user:password" // if you are serious you can ask me for real user and password
let userpassdata = (userpass as NSString).dataUsingEncoding(NSASCIIStringEncoding) // need to convert to NSData
let userpassbase64 = userpassdata?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding76CharacterLineLength) // then to Base64
let authString = "Basic " + userpassbase64! // format authorization accepted as httpheader request.addValue(authString, forHTTPHeaderField: "Authorization")
var requestError : NSError? var response : NSURLResponse?
let data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &requestError)
if (requestError == nil) { var jsonError : NSError? let jsonData: AnyObject? = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.allZeros, error: &jsonError)
println(jsonData) //silakan terserah mau diapakan ini data
} else {
println("something wrong") }

Saya akan jelaskan di bawah ini:

Kuncinya adalah kita menambahkan kode authorization pada HTTPHeader dengan perintah di bawah ini:

    request.addValue(authString, forHTTPHeaderField: "Authorization")

Di mana format authString harus khusus dengan format seperti berikut "Basic username:password", tetapi khusus untuk "username:password" harus dalam bentuk Base64 String. Makanya pada program di atas ada code di bawah ini yang mengubahnya menjadi Base64

     let userpass = "user:password"  // if you are serious you can ask me for real user and password
     let userpassdata = (userpass as NSString).dataUsingEncoding(NSASCIIStringEncoding)  // need to convert to NSData
     let userpassbase64 = userpassdata?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding76CharacterLineLength) // then to Base64
     let authString = "Basic " + userpassbase64!  // format authorization accepted as httpheader