はじめに
本記事はAizu Advent Calendar 2025 9日目の記事です。
私と二枚貝氏(@hotate29)で運営している会津大生向けの大学非公式Discordコミュニティ「UoAの集い / UoA Hub」は、2025年3月9日の設立から今日でちょうど9ヶ月が経ち、現在111人(2025年12月9日現在)の学生(大学院生・留学生含む)に参加していただいています。ありがとうございます!
さて、サーバーの規模が大きくなるにつれ、「本当に全員が会津大生なのか?」というセキュリティ上の問題が浮上してきました。そもそも大学のコミュニティなのに、外部の人間がいる中であまり身近な話はしにくいですよね。少なくとも自分はそう思います。
また、これが起因して参加者同士のコミュニケーションを阻害しているのではないかとも考えました。コミュニティにおいて過疎化は何としてでも解決しなければならない課題の一つです。
そこで、コミュニティの信頼とセキュリティ向上のため、大学のメールアドレスを使った認証システムを開発・導入しました。
本記事では、メール認証システム導入に至った背景から技術スタック、開発中に発生した問題についてお話しします。
「メンバー認証」が必要な理由
設立当初から、メンバー認証を必須としていたUoAの集いですが、これには理由が大きく分けて2つあります。
1つ目は「レイド(荒らし)が発生する可能性」です。2025年3月当時、会津大の在学生や新入生同士の交流がX上で盛んに行われていたため、Discordの招待リンクをX上で公開していました。しかしながら、XのようなSNSの不特定多数が閲覧できる環境でリンクを公開していると、どんな人が参加してくるかわかりません。それが悪意を持った第三者であった場合、スパムや個人情報漏えいの標的になり得ると考えました。よって、XのIDや参加経路からその人が本人かどうかを確認する必要がありました。
2つ目は「プライバシー上の問題」です。冒頭の「はじめに」でも述べた通り、外部の人間がいる中であまり身近な話はしにくいという懸念がありました。大学コミュニティという特性上、現実に結び付きやすい会話をすることが多くなります。私自身、見ず知らずの第三者が閲覧できる公開されたインターネット上で現実の写真や氏名、現在位置などを共有するのは今まで受けてきたネットリテラシー教育からかなり抵抗があるため、そういった方々のためにも安心安全な空間を用意することは重要なことでした。
以上の理由からメンバー認証を必須としていましたが、これにも問題が多くありました。次の項目でそれについての対応策とそれに至った理由をご紹介します。
なぜ「メール認証」を選んだのか?
設立当初からメール認証システムを導入するまで、管理者ロールを持つメンバーが手動で会津大生かどうかの確認とメンバーロールの付与をおこなっていました。しかしながら、これにはいくつかの問題点がありました。
1つ目は「セキュリティと信頼性の限界」です。手動での確認やSNSのIDや参加経路を聞くといった確認方法では、なりすましにより部外者が参加するリスクを完全に排除できませんでした。
2つ目は「認証の困難さ」です。新規参加者からするとどうやって自分が会津大生かどうか証明する方法が困難で、他のユーザに聞くこともできないため玄関チャンネルで立ち往生しているという問題が生じていました。
これらの問題を解決するために、確実に会津大生であることが確認でき、自動的にメンバーロールを付与できる「大学メールアドレスによる認証システム」の開発を決めました。
技術スタックとフローチャート
技術スタック
Language: JavaScript
Frontend: HTML, CSS, JavaScript(認証ページにおいて使用)
Backend: Cloudflare Workers, Google Apps Script, JavaScript
Tools: Google Sheets
Other: Discord API
フローチャート
開発中に起こった問題
認証メールが届かない
開発当初、某先輩がすこぶるオススメしていたCloudflare Workersをメインに作ろうとしていました。しかしながら、Cloudflare Workersからメール送信サービス「Resend」を経由し、先日取得した私の独自ドメインである"yonu.work”で大学のメールアドレス宛てに認証メールを送信した際、メールが届かないという問題が発生しました。
.workドメインは2015年にできた新gTLDなので、.comや.jpほど信頼性がありません。そのため.workドメインが、大学側のメールフィルタリング設定において、スパムとして扱われブロックされているのではないかと考えました。
とりあえず独自ドメインでのメール配信は諦めて、Google Apps Script (GAS)を経路してGmailでのメール配信に切り替えるためGASへコードを移しました。しかし、GASからのリクエストがDiscord側にはじかれてしまうという問題が起きました。これによりDiscordへのロール付与がうまくいかない事態に直面しました。
以上のことから、Cloudflare WorkersとGASに役割を分担させ、それぞれの得意な処理に限定するハイブリッド構成を採用しました。
-
Cloudflare Workers:Discord API通信と、メインロジック処理を担当
-
Google Apps Script (GAS):gmail.comドメインでのメール配信
おわりに
今回はAizu Advent Calendar 2025という面白そうな企画があったので参加させていただきました。また、12月9日はちょうどUoAの集いDiscordサーバー設立から9か月の節目ということで、このような題材で書かせていただきました。具体的なコードについてはセキュリティ上の観点から掲載を控えることになってしまいましたが、ご理解いただけると幸いです。
宣伝
会津大生のための非公式情報共有・交流コミュニティです!
学食メニュー通知機能やレベリング機能など楽しい機能が盛り沢山!
ぜひご参加ください!
