使用Go语言对Google、Twitter和Facebook进行OAuth认证以获取电子邮件地址

概括

ダウンロード.png

GitHub

GitHub

我创建的示例可在此链接中找到:
https://github.com/wheatandcat/example-golang-oauth2

请在进行动作确认时,将conf/app_template.conf更改为conf/app.conf,并添加所需的设置。

所有步骤

    • 各APIが使用できるようにサービス登録

 

    Go言語からAPIを実装して認証ユーザのメールアドレスを取得

试试看到这个地方为止

使用Go语言进行Oauth认证

Go语言中的oauth2

使用GitHub上的golang/oauth2包来提供所需的Oauth2功能。

github.com/garyburd/go-oauth/oauth 的网址

Twitter使用了Oauth1.0认证
https://github.com/garyburd/go-oauth

Google API 谷歌API

前期准备

    在Google Cloud Platform上创建项目并添加认证信息。
ダウンロード (2).png
ダウンロード (3).png
ダウンロード (4).png

实施

クライアントIDとシークレットを設定

googleClientID = "xxxxxxxx"
googleClientSecret = "xxxxxxxx"
    接続設定
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
}
    コールバック
    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

推特应用程序接口

事先准备

    1. Twitter应用程序

 

    1. 创建项目

设置回调URL

ダウンロード (5).png
ダウンロード (6).png
ダウンロード (7).png
ダウンロード (8).png

实施

Consumer KeyとConsumer Secretを設定

twitterConsumerKey = "xxxxxxxx"
twitterConsumerSecret = "xxxxxxxx"
    接続設定
// 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
}
    コールバック
    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 开发者
2. 创建项目
3. 设置有效的 OAuth 重定向 URI

ダウンロード (9).png
ダウンロード (17).png

实施

アプリIDとapp secretを設定

twitterConsumerKey = "xxxxxxxx"
twitterConsumerSecret = "xxxxxxxx"
    接続設定
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
}
    コールバック
    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"]

样本

    githubのソースを実行すると以下が表示されます
ダウンロード (11).png
    twitterログインする
ダウンロード (13).png
    認証成功!アカウント情報が取得できます
ダウンロード (14).png

蛇的脚趾

    • 実際にサイトにもアカウントログインを追加してみました

構成:サーバーはGo言語、フロントはreact + redux

実装を確認したい場合は、githubから確認できます

https://github.com/wheatandcat/dotstamp_server
https://github.com/wheatandcat/dotstamp_client

实施的网站

ダウンロード (16).png
广告
将在 10 秒后关闭
bannerAds