Golang으로 Google과 OAuth 2.0으로 하겠습니다.

3362 단어 Go

종지


나는 문외한 아저씨다
구글의 OAuth 2.0을 이용해 사용자 정보를 얻는 방법을 골랑에서 배웠다.

배경

  • 구글이 제공하는 라이브러리를 잘 사용하고 싶어요.
  • 라이브러리에 사용된 샘플이 발견되지 않았습니다
  • 설명을 생략하지 않고 이동하려는 소스
  • 공식 홈페이지도 도중'이하 생략'
  • 문외한인 제가 길을 잃었습니다... 실험을 거듭한 끝에 드디어 완성했기 때문에 그 과정을 소개했습니다.

    사전에 필요한 일


    프로그램 라이브러리


    구글 API 라이브러리 가져오기go get -u google.golang.org/api/oauth2/v2

    Google Developer Console


    구글 Developer Console에서 API Credentials 획득
    https://console.developers.google.com/apis/
    Credentials의 Authorised redirect URIs에서 이 안건에 사용할 리디렉션 URL을 등록합니다http://localhost:5001/loginr

    출처


    이런 애들 import.

    import (
        "net/http"
        "log"
      "fmt"
      "context"
      "golang.org/x/oauth2"
      "golang.org/x/oauth2/google"
      oauthapi "google.golang.org/api/oauth2/v2"
    )
    

    우선 로그인 페이지입니다.


    당신의 페이지에서 구글 로그인 페이지로 URL 만들기
    var conf = &oauth2.Config{
      ClientID:     "Your Client ID", //あなたのやつ
      ClientSecret: "Your Client Secret", //あなたのやつ
      Scopes:       []string{oauthapi.UserinfoEmailScope},
      Endpoint: google.Endpoint,
      RedirectURL : "http://localhost:5001/loginr",
    }
    
    //URLを作れるよ。 yourStateUUIDは本来はCSRF対策用UUIDを入れる。
    conf.AuthCodeURL("yourStateUUID", oauth2.AccessTypeOffline)
    
    이 URL을 적당한 a탭에 넣으면 구글의 로그인 페이지로 옮길 수 있다.
    아마 이런 URL이 있을 거예요.
    https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=Your+Client+ID&redirect_uri=http%3A%2F%2Flocalhost%3A5001%2Floginr&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email&state=yourStateUUIDroot@233cc47a021e

    페이지 방향 바꾸기


    구글 인증 후 구글은 방문 코드로 당신의 사이트로 리디렉션할 것입니다.
    서버에서는 액세스 코드를 읽고 구글에 연결해 사용자 정보를 얻는다.
    
    func LoginRHandler(w http.ResponseWriter, r *http.Request) {
      //パラメータからアクセスコードを読み取り
      code := r.URL.Query()["code"]
      if code == nil ||  len(code) == 0 {
        fmt.Fprint(w,"Invalid Parameter")
      }
      //いろいろライブラリが頑張って
      ctx := context.Background()
      tok, err := conf.Exchange(ctx, code[0])
      if err != nil {
      fmt.Fprintf(w,"OAuth Error:%v", err)
      }
      //APIクライアントができて
      client := conf.Client(ctx, tok)
      //Userinfo APIをGetしてDoして
      svr, err := oauthapi.New(client)
      ui, err := svr.Userinfo.Get().Do()
      if err != nil {
        fmt.Fprintf(w,"OAuth Error:%v", err)
      } else {
        //メールアドレス取得!
        fmt.Fprintf(w, "Your are logined as : %s",  ui.Email)
      }
    }
    
    다양한 Google API를 같은 형식으로 부르고 싶습니다.
    얻다

    마지막


    모든 소스가 여기 있어요.
    https://play.golang.org/p/ghQ0_5bdBQ4

    사절하다


    현대 문명을 모르는 아저씨가 쓰고 있어요.
    나는 젊었을 때 권투 카드가 주류였기 때문에 키타와 지트는 모두 문외한이었다.소홀함이 있더라도 좀 더 보고 부드럽게 지적해주면 좋겠다.

    좋은 웹페이지 즐겨찾기