구리의 창고

Golang - Google OAuth2 접속/인증 (Google Adsense) 본문

Golang

Golang - Google OAuth2 접속/인증 (Google Adsense)

구리z 2017. 8. 5. 14:50

개요

수 많은 Google API 중 OAuth2를 사용해야만 접근이 되는 것들이 있다. 그 중 한 가지 예로 Google Adsense API가 있다. Google에서 친절하게 몇 가지 언어로 작성된 예제를 제공하는데 이 중에는 Golang이 없어 참 난감하다. OAuth2 프로토콜에 대한 이해를 하기보다는 OAuth2 인증을 이용해 Google API를 사용하는 방법을 얘기하겠다. 코드만 보고 싶으면 https://github.com/odg0318/google-adsense-example에서 확인 할 수 있다.

구조

코드를 작성하기 앞서, 이해를 좀 더 돕기 위해 인증과정을 그림으로 확인하자.

출처: https://developers.google.com/identity/protocols/OAuth2

1. 인증정보를 담아 Google OAuth2 서버에 인증을 요청한다.
2. 웹브라우저(혹은 어플리케이션)을 통해 Google 계정으로 로그인하고 인증정보를 Google에 전송한다.
3. Google에 등록한 주소로 Authorization Code를 받는다.
4. 위에서 받은 코드로 Google OAuth2 서버에서 Token을 발급받는다.
5. 해당 Token으로 Google API를 사용한다.

과정1. Google OAuth2 클라이언트ID 만들기

 Google API Console에서 사용자인증정보 만들기 중 OAuth2 클라이언트ID 만들기를 선택한다. 그 후 원하는 애플리케이션 유형을 선택하는데, 이 예제에서는 웹 애플리케이션을 선택 할 것이다. 만약에 안드로이드나 iOS같은 어플리케이션에서 사용하려면 각각에 맞는 유형을 선택해야 한다. 승인된 리다이렉션 URI에 Authorization Code를 받을 엔드포인트를 등록한다. 인증이 성공했을 때 Google 서버에서 Redirect해주는 URI이므로, Google API를 사용 할 호스트 입장에서 입력하면된다. 이 예제에서는 http://127.0.0.1:8080/auth 를 사용하도록 하겠다. 모든 정보를 입력 후 생성을 하면 clientId, clientSecret을 어딘가에 저장해놓자.
* 기억 할 항목: clientId, clientSecret, 승인된 리다이렉션 URI

과정2. Google Adsense API 활성화 하기

Google API Console 중 API 관리자를 들어가서 필요한 서비스를 활성화해야한다. 여기서 Google Adsense API를 활성화 해준다.

코드

아래 코드는 https://github.com/odg0318/google-adsense-example에서도 볼 수 있다.
package main

import (
	"fmt"
	"log"
	"net/http"
	"os"

	"github.com/gin-gonic/gin"
	"golang.org/x/oauth2"
	"golang.org/x/oauth2/google"
	"google.golang.org/api/adsense/v1.4"
)

var (
	port = 8080
)

func main() {
	clientId := os.Getenv("GOOGLE_CLIENT_ID")
	clientSecret := os.Getenv("GOOGLE_CLIENT_SECRET")
	redirectUri := os.Getenv("GOOGLE_REDIRECT_URI")

	if len(clientId) == 0 {
		log.Fatal("GOOGLE_CLIENT_ID is empty.")
	}

	if len(clientSecret) == 0 {
		log.Fatal("GOOGLE_CLIENT_SECRET is empty.")
	}

	if len(redirectUri) == 0 {
		log.Fatal("GOOGLE_REDIRECT_URI is empty.")
	}

	oauth2Conf := &oauth2.Config{
		ClientID:     clientId,
		ClientSecret: clientSecret,
		Endpoint:     google.Endpoint,
		RedirectURL:  redirectUri,
		Scopes: []string{
			"https://www.googleapis.com/auth/adsense.readonly",
		},
	}

	r := gin.Default()

	r.GET("/", func(ctx *gin.Context) {
		url := oauth2Conf.AuthCodeURL("state", oauth2.AccessTypeOffline)
		ctx.Redirect(http.StatusMovedPermanently, url)
	})

	r.GET("/auth", func(ctx *gin.Context) {
		code := ctx.Query("code")

		tok, err := oauth2Conf.Exchange(oauth2.NoContext, code)
		if err != nil {
			ctx.JSON(500, err)
			return
		}

		client := oauth2Conf.Client(oauth2.NoContext, tok)
		service, err := adsense.New(client)

		call := service.Accounts.List()
		resp, err := call.Do()
		if err != nil {
			ctx.JSON(500, err)
			return
		}

		ctx.JSON(200, resp)
	})

	r.Run(fmt.Sprintf(":%d", port))
}

설명

일단 웹 서버를 만들기 위해서 gin이란 오픈소스를 사용했다. 웹 서버의 핸들러가 두 개가 등록되어있는데 GET /은 인증 요청을 하기 위한 페이지고, GET /auth는 Google로부터 인증정보를 받을 승인된 리다이렉션 URI다. 최초 실행은 http://127.0.0.1:8080/을 브라우저를 통해 접속하면 된다. 그 후, 인증에 필요한 알맞은 계정을 선택하면 Accounts:list 응답 값을 볼 수 있다. 만약 웹 서버를 실행하는 위치와 접속하는 위치가 다르다면 http://127.0.0.1:8080/이 http://host.port 로 변경되고 Google Console에도 알맞은 값이 설정되어야 한다.


Comments