Help us understand the problem. What is going on with this article?

Go言語でGoogle,Twitter,FacebookのOauth認証をしてメールアドレスを取得するまで

More than 1 year has passed since last update.

概要

Go言語で、こういうのやりたい!
ダウンロード.png

github

今回作ったサンプルは、こちらにあります
https://github.com/wheatandcat/example-golang-oauth2

※動作確認時はconf/app_template.conf → conf/app.confに変更して、 必要な設定を追加して下さい

全体の手順

  • 各APIが使用できるようにサービス登録
  • Go言語からAPIを実装して認証ユーザのメールアドレスを取得

ここまでやってみる

Go言語でOauth認証

golang/oauth2

公式で提供しているOauth2パッケージを使う
https://github.com/golang/oauth2/

github.com/garyburd/go-oauth/oauth

twitterはOauth1.0認証を使用
https://github.com/garyburd/go-oauth

Google API

事前準備

  1. Google Cloud Platform
  2. プロジェクトを作成し、認証情報追加

ダウンロード (2).png
3. ドメインリダイレクトURLを設定

ダウンロード (3).png
4. クライアントIDシークレットを確認

ダウンロード (4).png

実装

  • クライアントIDシークレットを設定
example-golang-oauth2/conf/app.conf
googleClientID = "xxxxxxxx"
googleClientSecret = "xxxxxxxx"
  • 接続設定
example-golang-oauth2/lib/google/main.go
const (
    authorizeEndpoint = "https://accounts.google.com/o/oauth2/v2/auth"
    tokenEndpoint     = "https://www.googleapis.com/oauth2/v4/token"
)

// GetConnect 接続を取得する
func GetConnect() *oauth2.Config {
    config := &oauth2.Config{
        ClientID:     beego.AppConfig.String("googleClientID"),
        ClientSecret: beego.AppConfig.String("googleClientSecret"),
        Endpoint: oauth2.Endpoint{
            AuthURL:  authorizeEndpoint,
            TokenURL: tokenEndpoint,
        },
        Scopes:      []string{"openid", "email", "profile"},
        RedirectURL: "http://localhost:8080/google/callback",
    }

    return config
}
  • コールバック
example-golang-oauth2/controllers/google/callback.go
    config := google.GetConnect()

    context := context.Background()

    tok, err := config.Exchange(context, request.Code)
    if err != nil {
        panic(err)
    }

    if tok.Valid() == false {
        panic(errors.New("vaild token"))
    }

    service, _ := v2.New(config.Client(context, tok))
    tokenInfo, _ := service.Tokeninfo().AccessToken(tok.AccessToken).Context(context).Do()

    c.Data["ID"] = tokenInfo.UserId
    c.Data["Email"] = tokenInfo.Email

Twitter API

事前準備

  1. Twitter Apps
  2. プロジェクト作成
  3. Callback URLを設定

ダウンロード (5).png
4. メールアドレスを取得できるようにするためにPrivacy Policy URLTerms of Service URLに設定

ダウンロード (6).png
5. permissionsのAccessをRead, Write and Access direct messagesに変更

ダウンロード (7).png
6. Consumer KeyConsumer Secretを確認

ダウンロード (8).png

実装

  • Consumer KeyConsumer Secretを設定
example-golang-oauth2/conf/app.conf
twitterConsumerKey = "xxxxxxxx"
twitterConsumerSecret = "xxxxxxxx"
  • 接続設定
example-golang-oauth2/lib/twitter/main.go
// GetConnect 接続を取得する
func GetConnect() *oauth.Client {
    return &oauth.Client{
        TemporaryCredentialRequestURI: "https://api.twitter.com/oauth/request_token",
        ResourceOwnerAuthorizationURI: "https://api.twitter.com/oauth/authorize",
        TokenRequestURI:               "https://api.twitter.com/oauth/access_token",
        Credentials: oauth.Credentials{
            Token:  tempCredKey,
            Secret: tokenCredKey,
        },
    }
}

// GetAccessToken アクセストークンを取得する
func GetAccessToken(rt *oauth.Credentials, oauthVerifier string) (*oauth.Credentials, error) {
    oc := GetConnect()
    at, _, err := oc.RequestToken(nil, rt, oauthVerifier)

    return at, err
}

// GetMe 自身を取得する
func GetMe(at *oauth.Credentials, user *Account) error {
    oc := GetConnect()

    v := url.Values{}
    v.Set("include_email", "true")

    resp, err := oc.Get(nil, at, "https://api.twitter.com/1.1/account/verify_credentials.json", v)
    if err != nil {
        return err
    }
    defer resp.Body.Close()

    if resp.StatusCode >= 500 {
        return errors.New("Twitter is unavailable")
    }

    if resp.StatusCode >= 400 {
        return errors.New("Twitter request is invalid")
    }

    err = json.NewDecoder(resp.Body).Decode(user)
    if err != nil {
        return err
    }

    return nil
}
  • コールバック
example-golang-oauth2/controllers/twitter/callback.go
    at, err := twitter.GetAccessToken(
        &oauth.Credentials{
            Token:  c.CruSession.Get("request_token").(string),
            Secret: c.CruSession.Get("request_token_secret").(string),
        },
        request.Verifier,
    )
    if err != nil {
        panic(err)
    }

    c.CruSession.Set("oauth_secret", at.Secret)
    c.CruSession.Set("oauth_token", at.Token)

    account := twitter.Account{}
    if err = twitter.GetMe(at, &account); err != nil {
        panic(err)
    }

    c.Data["ID"] = account.ID
    c.Data["ProfileImageURL"] = account.ProfileImageURL
    c.Data["ScreenName"] = account.ScreenName
    c.Data["Email"] = account.Email

Facebook API

事前準備

1, Facebook Developers
2. プロジェクト作成
3. 有効なOAuthリダイレクトURIを設定

ダウンロード (9).png
4. アプリIDapp secretを確認

ダウンロード (17).png

実装

  • アプリIDapp secretを設定
example-golang-oauth2/conf/app.conf
twitterConsumerKey = "xxxxxxxx"
twitterConsumerSecret = "xxxxxxxx"
  • 接続設定
example-golang-oauth2/lib/facebook/main.go
const (
    authorizeEndpoint = "https://www.facebook.com/dialog/oauth"
    tokenEndpoint     = "https://graph.facebook.com/oauth/access_token"
)

// GetConnect 接続を取得する
func GetConnect() *oauth2.Config {
    config := &oauth2.Config{
        ClientID:     beego.AppConfig.String("facebookClientID"),
        ClientSecret: beego.AppConfig.String("facebookClientSecret"),
        Endpoint: oauth2.Endpoint{
            AuthURL:  authorizeEndpoint,
            TokenURL: tokenEndpoint,
        },
        Scopes:      []string{"email"},
        RedirectURL: "http://localhost:8080/facebook/callback",
    }

    return config
}
  • コールバック
example-golang-oauth2/controllers/twitter/callback.go
    config := facebook.GetConnect()

    tok, err := config.Exchange(oauth2.NoContext, request.Code)
    if err != nil {
        panic(err)
    }

    if tok.Valid() == false {
        panic(errors.New("vaild token"))
    }

    client := config.Client(oauth2.NoContext, tok)
    session := &fb.Session{
        Version:    "v2.8",
        HttpClient: client,
    }

    res, err := session.Get("/me?fields=id,name,email", nil)
    if err != nil {
        panic(err)
    }

    c.Data["ID"] = res["id"]
    c.Data["Name"] = res["name"]
    c.Data["Email"] = res["email"]

サンプル

https://github.com/wheatandcat/example-golang-oauth2

  • githubのソースを実行すると以下が表示されます

ダウンロード (11).png

  • twitterログインする

ダウンロード (13).png

  • 認証成功!アカウント情報が取得できます

ダウンロード (14).png

蛇足

実装サイト

https://dotstamp.com/login/login

ダウンロード (16).png

wheatandcat
メインはReact-Native、NuxtJS、Golangとかやってます https://www.wheatandcat.me/
https://www.wheatandcat.me/
sharefull
短期間・短時間の仕事に特化したオンデマンドマッチングプラットフォーム「シェアフル」を開発中の、パーソルグループとランサーズの合弁会社
https://sharefull.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした