เขียนคำสั่ง Google API Client Authentication part 2 ด้วย Java code

บทความนี้จะต่อจาก เขียนคำสั่ง Authentication Google API Client part 1 down load p12 file เราได้ p12 file มาแล้ว ก็สามารถที่จะเขียนคำสั่ง Java เพื่อทำการขอสิทธิ์ใช้งาน service ต่างๆ ของ Google ได้เลยครับ

ในตัวอย่างนี้จะใช้ IntelliJ IDA 14 และ Gradle สำหรับ editor อื่นๆ เช่น NetBean หรือ Eclipse ก็สามารถใช้งานร่วมกันได้ครับ

เป็น IntelliJ IDEA สร้าง Gradle ใหม่ขึ้นมา โดยกำหนดค่าต่างๆ ดังนี้

  • GroupId com.codesanook.sample.googleauthentication
  • ArtifectId google-authentication

เมื่่อสร้าง project ใหม่เรียบร้อยแล้ว ให้แก้ไข build.gradle เป็นดังนี้

group 'com.codesanook.sample.googleauthentication'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'application'
sourceCompatibility = 1.5

mainClassName = "com.codesanook.sample.googleauthentication.Program"

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.google.api-client:google-api-client:1.21.0'
}

อธิบายการทำงานของคำสั่ง ที่เพิ่มเข้าไปใน build.gradle

  • บรรทัดที่ 5 apply plugin: 'application' เพื่อทำให้เราสามารถ run application จาก Gradle ได้เลย ลักษณะแบบ program command line
  • บรรทัดที่ 8 mainClassName = "com.codesanook.sample.googleauthentication.Program" กำหนด class ที่จะใช้เป็น main class ซึ่งก็คือ class ที่มี main method และจะถูกเรียกใช้งานทันทีเมื่อ run application ขึ้นมา
  • บรรทัดที่ 15 ** compile 'com.google.api-client:google-api-client:1.21.0'** load third party library ซึ่งก็คือ Google API Client เพื่อช่วยให้เราสามารถเขียนคำสั่งเชื่อต่อกับ Google Service ได้ คำสั่ง Authentication อยู่ใน library ตัวนี้

ให้ทำการสร้าง class Program ขึ้นมา โดยมีขั้นตอนดังนี้

  • สร้าง package com.codesanook.sample.googleauthentication ใน folder src/main/java
  • สร้าง class Program ขึ้นมาใน package ที่เพิ่งสร้างไป

แก้ไข file Program.java เป็นดังนี้

package com.codesanook.sample.googleauthentication;

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import java.io.File;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collection;

public class Program {

    //get these from developer console
    private static final String SERVICE_ACCOUNT_EMAIL = "codesanook-test-service@codesanook-test.iam.gserviceaccount.com";
    private static final String P12_FILE_PATH = "c:/codesanook-test-service-key.p12";

    //1 Build service account credential.
    private static GoogleCredential createCredentail(Collection<String> scopes) throws GeneralSecurityException, IOException {

        HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
        JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
        File file = new File(P12_FILE_PATH);

        GoogleCredential credential = new GoogleCredential.Builder()
                .setTransport(httpTransport)
                .setJsonFactory(jsonFactory)
                .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)

                .setServiceAccountScopes(scopes)
                .setServiceAccountPrivateKeyFromP12File(file)
                .build();

        return credential;
    }

    //2 get service scopes
    public static Collection<String> getScopes() {
        java.util.Set<String> set = new java.util.HashSet<String>();
        set.add("https://www.googleapis.com/auth/devstorage.read_only");
        return java.util.Collections.unmodifiableSet(set);
    }


    //3 use credential
    public static void main(String[] args) throws GeneralSecurityException, IOException {
        GoogleCredential credential = createCredentail(getScopes());
        //other Service client will use this credentail 
    }

}

อธิบายการทำงานของ class Program

  • ประกอบด้วย 3 method หลัก
  • createCredentail สำหรับสร้าง GoogleCredential ที่จะถูกนำไปใช้ต่อร่วมกับ class สำหรับสร้าง Google Service อื่นๆ เช่น Email Service, Storage Service และมีการกำหนดค่าที่ได้จาก Google Developer Console ซึ่งก็คือ p12 key file และ email ของ service account
  • getScopes เป็นการกำหนด scope หรือสิทธิการเข้าถึง API ต่างๆ ของ Google เช่น read only , read write
  • main method คือ method ที่จะถูกเรียกขึ้นมาใช้งานอัติโนมัติเป็นที่แรกตอนที่ application run ขึ้นมา

Note การเข้าไปนำค่า service account email มาใช้งาน

ให้ไปที่ developer console ไปที่ menu ที่อยู่มุมบนซ้ายของหน้าจอ > เลือก Permissions > เลือก Tab Service Account > copy email ของ service account ที่เราต้องการใช้ดังในรูปได้เลยครับ

image-1

กล่าวโดยสรุป หลักการทำงานการ Authentication Google API ก็คือ สร้าง GoogleCredential กำหนด scope แล้วสร้างตัว Service client โดยใช้ credential แล้วนำ service client ไปใช้งาน ยกตัวอย่างสำหรับ Storage client ก็เป็นการสร้าง แก้ไข อ่าน file เป็นต้น

download source code

https://github.com/codesanook/google-authentication