0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go言語でSlackのOAuth2認証を使ってみた

Last updated at Posted at 2024-02-06

はじめに

前回は魔法のスプレッドシートの更新通知を流してくれるSlackAppを作成しました。

一般にSlack Appを公開するにはOAuth2.0認証をできるようにする必要があります。今回はGo言語でOAuth認証のためのサーバーを(サクッと?)立てる方法を解説していこうと思います。

完成したコードはGithub上で公開しているので参考程度にどうぞ。

環境

Golang 1.21.1
labstack/echo 4.11.4
slack-go/slack 0.12.3

今回はechoを用いてサーバーを立てましたが、Ginとかを使っても大体同じようなコードになると思うので適宜読み替えてください。

手順

基本的にドキュメントに従い実装していきます。

1. 必要な環境変数を設定

SlackAppの管理画面から

  • Client ID
  • Client Secret

の2つを取ってきます。

取ってきた値は.envなどに保存してGithub等にpushされないようにしておきましょう。

開発時には.envから環境変数を読み取れるようgodotenvを使用します。

if err := godotenv.Load(".env"); err != nil {
  panic(err)
}

2. 「SlackAppを追加」ボタンを配置

aタグを配置し、リンクを次のようにします。

`https://slack.com/oauth/v2/authorize?scope=${求める権限}&client_id=${Client IDの値}&redirect_uri=${Redirect URL}`

求める権限は、channels:readchat:writeなどです。
Redirect URLは、ユーザーがBotの認証を許可した場合に帰ってくるページのURLを指定します。SlackApp管理画面のRedirectURLに指定したURLの中の1つである必要があります。

ngrokなどで開発サーバーを公開しておくと開発環境でも実験が簡単にできて便利です。

3. コールバックのエンドポイントを作成

ユーザーがBotの認証を許可すると、RedirectURLにリダイレクトされます。このときクエリパラメータにcodeが記述されているため、これを取り出します。

code := context.QueryParam("code")

これを用いてoauth.v2.accessAPIを叩きます。

response, err := slack.GetOAuthV2ResponseContext(
  c.Request().Context(),
  new(http.Client),
  os.Getenv("SLACK_CLIENT_ID"),
  os.Getenv("SLACK_CLIENT_SECRET"),
  code,
  redirectTo,
)

これで上手く行くとレスポンスにはユーザーが属しているワークスペースのAccessTokenが返ってくるので、これ以降はそのアクセストークンを用いてSlackAPIを叩くことが出来ます。

最後に

今回はGo言語でSlackのOAuth2.0認証をできるようにしました。OAuth認証はTwitterに対してPythonで一度実装をしたことがあったため、概念の把握はすぐにできたのですが、Go特有の「HTMLに変数を埋め込むのってどうやるんだろう」みたいなので若干苦戦しました(まぁドキュメント読めば分かる話ですが)。
次回は、今回書くのをサボったテストを書いていこうと思います。

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?