Friday, December 7, 2012

Google Apps: Setup Send-as alias (GMail setting) berdasarkan Nickname (CPanel)


By-default, Nickname atau alias yang di-set pada Google Apps Control Panel hanya berfungsi untuk menerima email. Seperti pada contoh gambar berikut:
user eddy[at]sadaweb[dot]com, selain bisa menerima dari  eddy[at]sadaweb[dot]com, juga bisa menerima email dari eddy.mulyono[at]sadaweb[dot]com dan masuk pada Mailbox yang sama.

Sedangkan apabila user juga ingin mengirim email menggunakan Nickname/Alias yang dia miliki, maka dia harus melakukan langkah-langkah tambahan yang harus dilakukan dari halaman Setting GMail sebagai mana yang dijelaskan pada tutorial berikut.

Apabila Anda adalah seorang Administrator Google Apps yang tidak mau membebani end-user untuk melakukan langkah-langkah tambahan tersebut, Anda bisa memanfaatkan Provisioning API dan Email Settings API untuk mengotomatisasi proses ini.

Authorize API dengan OAuth 2.0

#Generate Client ID dan Client Secret dari https://code.google.com/apis/console/
CLIENT_ID = 'xxxxxxxxxxxx.apps.googleusercontent.com' 
CLIENT_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxx'
#Scope untuk Provisioning API (User dan Alias) dan Email Setting API
SCOPE = 'https://apps-apis.google.com/a/feeds/user/ https://apps-apis.google.com/a/feeds/alias/ https://apps-apis.google.com/a/feeds/emailsettings/2.0/'
USER_AGENT = 'GApps-Alias2SendAs/0.1'
#Diawal kosong, namun apabila sudah generate bisa langsung di hard-code disini suapaya tidak melakukan Authorize berulang-ulang
REFRESH_TOKEN = ''

def genenrate_oauth_token():
  global REFRESH_TOKEN
  token = gdata.gauth.OAuth2Token(
          client_id=CLIENT_ID, client_secret=CLIENT_SECRET,
          scope=SCOPE, user_agent=USER_AGENT,
          refresh_token=REFRESH_TOKEN)
  if (REFRESH_TOKEN == ''):
    uri = token.generate_authorize_url()
    print 'Please visit this URL to authorize the application:'
    print uri
    code = raw_input('What is the verification code? ').strip()
    code
    token.get_access_token(code)
    #cache to config
    print 'Refresh token: ' + token.refresh_token
    REFRESH_TOKEN = token.refresh_token
  
  return token

Retrieve Nickname menggunakan Provisioning API

import gdata.apps.multidomain.client;
...
def retrieve_alias(email):
  username = email[:email.find('@')]
  domain = email[email.find('@')+1:]
  multiDomainClient = gdata.apps.multidomain.client.MultiDomainProvisioningClient(domain=domain)
  token = genenrate_oauth_token()  
  token.authorize(multiDomainClient)
  multiDomainClient.ssl = True
  response = multiDomainClient.RetrieveAllUserAliases(email)
  for entry in response.entry:    
    print 'Email: %s, Alias: %s' % (entry.GetUserEmail(), entry.GetAliasEmail())

Setup Send-As menggunakan Email Settings API

import gdata.apps.emailsettings.client
...
def create_sendas(email, alias):
  username = email[:email.find('@')]
  domain = email[email.find('@')+1:]
  client = gdata.apps.emailsettings.client.EmailSettingsClient(domain=domain)
  token = genenrate_oauth_token()  
  token.authorize(client)
  client.ssl = True
  response = client.CreateSendAs(username=username, name=alias, address=alias, make_default=False)
Download full source code: http://goo.gl/wCVOd


Sample code ini akan sangat bermanfaat bagi Anda yang memaksimalkan fungsi Alias/Nickname untuk semua user Google Apps do Organisasi Anda. Contoh yang pernah saya temui, ada suatu institusi yang mengharuskan user-user mereka Login ke Google Apps menggunakan Nomor Induk atau ID, yang sulit diingat sebagai alamat email. Sehingga mereka juga setup Nickname yang menggunakan nama user, yang tentu saja lebih mudah diingat.

Semoga bermanfaat!

Tuesday, October 16, 2012

Menggunakan OAuth 2.0 Service Account untuk mengakses Google APIs

Berawal dari dokumentasi Google mengenai OAuth 2.0 yang ditujukan untuk aplikasi yang berupa Service account. Perbedaan utama dari OAuth model lainnya adalah, tidak dibutuhkannya masing-masing User untuk melakukan process Authorize. Proses Authorize itu sendiri digantikan dengan suatu Permission yang di configure disisi Control Panel.
Model OAuth 2.0 Service Account ini sangat pas apabila digunakan untuk Program yang berjalan terus-menerus (service) atau aplikasi yang berjalan di background, yang mebutuhkan akses ke semua User dalam satu domain Google Apps.

Membuat OAuth 2.0 Client ID

  1. Kita buat OAuth project dari console API. Apabila belum pernah membuat project sebelumnya, akan disodorkan menu untuk membuat Project. Klik menu Create OAuth Project. Apabila sudah pernah membuat Project sebelumnya, pilih pada drop-down list Porject, pilih Create...
  2. Klik menu API Access, kemudian klik Create an OAuth 2.0 client ID. Isi informasi umum seputar Project ini (terserah), yang harus diperhatikan adalah pada Application Type, pilih Service account.
  3. Setelah itu akan muncul dialog untuk Download Private Key. Nanti kita akan gunakan Private Key ini.
  4. Hasilnya sebagai berikut. Catat Client ID dan Email Address juga.

Mulai Beraksi!


Dalam contoh ini saya menggunakan bahasa Python yang memang favorit saya, meskipun bukan expertise saya (setidaknya ketika saya menulis ini). Selain itu juga saya ambil contoh kasus dalam mengakses Google Drive API dari user-user lain termasuk dalam domain Google App kita.
  1. Proses Authorization
    #function untuk ambil content file Private Key 
    def datafile(filename):
      f = open(os.path.join(os.path.dirname(__file__), 'data', filename), 'rb')
      data = f.read()
      f.close()
      return data
    
    
    class OAuth2Service():
    #generate credential
      def _generate_credential(self):
        private_key = datafile(CLIENT_PRIV_KEY)
        self.cred = SignedJwtAssertionCredentials(
            'xxxxxxxxxxxx@developer.gserviceaccount.com', #email address dari API Console
            private_key,
            scope=OAUTH_SCOPE,
            prn='otheruser@yourdomain.com')
    
    #main function
    if __name__ == '__main__':
      app = Server2DriveSync()
      app._generate_credential()
      #do the action (next section)
    
  2. Mulai mengakses Google Drive API
    class OAuth2Service():
    #...
      def test_create_file(self):
        # Create an httplib2.Http object and authorize it with our credentials
        http = httplib2.Http()
        http = self.cred.authorize(http)
    
        drive_service = build('drive', 'v2', http=http)
    
        # Insert a file
        media_body = MediaFileUpload('test_file.txt', mimetype='text/plain', resumable=True)
        body = {
          'title': 'test_file.txt',
          'description': 'A test document',
          'mimeType': 'text/plain'
        }
    
        file = drive_service.files().insert(body=body, media_body=media_body).execute()
        pprint.pprint(file)
    
    
Download full source code: http://goo.gl/6I20I

Beri Permission untuk Project Ini


  1. Untuk menberi akses, silahkan Login ke Control Panel Google Apps, kemudian akses menu Advanced Tools > Manage OAuth domain key
  2. Akses menu  Manage client API access, kemudian masukkan Client ID yang sudah kita buat pada API Console diatas. Pada One or More API scope(s) isi dengan Google Drive Scope: https://www.googleapis.com/auth/drive
  3. Klik Authorize
Untuk informasi selengkapnya bisa refer ke referensi Google.

Dengan model OAuth ini, setidaknya kita bisa membuat Program seperti berikut:

  • Sinkronisasi Google Drive dengan File Server local
  • Tool migrasi file-file dari File Server yang terpusat ke Google Drive
Semoga bermanfaat!