일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- window size
- docker-compose
- DevOps
- RUBY
- 리눅스
- ubuntu
- docker registry
- 루비
- Chef
- Linux
- VMware
- port
- QT
- 드라이버
- 패키지
- ssh
- AWS
- VIM
- docker
- 우분투
- driver
- VPN
- golang
- docker container
- sudo
- 방화벽체크
- ssh command
- Openswan
- opsworks
- 도커
- Today
- Total
구리의 창고
Golang - Google OAuth2 접속/인증 (Google Adsense) 본문
개요
수 많은 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 활성화 하기
코드
아래 코드는 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에도 알맞은 값이 설정되어야 한다.
'Golang' 카테고리의 다른 글
Golang - 인자(Argument, Parameter) 파싱하기 FlagSet (0) | 2017.07.27 |
---|---|
Golang - http transport RoundTripper 사용 (0) | 2017.07.07 |
Comments