go-github
googleがgo-githubというgithub clientを作っているのでこれを使ってみます。
実装
ログインリンク生成
「The go-github library does not directly handle authentication.」とのことで、
認証はgoauth2などを使う必要があります。
# Routes
GET / App.Index
* /:controller/:action :controller.:action
があるとして、
// app/controllers/app.go
import (
"code.google.com/p/goauth2/oauth"
"github.com/google/go-github/github"
// ...
)
var GITHUB = &oauth.Config{
ClientId: "***",
ClientSecret: "******",
AuthURL: "https://github.com/login/oauth/authorize",
TokenURL: "https://github.com/login/oauth/access_token",
RedirectURL: "http://localhost:9000/App/Auth",
}
// ...
func (c App) Index() revel.Result {
url := GITHUB.AuthCodeURL("")
return c.Render(url)
}
<a href="{{.url}}">ログイン</a>
のようにすると、ログイン用のリンクが生成できます。
ここで実際に使われているのはClientIdとAuthURLで、RedirectURLはつけた場合に使われます。
トークンの取得
func (c App) Auth(code string) revel.Result {
token, _ := &oauth.Transport{Config: GITHUB}.Exchange(code)
accessToken := token.AccessToken
// ...
}
ログインリンクを押して認証されると、githubからRedirectURLにリダイレクトされてきます。
そのとき、codeというパラメータが来るので、それを引数にしてExchangeすると、codeとClientIdとClientSecretが送信され、アクセストークンが取得できます。
APIを使う
アクセストークンがあると以下のようにしてAPIを使えます
transport = &oauth.Transport{
Token: &oauth.Token{AccessToken: accessToken},
}
client := github.NewClient(transport.Client())
repos, _, _ := client.Repositories.List("octocat", nil)
for _, repo := range repos {
fmt.Println(*repo.Name)
}
// 以下のようなログが出る
// git-consortium
// Hello-World
// octocat.github.io
// Spoon-Knife
APIの詳しい使い方はこちら
まとめ
RevelでGithub APIを使うときは、goauth2で認証してアクセストークンを取得し、go-githubでAPIを呼びましょう