Logto は、モダンなアプリや SaaS 製品向けに設計された Auth0 の代替です。 Cloud と オープンソース の両方のサービスを提供し、アイデンティティと管理 (IAM) システムを迅速に立ち上げるのに役立ちます。認証 (Authentication)、認可 (Authorization)、マルチテナント管理を すべて一つに まとめて楽しんでください。
Logto Cloud で無料の開発テナントから始めることをお勧めします。これにより、すべての機能を簡単に探索できます。
この記事では、Go と Logto を使用して、Google Workspace enterprise SSO サインイン体験(ユーザー認証 (Authentication))を迅速に構築する手順を説明します。
前提条件
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 Google Workspace 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 Google Cloud Platform
ステップ 1: Google Cloud Platform で新しいプロジェクトを作成する
Google Workspace を認証 (Authentication) プロバイダーとして使用する前に、Google API Console でプロジェクトを設定し、OAuth 2.0 資格情報を取得する必要があります。すでにプロジェクトがある場合は、このステップをスキップできます。そうでない場合は、Google 組織の下で新しいプロジェクトを作成してください。
ステップ 2: アプリケーションの同意画面 (Consent screen) を設定する
新しい OIDC 資格情報を作成するには、アプリケーションの同意画面を設定する必要があります。
- OAuth 同意画面 ページに移動し、
Internalユーザータイプを選択します。これにより、OAuth アプリケーションは組織内のユーザーのみが利用可能になります。
- ページの指示に従って
Consent Screen設定を入力します。次の最低限の情報を提供する必要があります:
- アプリケーション名:アプリケーションの名前です。同意画面に表示されます。
- サポートメール:アプリケーションのサポートメールです。同意画面に表示されます。
- アプリケーションの
Scopesを設定します。ユーザーのアイデンティティ情報とメールアドレスを IdP から適切に取得するために、Logto SSO コネクターは IdP から次のスコープを付与する必要があります:
- openid:このスコープは OIDC 認証 (Authentication) に必要です。ID トークンを取得し、IdP の userInfo エンドポイントにアクセスするために使用されます。
- profile:このスコープはユーザーの基本的なプロフィール情報にアクセスするために必要です。
- email:このスコープはユーザーのメールアドレスにアクセスするために必要です。
Save ボタンをクリックして同意画面の設定を保存します。
ステップ 3: 新しい OAuth 資格情報を作成する
Credentials ページに移動し、Create Credentials ボタンをクリックします。ドロップダウンメニューから OAuth client ID オプションを選択して、アプリケーション用の新しい OAuth 資格情報を作成します。
次の情報を入力して OAuth 資格情報の設定を続行します:
- アプリケーションタイプとして
Web applicationを選択します。 - クライアントアプリケーションの
Nameを入力します。例えば、Logto SSO Connector。これにより、将来的に資格情報を識別するのに役立ちます。 Authorized redirect URIsに Logto のコールバック URI を入力します。これは、Google が認証 (Authentication) に成功した後にユーザーのブラウザをリダイレクトする URI です。ユーザーが IdP での認証に成功した後、IdP はユーザーのブラウザをこの指定された URI に認可 (Authorization) コードと共にリダイレクトします。Logto は、この URI から受け取った認可 (Authorization) コードに基づいて認証 (Authentication) プロセスを完了します。Authorized JavaScript originsに Logto コールバック URI のオリジンを入力します。これにより、あなたの Logto アプリケーションのみが Google OAuth サーバーにリクエストを送信できるようになります。Createボタンをクリックして OAuth 資格情報を作成します。
ステップ 4: クライアント資格情報で Logto コネクターを設定する
OAuth 資格情報の作成に成功すると、クライアント ID とクライアントシークレットが表示されるプロンプトモーダルが表示されます。
Client ID と Client secret をコピーし、Logto の SSO コネクターの Connection タブの対応するフィールドに入力します。
これで、Logto 上で Google Workspace SSO コネクターの設定が完了しました。
ステップ 5: 追加のスコープ (Scopes)(オプション)
スコープ (Scopes) は、アプリがユーザーから要求する権限 (Permissions) を定義し、Google Workspace アカウントからアプリがアクセスできるデータを制御します。Google の権限 (Permissions) をリクエストするには、両方の側で設定が必要です:
Google Cloud Console での操作:
- APIs & Services > OAuth consent screen > Scopes に移動します。
- Add or Remove Scopes をクリックし、アプリに必要なスコープ (Scopes) のみを選択します:
- 認証 (Authentication)(必須):
https://www.googleapis.com/auth/userinfo.emailhttps://www.googleapis.com/auth/userinfo.profileopenid
- API アクセス(任意):アプリに必要な追加スコープ (Scopes) を追加します(例:Drive、Calendar、YouTube)。利用可能なサービスは Google API ライブラリ で確認できます。アプリが基本的な権限 (Permissions) 以上の Google API へのアクセスを必要とする場合は、まず Google API ライブラリでアプリが使用する特定の API(例:Google Drive API、Gmail API、Calendar API)を有効にしてください。
- 認証 (Authentication)(必須):
- Update をクリックして選択を確定します。
- Save and Continue をクリックして変更を適用します。
Logto Google Workspace コネクター (Connector) での操作:
- Logto は、基本的なユーザーアイデンティティ情報を取得するために
openid、profile、emailのスコープ (Scopes) を自動的に含めます。基本的なユーザー情報のみが必要な場合は、Scopesフィールドを空欄のままにできます。 - Google からさらに多くのデータをリクエストする場合は、
Scopesフィールドに追加のスコープ (Scopes)(スペース区切り)を入力します。スコープ (Scopes) の URL は完全な形式で入力してください。例:https://www.googleapis.com/auth/calendar.readonly
アプリがこれらのスコープ (Scopes) をリクエストして Google API にアクセスし操作を行う場合は、Logto Google コネクターで Store tokens for persistent API access を有効にしてください。詳細は次のセクションを参照してください。
ステップ 6: Google API へアクセスするためのトークンを保存する(オプション)
Google APIs へアクセスし、ユーザーの認可 (Authorization) で操作を行いたい場合、Logto は特定の API スコープとトークンを取得して保存する必要があります。
- 必要なスコープを Google Cloud Console の OAuth 同意画面設定および Logto の Google コネクターに追加します。
- Logto の Google コネクターで 永続的な API アクセスのためにトークンを保存 を有効にします。Logto は Google のアクセス トークンおよびリフレッシュ トークンを Secret Vault に安全に保存します。
- リフレッシュ トークンが返されるようにするには、Logto の Google コネクターで オフラインアクセス を有効にしてください。
Logto の Scope フィールドに offline_access を追加する必要はありません — 追加するとエラーになる場合があります。Google はオフラインアクセスが有効な場合、自動的に access_type=offline を使用します。
ステップ 7: メールドメインを設定し、SSO コネクターを有効化する
Logto のコネクター「SSO 体験」タブで、組織の メールドメイン を入力してください。これにより、指定したユーザーに対して SSO コネクターが認証 (Authentication) 方法として有効になります。
指定したドメインのメールアドレスを持つユーザーは、唯一の認証 (Authentication) 方法として SSO コネクターを利用するようリダイレクトされます。
Google Workspace SSO コネクターの詳細については、 Google OpenID Connector をご確認ください。
Save your configuration
Logto コネクター設定エリアで必要な値をすべて記入したことを確認してください。「保存して完了」または「変更を保存」をクリックすると、Google Workspace enterprise SSO コネクターが利用可能になります。
Enable Google Workspace enterprise SSO connector in Sign-in Experience
エンタープライズコネクターを個別に設定する必要はありません。Logto は、ワンクリックでアプリケーションに SSO 統合を簡素化します。
- 移動先: Console > サインイン体験 > サインアップとサインイン。
- 「エンタープライズシングルサインオン (SSO)」トグルを有効にします。
- 変更を保存します。
有効にすると、サインインページに「シングルサインオン (SSO)」ボタンが表示されます。SSO が有効なメールドメインを持つエンタープライズユーザーは、エンタープライズアイデンティティプロバイダー (IdP) を使用してサービスにアクセスできます。
SP 主導の SSO や IdP 主導の SSO を含む SSO ユーザー体験について詳しくは、ユーザーフロー: エンタープライズ SSO を参照してください。
Testing and Validation
Go アプリに戻ります。これで Google Workspace enterprise SSO を使用してサインインできるはずです。お楽しみください!
Further readings
エンドユーザーフロー:Logto は、MFA やエンタープライズシングルサインオン (SSO) を含む即時使用可能な認証 (Authentication) フローを提供し、アカウント設定、セキュリティ検証、マルチテナント体験の柔軟な実装のための強力な API を備えています。
認可 (Authorization):認可 (Authorization) は、ユーザーが認証 (Authentication) された後に行えるアクションやアクセスできるリソースを定義します。ネイティブおよびシングルページアプリケーションの API を保護し、ロールベースのアクセス制御 (RBAC) を実装する方法を探ります。
組織 (Organizations):特にマルチテナント SaaS や B2B アプリで効果的な組織機能は、テナントの作成、メンバー管理、組織レベルの RBAC、およびジャストインタイムプロビジョニングを可能にします。
顧客 IAM シリーズ:顧客(または消費者)アイデンティティとアクセス管理に関する連続ブログ投稿で、101 から高度なトピックまでを網羅しています。