使用Golang和OAuth2.0与Google一起创造她

目的

我是一个业余的大叔,但我学会了如何使用golang和Google的OAuth2.0来获取用户信息。

文化、社会或环境条件相应的事物。

    • Google提供のLibraryをちゃんと使いたい

Libraryちゃんと使ったサンプルがあまり見当たらず

説明を省略しないで動くソースを示してほしい

公式サイトも途中で「以下省略」

作为一名业余者的我迷失了方向… 经过一番试验和错误,总算完成了,现在我将介绍一下整个过程。

事前需要做的事情

图书馆

获取Google API的库
go get -u google.golang.org/api/oauth2/v2

谷歌开发者控制台 zhě

从Google开发者控制台获取API的凭据
https://console.developers.google.com/apis/

在Credentials的授权重定向URL中,注册用于此事的重定向URL http://localhost:5001/loginr。

提供中文资料

将这样的孩子引进

import (
    "net/http"
    "log"
  "fmt"
  "context"
  "golang.org/x/oauth2"
  "golang.org/x/oauth2/google"
  oauthapi "google.golang.org/api/oauth2/v2"
)

首先是登录页面

我会制作一个可以从你的页面跳转到Google登录页面的URL。

var conf = &oauth2.Config{
  ClientID:     "Your Client ID", //あなたのやつ
  ClientSecret: "Your Client Secret", //あなたのやつ
  Scopes:       []string{oauthapi.UserinfoEmailScope},
  Endpoint: google.Endpoint,
  RedirectURL : "http://localhost:5001/loginr",
}

//URLを作れるよ。 yourStateUUIDは本来はCSRF対策用UUIDを入れる。
conf.AuthCodeURL("yourStateUUID", oauth2.AccessTypeOffline)

如果把这个URL放在任意的标签中,就可以跳转到Google的登录页面。

大概应该会生成这样的URL:

https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=你的客户端ID&redirect_uri=http%3A%2F%2Flocalhost%3A5001%2Floginr&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email&state=你的状态UUIDroot@233cc47a021e

重定向页面

Google在验证之后,会使用带有访问代码的重定向方式将您重定向到您指定的网站(重定向URL)。
服务器端会读取该访问代码,并与Google连接以获取用户信息。


func LoginRHandler(w http.ResponseWriter, r *http.Request) {
  //パラメータからアクセスコードを読み取り
  code := r.URL.Query()["code"]
  if code == nil ||  len(code) == 0 {
    fmt.Fprint(w,"Invalid Parameter")
  }
  //いろいろライブラリが頑張って
  ctx := context.Background()
  tok, err := conf.Exchange(ctx, code[0])
  if err != nil {
  fmt.Fprintf(w,"OAuth Error:%v", err)
  }
  //APIクライアントができて
  client := conf.Client(ctx, tok)
  //Userinfo APIをGetしてDoして
  svr, err := oauthapi.New(client)
  ui, err := svr.Userinfo.Get().Do()
  if err != nil {
    fmt.Fprintf(w,"OAuth Error:%v", err)
  } else {
    //メールアドレス取得!
    fmt.Fprintf(w, "Your are logined as : %s",  ui.Email)
  }
}

我认为可以以相同的方式调用各种谷歌 API,进行获取并执行。

最终

所有源代码在这里https://play.golang.org/p/ghQ0_5bdBQ4

抱歉

写这篇文章的是一个对现代文明不太熟悉的叔叔。
在我年轻的时候,打孔卡片是主流,所以我对键盘和电脑都不是很熟悉。如果有任何错误或疏漏,请多多包涵并温柔地指正,我将不胜感激。

bannerAds