Google OAuth를 통해 Golang에서 계정 공동 작업 수행
의 목적
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가 아니라 기호화폐를 방문하는 것이 비교적 좋다는 등 인정과 인증 등 내용을 총괄하고 싶습니다.
Reference
이 문제에 관하여(Google OAuth를 통해 Golang에서 계정 공동 작업 수행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/sgtkuc1118/articles/693e2930f8151c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)