使用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