🐙
goでslack認証を実装する方法
golangでslackの認証機能を作成したかったのですが、実装している記事を見つけることができなかったので記事として公開することにしました
webフレームワークはginを使用しています
フロントはReactで実装しました(と言ってもボタンをおいただけです)
実装を始める前に
goとReactの最低限の環境を作っておきましょう
slack側の用意
Slackにログインする
連携したいSlackのチームにログインをしておいてください
連携用の鍵を作成する
以下にアクセスして Create Nes App を押下し、認証用の鍵を作成します
リダイレクト先URLを設定する
- Your Apps から先ほど作った App の名前のリンクをクリックします
- サイドバーのOAuth & Permissionsをクリックします
ここではあとで実装するAPIのURLを入力します
※localhostのURLは登録できないので注意してください。自分はngrokを使用して、URLを設定したのですが、開発のたびにリダイレクトURLを設定しないと行けないのがめんどくさいです。。
Slack認証ページに遷移するためのURLをコピーする
- サイドバーのManage Distributionをクリックします
-
Embeddable Slack ButtonをコピーしてReactディレクトリに適当に貼り付けてしまいましょう
試しにこのボタンををクリックするとおなじみの認証ページに遷移するはずです
allowをクリックするとコールバックURLへ遷移するはずです
goでの実装
認証機能の実装
slack-goというパッケージをインストールします
$ go get -u github.com/slack-go/slack
リダイレクトURLを受け取るためのエンドポイントを実装する
次にSlack認証ページで認証した後にリダイレクトURLが返って来た時の処理実装します
AuthController
func (ac AuthController) SlackAuth(c *gin.Context) {
res, _ := slack.GetOAuthV2Response(http.DefaultClient, os.Getenv("SLACK_CLIENT_ID"), os.Getenv("SLACK_SECRET_KEY"), c.Query("code"), os.Getenv("SLACK_REDIRECT_URI"))
slackApi := slack.New(res.AccessToken)
userInfo, _ := slackApi.GetUserInfo(res.AuthedUser.ID)
fmt.Println(userInfo)
}
これでslack認証は完了です
今回はログインしたユーザーの情報を取得するまでを実装しました
実装は全く難しくありません
- slack apiのBasic Informationタブのclient_id, secret_keyをコピーして環境変数で管理します
- codeに関してはリダイレクトされるときにqueryとしてcodeがついてくるのでそれを使用します
codeはhttps://api.slack.com/legacy/oauthによると一時的な認証コードのことを指すそうで、OAuthResponseの時に必須のパラメーターになります - 最後に前に設定したリダイレクトURLを設定すればGetOAuthV2Responseを使用することができます
-
GetOAuthV2Response
は返り値で認証したaccessToken, UserのIDを返してくれるので、それをGetUserInfoを使用してアカウント情報を取得することができます
※ここで取得するaccessTokenは有効期限がありません
以上で認証機能の実装は終わりです。
実装自体は難しくないのですが、初めてSlack認証をする人で、OAuthが初めての人には流れを知るまでが一番難しいところかなと思いました
こまで来たらあとはデータベースに取得した情報を保存したり、フロントエンドにRedirectしたりする処理を追加すると良いと思います
参考記事
Discussion