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

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上创建项目并添加认证信息。



实施
クライアント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
推特应用程序接口
事先准备
- 
- Twitter应用程序
 
- 
- 创建项目
 
设置回调URL




实施
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


实施
アプリ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のソースを実行すると以下が表示されます

- twitterログインする

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

蛇的脚趾
- 
- 実際にサイトにもアカウントログインを追加してみました
 
構成:サーバーはGo言語、フロントはreact + redux
実装を確認したい場合は、githubから確認できます
https://github.com/wheatandcat/dotstamp_server
https://github.com/wheatandcat/dotstamp_client
实施的网站

 
    