🐙

goでslack認証を実装する方法

2022/05/29に公開

golangでslackの認証機能を作成したかったのですが、実装している記事を見つけることができなかったので記事として公開することにしました
webフレームワークはginを使用しています
フロントはReactで実装しました(と言ってもボタンをおいただけです)

実装を始める前に

goとReactの最低限の環境を作っておきましょう
https://gin-gonic.com/docs/quickstart/
https://create-react-app.dev/docs/adding-typescript/

slack側の用意

https://qiita.com/mksava/items/b0031894375616077fc4#slack-側の用意

Slackにログインする

連携したいSlackのチームにログインをしておいてください
https://slack.com/intl/ja-jp/

連携用の鍵を作成する

以下にアクセスして Create Nes App を押下し、認証用の鍵を作成します
https://api.slack.com/apps

リダイレクト先URLを設定する

  1. Your Apps から先ほど作った App の名前のリンクをクリックします
  2. サイドバーのOAuth & Permissionsをクリックします
    ここではあとで実装するAPIのURLを入力します
    ※localhostのURLは登録できないので注意してください。自分はngrokを使用して、URLを設定したのですが、開発のたびにリダイレクトURLを設定しないと行けないのがめんどくさいです。。

Slack認証ページに遷移するためのURLをコピーする

  1. サイドバーのManage Distributionをクリックします
  2. 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認証は完了です
今回はログインしたユーザーの情報を取得するまでを実装しました
実装は全く難しくありません

  1. slack apiのBasic Informationタブのclient_id, secret_keyをコピーして環境変数で管理します
  2. codeに関してはリダイレクトされるときにqueryとしてcodeがついてくるのでそれを使用します
    codeはhttps://api.slack.com/legacy/oauthによると一時的な認証コードのことを指すそうで、OAuthResponseの時に必須のパラメーターになります
  3. 最後に前に設定したリダイレクトURLを設定すればGetOAuthV2Responseを使用することができます
  4. GetOAuthV2Responseは返り値で認証したaccessToken, UserのIDを返してくれるので、それをGetUserInfoを使用してアカウント情報を取得することができます
    ※ここで取得するaccessTokenは有効期限がありません

以上で認証機能の実装は終わりです。
実装自体は難しくないのですが、初めてSlack認証をする人で、OAuthが初めての人には流れを知るまでが一番難しいところかなと思いました
こまで来たらあとはデータベースに取得した情報を保存したり、フロントエンドにRedirectしたりする処理を追加すると良いと思います

参考記事

https://slack.dev/java-slack-sdk/guides/ja/sign-in-with-slack
https://qiita.com/mksava/items/b0031894375616077fc4
https://api.slack.com/legacy/oauth

GitHubで編集を提案

Discussion