Skip to content

Google API 사용법#

go 언어용 라이브러리가 있지만 직접 액서스 토큰으로 Google API 를 사용하는 방식입니다.

API 콘솔 프로젝트 생성 및 설정#

Google Play Developer API 을 사용하기 위해선 OAuth2 인증이 필수입니다. Google Cloud 프로젝트내 사용자 인증 정보에서 웹 애플리케이션 유형으로 OAuth 2.0 클라이언트 ID 를 만들어줘야 합니다. (참고로 토큰을 얻기 위해 OAuth 동의화면에서 아무런 API 범위 추가가 필요하지 않습니다.)

토큰을 얻기 위해 필요한 필수 항목

  • ClientID
  • ClientSecret
  • 승인된 리디렉션 URI

RefreshToken 생성#

Redirect 서버 구축#

토큰을 얻기위해 미리 Redirect 서버를 구축해야 합니다.

example :

package main

import (
    "context"
    "log"
    "net/http"

    "github.com/gin-gonic/gin"
    "golang.org/x/oauth2"
    "golang.org/x/oauth2/google"
)

func main() {
    router := gin.Default()
    ctx := context.Background()

    oauth2Conf := &oauth2.Config{
        ClientID:     "871xxxxxxxx-xxxxx.apps.googleusercontent.com",
        ClientSecret: "GOXXXX-31xxxxxxxx",
        Endpoint:     google.Endpoint,
        RedirectURL:  "http://localhost:8077/redirect",
        Scopes: []string{
            "https://www.googleapis.com/auth/admob.readonly",
        },
    }

    router.GET("/redirect", func(c *gin.Context) {
        code := c.Query("code")
        log.Println(code)
        tok, err := oauth2Conf.Exchange(ctx, code)
        if err != nil {
            c.JSON(500, err)
            return
        }
        log.Println(tok.RefreshToken)
    })
}  

브라우저에서 로그인하기#

미리 구글계정을 로그아웃해놓고 아래 URI 로 요청 후 로그인 합니다. 로그인이 성공한다면 리디렉션 서버로 요청이 갑니다. 그리고 code를 받아서 exchange 하면 RefreshToken 이 발급됩니다.

  • scope : 사용할 API 범위
  • client_id : API 콘솔에서 설정한 ClientID
https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/admob.readonly&response_type=code&access_type=offline&redirect_uri=http://localhost:8077/redirect&client_id=...

API 사용하기#

백엔드단에서 매번 브라우저로 인증처리를 할 수 없기때문에 RefreshToken 을 이용해서 AccessToken 을 얻습니다.

AccessToken 얻기위한 POST 요청#

POST
https://accounts.google.com/o/oauth2/token
HEADER
"Content-Type" : "application/x-www-form-urlencoded"

[Request Body (FormData)]

Key Description Type
refresh_token 위에서 발급받은 토큰 string
client_id API 콘솔에서 얻은 id string
client_secret API 콘솔 key string
grant_type 어떤 유형으로 토큰을 얻을지에 대한 타입 string

example :

import "github.com/go-resty/resty/v2"

func example() {
    client := resty.New()
    resp, err := client.R().
        SetHeader("Content-Type", "application/x-www-form-urlencoded").
        SetFormData(map[string]string{
            "refresh_token": "1//0e6caG1CsCnrVCgYIARAAGA4SNwF-...",
            "client_id":     "871390000-xxx.apps.googleusercontent.com",
            "client_secret": "GOXXXX-31xxxx",
            "grant_type":    "refresh_token",
        }).
        Post("https://accounts.google.com/o/oauth2/token")

    if err != nil {
        log.Println(err.Error())
    }   
    fmt.Println("  Body       :\n", resp)
  ...

Google Developer API 호출#

admob 예제:

type AdmobReq struct {
    ReportSpec struct {
        DateRange struct {
            StartDate struct {
                Year  int `json:"year"`
                Month int `json:"month"`
                Day   int `json:"day"`
            } `json:"startDate"`
            EndDate struct {
                Year  int `json:"year"`
                Month int `json:"month"`
                Day   int `json:"day"`
            } `json:"endDate"`
        } `json:"dateRange"`
        Metrics              []string `json:"metrics"`
        LocalizationSettings struct {
            CurrencyCode string `json:"currencyCode"`
            LanguageCode string `json:"languageCode"`
        } `json:"localizationSettings"`
        Dimensions []string `json:"dimensions"`
    } `json:"reportSpec"`
}

var admobReq AdmobReq
admobReq.ReportSpec.DateRange.StartDate.Year = startYear
admobReq.ReportSpec.DateRange.StartDate.Month = startMonth
admobReq.ReportSpec.DateRange.StartDate.Day = startDay
admobReq.ReportSpec.DateRange.EndDate.Year = endYear
admobReq.ReportSpec.DateRange.EndDate.Month = endMonth
admobReq.ReportSpec.DateRange.EndDate.Day = endDay
admobReq.ReportSpec.Metrics = []string{"ESTIMATED_EARNINGS", "IMPRESSIONS", "IMPRESSION_RPM"}
admobReq.ReportSpec.LocalizationSettings.CurrencyCode = "USD"
admobReq.ReportSpec.LocalizationSettings.LanguageCode = "en-US"
admobReq.ReportSpec.Dimensions = []string{"DATE", "APP"}

reportResp, err := client.R().
  SetAuthToken(authResp.AccessToken). //마샬링한 액서스 코드
  SetHeader("ContentType", "application/json").
  SetBody(admobReq).
  Post("https://admob.googleapis.com/v1/accounts/pub-0000000/networkReport:generate")

fmt.Println("  Error      :", err)
fmt.Println("  Body       :\n", reportResp)

Tip

동일한 방식으로 구글 영수증검증, 환불목록 조회 API 등 모든 API 사용이 가능합니다.