Logto は、モダンなアプリや SaaS 製品向けに設計された Auth0 の代替です。 Cloud と オープンソース の両方のサービスを提供し、アイデンティティと管理 (IAM) システムを迅速に立ち上げるのに役立ちます。認証 (Authentication)、認可 (Authorization)、マルチテナント管理を すべて一つに まとめて楽しんでください。
Logto Cloud で無料の開発テナントから始めることをお勧めします。これにより、すべての機能を簡単に探索できます。
この記事では、Go と Logto を使用して、Microsoft Entra ID OIDC enterprise SSO サインイン体験(ユーザー認証 (Authentication))を迅速に構築する手順を説明します。
前提条件
- 稼働中の Logto インスタンス。紹介ページ をチェックして始めてください。
- Go の基本的な知識。
- 使用可能な Microsoft Entra ID OIDC enterprise SSO アカウント。
Create an application in Logto
Logto は OpenID Connect (OIDC) 認証 (Authentication) と OAuth 2.0 認可 (Authorization) に基づいています。これは、複数のアプリケーション間でのフェデレーテッドアイデンティティ管理をサポートし、一般的にシングルサインオン (SSO) と呼ばれます。
あなたの Traditional web アプリケーションを作成するには、次の手順に従ってください:
- Logto コンソール を開きます。「Get started」セクションで、「View all」リンクをクリックしてアプリケーションフレームワークのリストを開きます。あるいは、Logto Console > Applications に移動し、「Create application」ボタンをクリックします。
- 開いたモーダルで、左側のクイックフィルターチェックボックスを使用して、利用可能なすべての "Traditional web" フレームワークをフィルタリングするか、"Traditional web" セクションをクリックします。"Go" フレームワークカードをクリックして、アプリケーションの作成を開始します。
- アプリケーション名を入力します。例:「Bookstore」と入力し、「Create application」をクリックします。
🎉 タダーン!Logto で最初のアプリケーションを作成しました。詳細な統合ガイドを含むお祝いページが表示されます。ガイドに従って、アプリケーションでの体験を確認してください。
Integrate Go SDK
- 以下のデモは Gin Web Framework を基盤としています。同じ手順で他のフレームワークにも Logto を統合できます。
- Go のサンプルプロジェクトは Go SDK リポジトリ で利用できます。
インストール
プロジェクトのルートディレクトリで次のコマンドを実行します:
# 事前定義された値や型へアクセスするためのコアパッケージをインストール
go get github.com/logto-io/go/v2/core
# Logto と連携するためのクライアントパッケージをインストール
go get github.com/logto-io/go/v2/client
アプリケーションコードに github.com/logto-io/go/v2/core
および github.com/logto-io/go/v2/client
パッケージを追加します:
// main.go
package main
import (
"github.com/gin-gonic/gin"
// 依存関係を追加
"github.com/logto-io/go/v2/core"
"github.com/logto-io/go/v2/client"
)
func main() {
router := gin.Default()
router.GET("/", func(c *gin.Context) {
c.String(200, "Hello Logto!")
})
router.Run(":3000")
}
セッションストレージを作成する
従来の Web アプリケーションでは、ユーザーの認証 (Authentication) 情報はユーザーセッションに保存されます。
Logto SDK では Storage
インターフェースが提供されており、Web フレームワークに合わせて Storage
アダプターを実装することで、Logto SDK がユーザーの認証 (Authentication) 情報をセッションに保存できるようになります。
Logto によって保存されるユーザー認証 (Authentication) 情報はクッキーのサイズ制限を超える可能性があるため、クッキー ベースのセッションの使用は推奨しません。 この例ではメモリ ベースのセッションを使用しています。実運用では必要に応じて Redis や MongoDB などの技術を使ってセッションを保存できます。
Logto SDK の Storage
型は次のとおりです:
package client
type Storage interface {
GetItem(key string) string
SetItem(key, value string)
}
github.com/gin-contrib/sessions ミドルウェアを例として、このプロセスを説明します。
ミドルウェアをアプリケーションに適用することで、ルートハンドラー内でユーザーリクエストコンテキストからユーザーセッションを取得できます:
package main
import (
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/memstore"
"github.com/gin-gonic/gin"
"github.com/logto-io/go/v2/client"
)
func main() {
router := gin.Default()
// この例ではメモリ ベースのセッションを使用します
store := memstore.NewStore([]byte("your session secret"))
router.Use(sessions.Sessions("logto-session", store))
router.GET("/", func(ctx *gin.Context) {
// ユーザーセッションを取得
session := sessions.Default(ctx)
// ...
ctx.String(200, "Hello Logto!")
})
router.Run(":3000")
}
session_storage.go
ファイルを作成し、SessionStorage
を定義して Logto SDK の Storage
インターフェースを実装します:
package main
import (
"github.com/gin-contrib/sessions"
)
type SessionStorage struct {
session sessions.Session
}
func (storage *SessionStorage) GetItem(key string) string {
value := storage.session.Get(key)
if value == nil {
return ""
}
return value.(string)
}
func (storage *SessionStorage) SetItem(key, value string) {
storage.session.Set(key, value)
storage.session.Save()
}
これで、ルートハンドラー内で Logto 用のセッションストレージを作成できます:
session := sessions.Default(ctx)
sessionStorage := &SessionStorage{session: session}
LogtoClient を初期化する
まず、Logto の設定を作成します:
func main() {
// ...
logtoConfig := &client.LogtoConfig{
Endpoint: "<your-logto-endpoint>", // 例: http://localhost:3001
AppId: "<your-application-id>",
AppSecret: "<your-application-secret>",
}
// ...
}
「App Secret」は管理コンソールのアプリケーション詳細ページから見つけてコピーできます:

次に、上記の Logto 設定を使用して、各ユーザーリクエストに対して LogtoClient
を作成できます:
func main() {
// ...
router.GET("/", func(ctx *gin.Context) {
// LogtoClient を作成
session := sessions.Default(ctx)
logtoClient := client.NewLogtoClient(
logtoConfig,
&SessionStorage{session: session},
)
// Logto を使用してホームページのコンテンツを制御
authState := "このウェブサイトにログインしていません。 :("
if logtoClient.IsAuthenticated() {
authState = "このウェブサイトにログインしています! :)"
}
homePage := `<h1>Hello Logto</h1>` +
"<div>" + authState + "</div>"
ctx.Data(http.StatusOK, "text/html; charset=utf-8", []byte(homePage))
})
// ...
}
サインインルートを実装する
リダイレクト URI が設定された後、サインインリクエストを処理するために sign-in
ルートを追加し、ホームページにサインインリンクも追加します:
func main() {
// ...
// ホームページにサインインリクエストを実行するリンクを追加
router.GET("/", func(ctx *gin.Context) {
// ...
homePage := `<h1>Hello Logto</h1>` +
"<div>" + authState + "</div>" +
// リンクを追加
`<div><a href="/sign-in">Sign In</a></div>`
ctx.Data(http.StatusOK, "text/html; charset=utf-8", []byte(homePage))
})
// サインインリクエストを処理するためのルートを追加
router.GET("/sign-in", func(ctx *gin.Context) {
session := sessions.Default(ctx)
logtoClient := client.NewLogtoClient(
logtoConfig,
&SessionStorage{session: session},
)
// サインインリクエストは Logto によって処理されます。
// ユーザーはサインイン後にリダイレクト URI にリダイレクトされます。
signInUri, err := logtoClient.SignIn("http://localhost:3000/callback")
if err != nil {
ctx.String(http.StatusInternalServerError, err.Error())
return
}
// ユーザーを Logto サインインページにリダイレクトします。
ctx.Redirect(http.StatusTemporaryRedirect, signInUri)
})
// ...
}
これで、ユーザーが http://localhost:3000/sign-in
にアクセスすると、Logto サインインページにリダイレクトされます。
コールバックルートを実装する
ユーザーが Logto のサインインページで正常にサインインすると、Logto はユーザーをリダイレクト URI にリダイレクトします。
リダイレクト URI が http://localhost:3000/callback
であるため、サインイン後のコールバックを処理するために /callback
ルートを追加します。
func main() {
// ...
// サインインコールバックリクエストを処理するためのルートを追加
router.GET("/callback", func(ctx *gin.Context) {
session := sessions.Default(ctx)
logtoClient := client.NewLogtoClient(
logtoConfig,
&SessionStorage{session: session},
)
// サインインコールバックリクエストは Logto によって処理されます
err := logtoClient.HandleSignInCallback(ctx.Request)
if err != nil {
ctx.String(http.StatusInternalServerError, err.Error())
return
}
// 開発者が指定したページにジャンプします。
// この例では、ユーザーをホームページに戻します。
ctx.Redirect(http.StatusTemporaryRedirect, "/")
})
// ...
}
サインアウトルートを実装する
ユーザーがサインアウトすると、Logto はユーザーをポストサインアウトリダイレクト URI にリダイレクトします。
次に、sign-out
ルートを追加してサインアウトリクエストを処理し、ホームページにサインアウトリンクを追加しましょう:
func main() {
// ...
// ホームページにサインアウトリクエストを実行するリンクを追加
router.GET("/", func(ctx *gin.Context) {
// ...
homePage := `<h1>Hello Logto</h1>` +
"<div>" + authState + "</div>" +
`<div><a href="/sign-in">Sign In</a></div>` +
// リンクを追加
`<div><a href="/sign-out">Sign Out</a></div>`
ctx.Data(http.StatusOK, "text/html; charset=utf-8", []byte(homePage))
})
// サインアウトリクエストを処理するルートを追加
router.GET("/sign-out", func(ctx *gin.Context) {
session := sessions.Default(ctx)
logtoClient := client.NewLogtoClient(
logtoConfig,
&SessionStorage{session: session},
)
// サインアウトリクエストは Logto によって処理されます。
// サインアウト後、ユーザーはポストサインアウトリダイレクト URI にリダイレクトされます。
signOutUri, signOutErr := logtoClient.SignOut("http://localhost:3000")
if signOutErr != nil {
ctx.String(http.StatusOK, signOutErr.Error())
return
}
ctx.Redirect(http.StatusTemporaryRedirect, signOutUri)
})
// ...
}
ユーザーがサインアウトリクエストを行った後、Logto はセッション内のすべてのユーザー認証情報をクリアします。
チェックポイント: アプリケーションをテストする
これで、アプリケーションをテストできます:
- アプリケーションを実行すると、サインインボタンが表示されます。
- サインインボタンをクリックすると、SDK がサインインプロセスを初期化し、Logto のサインインページにリダイレクトされます。
- サインインすると、アプリケーションに戻り、サインアウトボタンが表示されます。
- サインアウトボタンをクリックして、トークンストレージをクリアし、サインアウトします。
Add Microsoft Entra ID OIDC enterprise SSO connector
アクセス管理を簡素化し、大規模なクライアント向けにエンタープライズレベルの保護を得るために、Go をフェデレーテッドアイデンティティプロバイダーとして接続します。Logto エンタープライズシングルサインオン (SSO) コネクターは、いくつかのパラメーター入力を許可することで、この接続を数分で確立するのに役立ちます。
エンタープライズ SSO コネクターを追加するには、次の手順に従ってください:
- Logto コンソール > エンタープライズ SSO に移動します。

- 「エンタープライズコネクターを追加」ボタンをクリックし、SSO プロバイダーのタイプを選択します。Microsoft Entra ID (Azure AD)、Google Workspace、Okta の事前構築されたコネクターから選択するか、標準の OpenID Connect (OIDC) または SAML プロトコルを使用してカスタム SSO 接続を作成します。
- 一意の名前を指定します(例:Acme Company の SSO サインイン)。

- 「接続」タブで IdP と接続を構成します。各コネクタータイプのガイドを上記で確認してください。

- 「体験 (Experience)」タブで SSO 体験と企業の メールドメイン をカスタマイズします。SSO 対応のメールドメインでサインインするユーザーは、SSO 認証にリダイレクトされます。

- 変更を保存します。
Set up Azure AD SSO application
ステップ 1: Microsoft EntraID OIDC アプリケーションを作成する
-
Microsoft Entra 管理センター にアクセスし、管理者としてサインインします。
-
Identity > Applications > App registrations に移動します。

-
New registration
を選択します。 -
アプリケーション名を入力し、アプリケーションに適したアカウントタイプを選択します。
-
アプリケーションプラットフォームとして
Web
を選択します。 -
Logto の SSO 設定ページから
redirect URI
をコピーして貼り付けます。redirect URI
は、ユーザーが Microsoft Entra ID で認証された後にリダイレクトされる URL です。

Register
をクリックしてアプリケーションを作成します。
ステップ 2: Logto で Microsoft Entra ID OIDC SSO を設定する
Microsoft Entra OIDC アプリケーションの作成が完了したら、IdP 設定情報を Logto に提供する必要があります。Logto コンソールの Connection
タブに移動し、以下の設定を入力してください:
- クライアント ID:Microsoft Entra によって OIDC アプリケーションに割り当てられた一意の識別子です。この識別子は、OIDC フロー中に Logto がアプリケーションを識別し認証するために使用します。アプリケーションの概要ページで
Application (client) ID
として確認できます。

- クライアントシークレット:新しいクライアントシークレットを作成し、その値を Logto にコピーしてください。このシークレットは、OIDC アプリケーションの認証および Logto と IdP 間の通信のセキュリティ確保に使用されます。

-
発行者 (Issuer):発行者 URL は、IdP の一意の識別子であり、OIDC アイデンティティプロバイダーの場所を指定します。これは OIDC 設定の重要な部分であり、Logto が必要なエンドポイントを発見するのに役立ちます。
これらの OIDC エンドポイントを手動で入力する代わりに、Logto は発行者 URL を利用して IdP のディスカバーエンドポイントにアクセスし、必要な設定や IdP エンドポイントを自動的に取得します。
発行者 URL を取得するには、アプリケーション概要ページの
Endpoints
セクションで確認できます。OpenID Connect metadata document
エンドポイントを見つけ、その URL から 末尾の.well-known/openid-configuration
を除いた部分 をコピーしてください。Logto は OIDC 設定取得時に自動的に.well-known/openid-configuration
を発行者 URL に付加します。

- スコープ (Scope)(任意):Logto はすべてのリクエストに必要なスコープ(
openid
、profile
、email
)を自動的に含めます。アプリケーションが IdP から追加の権限やアクセスレベルを必要とする場合は、スペース区切りで追加のスコープを指定できます。
保存
をクリックして設定プロセスを完了してください。
ステップ 3: 追加スコープ(オプション)
スコープ (Scopes) は、アプリがユーザーから要求する権限 (Permissions) を定義し、アプリが Microsoft Entra ID アカウントからアクセスできるデータを制御します。Microsoft Graph の権限 (Permissions) を要求するには、両方の側で設定が必要です:
Microsoft Entra 管理センターで:
- Microsoft Entra ID > アプリ登録 に移動し、アプリケーションを選択します。
- API 権限 > 権限の追加 > Microsoft Graph > 委任された権限 に進みます。
- アプリに必要な権限 (Permissions) のみを選択します:
- OpenID 権限 (Permissions):
openid
(必須)- ユーザーのサインインprofile
(必須)- ユーザーの基本プロフィールの表示email
(必須)- ユーザーのメールアドレスの表示offline_access
(オプション)- Logto コネクターで Microsoft API への永続的なアクセス用のトークン保存 を有効にし、Microsoft Graph API への長期間アクセスのためにリフレッシュ トークン (Refresh token) を取得する必要がある場合のみ必要です。
- API アクセス(オプション):アプリに必要な追加の権限 (Permissions) を追加します。一般的な Microsoft Graph 権限 (Permissions) には
Mail.Read
、Calendars.Read
、Files.Read
などがあります。利用可能な権限 (Permissions) については Microsoft Graph permissions reference を参照してください。
- OpenID 権限 (Permissions):
- 権限の追加 をクリックして選択を確定します。
- アプリが特定の権限 (Permissions) に管理者の同意が必要な場合は、[組織名] のために管理者の同意を付与 をクリックします。

Logto Microsoft Entra ID コネクターで:
- Logto は、基本的なユーザーアイデンティティ情報を取得するために
openid
、profile
、email
スコープ (Scopes) を自動的に含めます。基本的なユーザー情報のみが必要な場合は、Scopes
フィールドを空白のままにできます。 - Microsoft API への永続的なアクセス用にトークンを保存する場合は、
Scopes
フィールドにoffline_access
を追加します。このスコープ (Scope) により、長期間の API アクセス用のリフレッシュ トークン (Refresh token) が有効になります。 - Microsoft Graph からさらに多くのデータを要求する場合は、
Scopes
フィールドに追加のスコープ (Scopes)(スペース区切り)を追加します。標準のスコープ名を使用してください。例:User.Read Mail.Read Calendars.Read
アプリがこれらのスコープ (Scopes) を要求して Microsoft Graph API へアクセスし操作を行う場合は、Logto Microsoft Entra ID コネクターで Microsoft API への永続的なアクセス用のトークン保存 を有効にしてください。詳細は次のセクションを参照してください。
ステップ 4: Microsoft API へアクセスするためのトークンを保存する(オプション)
Microsoft Graph APIs へアクセスし、ユーザーの認可 (Authorization) で操作を実行したい場合、Logto は特定の API スコープとトークンを取得・保存する必要があります。
- Microsoft Entra 管理センターの API 権限設定および Logto Microsoft Entra ID コネクターで必要なスコープを追加します。
- Logto Microsoft Entra ID コネクターで 永続的な API アクセスのためにトークンを保存 を有効にします。Logto は Microsoft のアクセス トークンおよびリフレッシュ トークンを Secret Vault に安全に保存します。
- リフレッシュ トークンが返されるようにするには、Microsoft Entra ID アプリケーションの権限に
offline_access
スコープを追加し、Logto Microsoft Entra ID コネクターのスコープにも含めてください。このスコープにより、アプリケーションは長期間リソースへのアクセスを維持できます。
ステップ 5: メールドメインを設定し、SSO コネクターを有効化する
コネクターの体験 (Experience) タブで、組織のメール domains
を入力してください。これにより、これらのユーザーに対して SSO コネクターが認証 (Authentication) 方法として有効になります。
指定したドメインのメールアドレスを持つユーザーは、唯一の認証 (Authentication) 方法として SSO コネクターのみを利用できるように制限されます。
Save your configuration
Logto コネクター設定エリアで必要な値をすべて記入したことを確認してください。「保存して完了」または「変更を保存」をクリックすると、Microsoft Entra ID OIDC enterprise SSO コネクターが利用可能になります。
Enable Microsoft Entra ID OIDC enterprise SSO connector in Sign-in Experience
エンタープライズコネクターを個別に設定する必要はありません。Logto は、ワンクリックでアプリケーションに SSO 統合を簡素化します。
- 移動先: Console > サインイン体験 > サインアップとサインイン。
- 「エンタープライズシングルサインオン (SSO)」トグルを有効にします。
- 変更を保存します。
有効にすると、サインインページに「シングルサインオン (SSO)」ボタンが表示されます。SSO が有効なメールドメインを持つエンタープライズユーザーは、エンタープライズアイデンティティプロバイダー (IdP) を使用してサービスにアクセスできます。


SP 主導の SSO や IdP 主導の SSO を含む SSO ユーザー体験について詳しくは、ユーザーフロー: エンタープライズ SSO を参照してください。
Testing and Validation
Go アプリに戻ります。これで Microsoft Entra ID OIDC enterprise SSO を使用してサインインできるはずです。お楽しみください!
Further readings
エンドユーザーフロー:Logto は、MFA やエンタープライズシングルサインオン (SSO) を含む即時使用可能な認証 (Authentication) フローを提供し、アカウント設定、セキュリティ検証、マルチテナント体験の柔軟な実装のための強力な API を備えています。
認可 (Authorization):認可 (Authorization) は、ユーザーが認証 (Authentication) された後に行えるアクションやアクセスできるリソースを定義します。ネイティブおよびシングルページアプリケーションの API を保護し、ロールベースのアクセス制御 (RBAC) を実装する方法を探ります。
組織 (Organizations):特にマルチテナント SaaS や B2B アプリで効果的な組織機能は、テナントの作成、メンバー管理、組織レベルの RBAC、およびジャストインタイムプロビジョニングを可能にします。
顧客 IAM シリーズ:顧客(または消費者)アイデンティティとアクセス管理に関する連続ブログ投稿で、101 から高度なトピックまでを網羅しています。