Google OAuth를 통해 Golang에서 계정 공동 작업 수행

11888 단어 golangGoogletech

의 목적


Google 계정과 연합하기 위해 Google OAuth를 사용하여 Google 계정 ID를 얻습니다.
이번에는 GCP에서 응용 프로그램 설정을 생략했습니다.

대략적인 처리 절차의 정리


1: 서비스 API에 사용자 공동 작업 요청 보내기

2:state 토큰은 API에서 발행되며,state 토큰과scope,Client ID를 Google 계정의 로그인 화면 URL에 연결하고 프론트 데스크톱으로 돌아갑니다.

3: 되돌아오는 로그인 URL을 변경하고 동의를 구하는 화면을 표시하며, 확인 후 Google 인증 서버에서 Authorization code(이하 code 표시)를 발행합니다.

4: State 토큰과 Google에서 반환된 코드가 API 측에 전송되며, API 측은 이전에 자신이 발행한 state 토큰인지 여부를 판단합니다.

5: 확인 후 API를 통해 Google에 액세스하여 코드가 Google과 다를 것이 없음을 판단하고 사용자 정보를 반환합니다.

6: API 측에서 얻은 Google 계정 정보의 일부를 DB에 저장하고 로그인할 때 서비스의 UserID와 연결하여 협업을 완료합니다.
Google 계정도 로그인할 수 있습니다.

Google 계정 섹션 코드 가져오기


Google.go
package infrastructure

import (
	"context"
	"errors"

	"golang.org/x/oauth2"
	googleOAuth "golang.org/x/oauth2/google"
	v2 "google.golang.org/api/oauth2/v2"
)

type Google struct {
	Config *oauth2.Config
}

func NewGoogle(c *Config) *Google {
	return newGoogle(c)
}

func newGoogle(c *Config) *Google {

	google := &Google{
		Config: &oauth2.Config{
			ClientID:     c.Google.ClientID,
			ClientSecret: c.Google.ClientSecret,
			Endpoint:     googleOAuth.Endpoint,
			Scopes:       []string{"openid"},
			RedirectURL:  "http://localhost:8080/auth/callback/google",
		},
	}

	if google.Config == nil {
		panic("==== invalid key. google api ====")
	}

	return google
}

func (g *Google) GetLoginURL(state string) (clientID string) {
	return g.Config.AuthCodeURL(state)
}

func (g *Google) GetUserID(code string) (googleUserID string, err error) {

	cxt := context.Background()

	httpClient, _ := g.Config.Exchange(cxt, code)
	if httpClient == nil {
		return "", errors.New("接続エラー")
	}

	client := g.Config.Client(cxt, httpClient)

	service, err := v2.New(client)
	if err != nil {
		return "", errors.New("接続エラー")
	}

	userInfo, err := service.Tokeninfo().AccessToken(httpClient.AccessToken).Context(cxt).Do()
	if err != nil {
		return "", errors.New("接続エラー")
	}

	return userInfo.UserId, nil
}

기본 설명은 문서를 참고했다.
userInfo, err := service.Tokeninfo().AccessToken(httpClient.AccessToken).Context(cxt).Do()
이 위치에서 얻은 구조체는 아래 구조체로 되돌아온다(봉인에서 발췌)
google.golang.org/api/oauth2/v2
type Tokeninfo struct {
	Audience string `json:"audience,omitempty"`
	Email string `json:"email,omitempty"`
	ExpiresIn int64 `json:"expires_in,omitempty"`
	IssuedTo string `json:"issued_to,omitempty"`
	Scope string `json:"scope,omitempty"`
	UserId string `json:"user_id,omitempty"`
	VerifiedEmail bool `json:"verified_email,omitempty"`
	googleapi.ServerResponse `json:"-"`
	ForceSendFields []string `json:"-"`
	NullFields []string `json:"-"`
}
이번에 에서 UserId를 얻었고 서비스의 UserID를 연결했다.

총결산


·state 하드웨어 API 측에서 발행하고 API 측은 불법 방문이 아니라 조작된 사용자라고 판단한다.
・Authorization code 인증 서버(이번에는 구글 측)가 발행한 것으로, Google이 이 서비스의 정당성을 확인하기 위해 발행한 것이다
이번 목적은 Google 계정과 서비스의 UserID를 연결하는 것이기 때문에 Google 계정의 UserId가 아니라 기호화폐를 방문하는 것이 비교적 좋다는 등 인정과 인증 등 내용을 총괄하고 싶습니다.

좋은 웹페이지 즐겨찾기