メインコンテンツまでスキップ
新しい友達のために:

Logto は、モダンなアプリや SaaS 製品向けに設計された Auth0 の代替です。 Cloudオープンソース の両方のサービスを提供し、アイデンティティと管理 (IAM) システムを迅速に立ち上げるのに役立ちます。認証 (Authentication)、認可 (Authorization)、マルチテナント管理を すべて一つに まとめて楽しんでください。

Logto Cloud で無料の開発テナントから始めることをお勧めします。これにより、すべての機能を簡単に探索できます。

この記事では、.NET Core (Blazor Server)Logto を使用して、GitHub サインイン体験(ユーザー認証 (Authentication))を迅速に構築する手順を説明します。

前提条件

Logto でアプリケーションを作成する

Logto は OpenID Connect (OIDC) 認証 (Authentication) と OAuth 2.0 認可 (Authorization) に基づいています。これは、複数のアプリケーション間でのフェデレーテッドアイデンティティ管理をサポートし、一般的にシングルサインオン (SSO) と呼ばれます。

あなたの Traditional web アプリケーションを作成するには、次の手順に従ってください:

  1. Logto コンソール を開きます。「Get started」セクションで、「View all」リンクをクリックしてアプリケーションフレームワークのリストを開きます。あるいは、Logto Console > Applications に移動し、「Create application」ボタンをクリックします。 Get started
  2. 開いたモーダルで、左側のクイックフィルターチェックボックスを使用して、利用可能なすべての "Traditional web" フレームワークをフィルタリングするか、"Traditional web" セクションをクリックします。".Net Core (Blazor Server)" フレームワークカードをクリックして、アプリケーションの作成を開始します。 Frameworks
  3. アプリケーション名を入力します。例:「Bookstore」と入力し、「Create application」をクリックします。

🎉 タダーン!Logto で最初のアプリケーションを作成しました。詳細な統合ガイドを含むお祝いページが表示されます。ガイドに従って、アプリケーションでの体験を確認してください。

.Net Core (Blazor Server) SDK を統合する

ヒント:
  • 次のデモンストレーションは .NET Core 8.0 を基に構築されています。SDK は .NET 6.0 以上に対応しています。
  • .NET Core のサンプルプロジェクトは GitHub リポジトリ で利用可能です。

インストール

プロジェクトに NuGet パッケージを追加します:

dotnet add package Logto.AspNetCore.Authentication

Logto 認証 (Authentication) を追加する

Startup.cs(または Program.cs)を開き、次のコードを追加して Logto 認証 (Authentication) サービスを登録します:

Program.cs
using Logto.AspNetCore.Authentication;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddLogtoAuthentication(options =>
{
options.Endpoint = builder.Configuration["Logto:Endpoint"]!;
options.AppId = builder.Configuration["Logto:AppId"]!;
options.AppSecret = builder.Configuration["Logto:AppSecret"];
});

AddLogtoAuthentication メソッドは次のことを行います:

  • デフォルトの認証 (Authentication) スキームを LogtoDefaults.CookieScheme に設定します。
  • デフォルトのチャレンジスキームを LogtoDefaults.AuthenticationScheme に設定します。
  • デフォルトのサインアウトスキームを LogtoDefaults.AuthenticationScheme に設定します。
  • 認証 (Authentication) スキームにクッキーと OpenID Connect 認証 (Authentication) ハンドラーを追加します。

サインインおよびサインアウトフロー

進む前に、.NET Core 認証 (Authentication) ミドルウェアにおける混乱しやすい用語を 2 つ明確にする必要があります:

  1. CallbackPath: ユーザーがサインインした後に Logto がユーザーをリダイレクトする URI (Logto における「リダイレクト URI」)
  2. RedirectUri: Logto 認証 (Authentication) ミドルウェアで必要なアクションが実行された後にリダイレクトされる URI

サインインプロセスは次のように示されます:


同様に、.NET Core にはサインアウトフローのための SignedOutCallbackPathRedirectUri もあります。

明確にするために、これらを次のように呼びます:

使用する用語.NET Core 用語
Logto リダイレクト URICallbackPath
Logto サインアウト後リダイレクト URISignedOutCallbackPath
アプリケーションリダイレクト URIRedirectUri

リダイレクトベースのサインインについて

  1. この認証 (Authentication) プロセスは OpenID Connect (OIDC) プロトコルに従い、Logto はユーザーのサインインを保護するために厳格なセキュリティ対策を講じています。
  2. 複数のアプリがある場合、同じアイデンティティプロバイダー (Logto) を使用できます。ユーザーがあるアプリにサインインすると、Logto は別のアプリにアクセスした際に自動的にサインインプロセスを完了します。

リダイレクトベースのサインインの理論と利点について詳しく知るには、Logto サインイン体験の説明を参照してください。

リダイレクト URI を設定する

注記:

以下のコードスニペットでは、あなたのアプリが http://localhost:3000/ で実行されていると仮定しています。

まず、Logto リダイレクト URI を設定しましょう。次の URI を Logto アプリケーション詳細ページの「リダイレクト URI」リストに追加します:

http://localhost:3000/Callback

Logto サインアウト後リダイレクト URI を設定するには、次の URI を Logto アプリケーション詳細ページの「サインアウト後リダイレクト URI」リストに追加します:

http://localhost:3000/SignedOutCallback

デフォルトパスを変更する

Logto リダイレクト URI にはデフォルトパス /Callback があり、Logto サインアウト後リダイレクト URI にはデフォルトパス /SignedOutCallback があります。

特別な要件がない場合は、そのままにしておくことができます。変更したい場合は、LogtoOptionsCallbackPathSignedOutCallbackPath プロパティを設定できます:

Program.cs
builder.Services.AddLogtoAuthentication(options =>
{
// 他の設定...
options.CallbackPath = "/Foo";
options.SignedOutCallbackPath = "/Bar";
});

Logto アプリケーション詳細ページの値もそれに応じて更新することを忘れないでください。

ルートを追加する

Blazor Server は SignalR を使用してサーバーとクライアント間で通信するため、HTTP コンテキストを直接操作するメソッド(チャレンジやリダイレクトの発行など)は、Blazor コンポーネントから呼び出された場合、期待通りに動作しません。

これを正しく行うためには、サインインとサインアウトのリダイレクト用に 2 つのエンドポイントを明示的に追加する必要があります:

Program.cs
app.MapGet("/SignIn", async context =>
{
if (!(context.User?.Identity?.IsAuthenticated ?? false))
{
await context.ChallengeAsync(new AuthenticationProperties { RedirectUri = "/" });
} else {
context.Response.Redirect("/");
}
});

app.MapGet("/SignOut", async context =>
{
if (context.User?.Identity?.IsAuthenticated ?? false)
{
await context.SignOutAsync(new AuthenticationProperties { RedirectUri = "/" });
} else {
context.Response.Redirect("/");
}
});

これで、これらのエンドポイントにリダイレクトしてサインインとサインアウトをトリガーできます。

サインイン / サインアウトボタンを実装する

Razor コンポーネントに次のコードを追加します:

Components/Pages/Index.razor
@using Microsoft.AspNetCore.Components.Authorization
@using System.Security.Claims
@inject AuthenticationStateProvider AuthenticationStateProvider
@inject NavigationManager NavigationManager

@* ... *@

<p>認証 (Authentication) 済み: @User.Identity?.IsAuthenticated</p>
@if (User.Identity?.IsAuthenticated == true)
{
<button @onclick="SignOut">サインアウト</button>
}
else
{
<button @onclick="SignIn">サインイン</button>
}

@* ... *@

@code {
private ClaimsPrincipal? User { get; set; }

protected override async Task OnInitializedAsync()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
User = authState.User;
}

private void SignIn()
{
NavigationManager.NavigateTo("/SignIn", forceLoad: true);
}

private void SignOut()
{
NavigationManager.NavigateTo("/SignOut", forceLoad: true);
}
}

説明

  • インジェクトされた AuthenticationStateProvider は、現在のユーザーの認証 (Authentication) 状態を取得し、User プロパティを設定するために使用されます。
  • SignInSignOut メソッドは、それぞれサインインおよびサインアウトのエンドポイントにユーザーをリダイレクトするために使用されます。Blazor Server の性質上、リダイレクションをトリガーするために NavigationManager を強制ロードで使用する必要があります。

ページは、ユーザーが認証 (Authentication) されていない場合は「サインイン」ボタンを表示し、認証 (Authentication) されている場合は「サインアウト」ボタンを表示します。

<AuthorizeView /> コンポーネント

代わりに、AuthorizeView コンポーネントを使用して、ユーザーの認証 (Authentication) 状態に基づいてコンテンツを条件付きでレンダリングすることができます。このコンポーネントは、認証 (Authentication) 済みユーザーと未認証ユーザーに異なるコンテンツを表示したい場合に便利です。

Razor コンポーネントに次のコードを追加します:

Components/Pages/Index.razor
@using Microsoft.AspNetCore.Components.Authorization

@* ... *@

<AuthorizeView>
<Authorized>
<p>Name: @User?.Identity?.Name</p>
@* 認証 (Authentication) 済みユーザー向けのコンテンツ *@
</Authorized>
<NotAuthorized>
@* 未認証ユーザー向けのコンテンツ *@
</NotAuthorized>
</AuthorizeView>

@* ... *@

AuthorizeView コンポーネントは、Task<AuthenticationState> 型のカスケードパラメーターを必要とします。このパラメーターを取得する直接的な方法は、<CascadingAuthenticationState> コンポーネントを追加することです。ただし、Blazor Server の性質上、レイアウトやルートコンポーネントに単純にコンポーネントを追加することはできません(期待通りに動作しない可能性があります)。代わりに、ビルダー (Program.cs または Startup.cs) に次のコードを追加してカスケードパラメーターを提供します:

Program.cs
builder.Services.AddCascadingAuthenticationState();

その後、AuthorizeView コンポーネントを必要とするすべてのコンポーネントで使用できます。

チェックポイント: アプリケーションをテストする

これで、アプリケーションをテストできます:

  1. アプリケーションを実行すると、サインインボタンが表示されます。
  2. サインインボタンをクリックすると、SDK がサインインプロセスを初期化し、Logto のサインインページにリダイレクトされます。
  3. サインインすると、アプリケーションに戻り、サインアウトボタンが表示されます。
  4. サインアウトボタンをクリックして、トークンストレージをクリアし、サインアウトします。

GitHub コネクターを追加する

迅速なサインインを有効にし、ユーザーコンバージョンを向上させるために、アイデンティティプロバイダー (IdP) として .Net Core (Blazor Server) を接続します。Logto ソーシャルコネクターは、いくつかのパラメーター入力を許可することで、この接続を数分で確立するのに役立ちます。

ソーシャルコネクターを追加するには、次の手順に従ってください:

  1. Console > Connectors > Social Connectors に移動します。
  2. 「Add social connector」をクリックし、「GitHub」を選択します。
  3. README ガイドに従い、必要なフィールドを完了し、設定をカスタマイズします。
Connector tab
注記:

インプレースコネクターガイドに従っている場合は、次のセクションをスキップできます。

GitHub OAuth app を設定する

ステップ 1: GitHub で OAuth アプリを作成する

GitHub を認証 (Authentication) プロバイダーとして利用する前に、GitHub で OAuth アプリを作成し、OAuth 2.0 の認証情報を取得する必要があります。

  1. GitHub にアクセスし、アカウントでサインインします。必要に応じて新しいアカウントを作成してください。
  2. 設定 > 開発者設定 > OAuth apps に移動します。
  3. New OAuth App をクリックして新しいアプリケーションを登録します:
    • Application name:アプリの説明的な名前を入力します。
    • Homepage URL:アプリケーションのホームページ URL を入力します。
    • Authorization callback URL:Logto の GitHub コネクターから Callback URI をコピーし、ここに貼り付けます。ユーザーが GitHub でサインインした後、ここにリダイレクトされ、Logto が認証 (Authentication) を完了するための認可コードが渡されます。
    • Application description:(任意)アプリの簡単な説明を追加します。
  4. Register application をクリックして OAuth アプリを作成します。
注記:

Enable Device Flow のチェックボックスはオフのままにすることを推奨します。なぜなら、GitHub でサインインするユーザーがモバイルデバイスを利用する場合、GitHub モバイルアプリで初回サインイン操作を確認する必要があるためです。多くの GitHub ユーザーは GitHub モバイルアプリをインストールしていないため、サインインフローが妨げられる可能性があります。エンドユーザーが GitHub モバイルアプリでサインインフローを確認することを想定している場合のみ有効にしてください。デバイスフロー の詳細を参照してください。

GitHub OAuth アプリのセットアップ詳細については Creating an OAuth App をご覧ください。

ステップ 2: Logto コネクターを設定する

GitHub で OAuth アプリを作成した後、詳細ページにリダイレクトされ、Client ID をコピーしたり、Client secret を生成できます。

  1. GitHub OAuth アプリから Client ID をコピーし、Logto の clientId フィールドに貼り付けます。
  2. GitHub で Generate a new client secret をクリックして新しいシークレットを作成し、それをコピーして Logto の clientSecret フィールドに貼り付けます。
  3. Logto で Save and Done をクリックし、アイデンティティシステムと GitHub を接続します。
警告:

Client secret は安全に保管し、クライアントサイドのコードで絶対に公開しないでください。GitHub の client secret は紛失した場合、復元できません。新しいものを生成する必要があります。

ステップ 3: スコープを設定する(任意)

スコープは、アプリがユーザーから要求する権限を定義し、GitHub アカウントからどのデータにアクセスできるかを制御します。

Logto の Scopes フィールドを使って、GitHub から追加の権限をリクエストできます。ニーズに応じて次のいずれかの方法を選択してください:

オプション 1: 追加の API スコープが不要な場合

  • Logto の GitHub コネクターの Scopes フィールドを空欄のままにします。
  • デフォルトのスコープ read:user がリクエストされ、Logto が基本的なユーザー情報(メール、名前、アバターなど)を正しく取得できるようになります。

オプション 2: サインイン時に追加スコープをリクエストする

  • GitHub OAuth アプリ用の全スコープ一覧 を参照し、アプリに必要なスコープのみ追加します。
  • 必要なスコープをすべて Scopes フィールドにスペース区切りで入力します。
  • ここに記載したスコープはデフォルトを上書きするため、必ず認証 (Authentication) 用スコープ read:user を含めてください。
  • よく使われる追加スコープ例:
    • repo:プライベートリポジトリの完全な制御
    • public_repo:パブリックリポジトリへのアクセス
    • user:email:ユーザーのメールアドレスへのアクセス
    • notifications:通知へのアクセス
  • すべてのスコープが正しく有効であることを確認してください。誤ったスコープやサポートされていないスコープを指定すると、GitHub から「Invalid scope」エラーが返されます。

オプション 3: 後からインクリメンタルスコープをリクエストする

  • ユーザーがサインインした後、必要に応じてフェデレーテッドソーシャル認可フローを再実行し、ユーザーの保存済みトークンセットを更新することで追加スコープをリクエストできます。
  • これらの追加スコープは Logto の GitHub コネクターの Scopes フィールドに記載する必要はなく、Logto の Social Verification API を通じて実現できます。

これらの手順に従うことで、Logto の GitHub コネクターはアプリに必要な権限のみをリクエストします。

ヒント:

アプリがこれらのスコープを使って GitHub API にアクセスし操作を行う場合は、Logto GitHub コネクターで Store tokens for persistent API access を有効にしてください。詳細は次のセクションを参照してください。

ステップ 4: 一般設定

GitHub への接続を妨げることはありませんが、エンドユーザーの認証 (Authentication) 体験に影響する一般的な設定をいくつか紹介します。

プロフィール情報の同期

GitHub コネクターでは、ユーザー名やアバターなどのプロフィール情報の同期ポリシーを設定できます。次のいずれかを選択してください:

  • サインアップ時のみ同期:ユーザーが初めてサインインしたときにプロフィール情報を取得します。
  • サインイン時に常に同期:ユーザーがサインインするたびにプロフィール情報を更新します。

GitHub API へのアクセス用トークンの保存(任意)

ユーザーの認可で GitHub API にアクセスし操作を行いたい場合(ソーシャルサインインやアカウント連携経由)、Logto は特定の API スコープを取得し、トークンを保存する必要があります。

  1. 上記の手順に従って必要なスコープを追加します。
  2. Logto GitHub コネクターで Store tokens for persistent API access を有効にします。Logto は GitHub のアクセストークンを Secret Vault に安全に保存します。
注記:

このチュートリアルで説明しているように GitHub OAuth アプリ を利用する場合、GitHub からリフレッシュトークン (Refresh token) を取得することはできません。なぜなら、アクセストークンはユーザーが手動で取り消さない限り有効期限がないためです。そのため、Scopes フィールドに offline_access を追加する必要はありません。追加するとエラーになる場合があります。

アクセストークンに有効期限を設けたい場合やリフレッシュトークン (Refresh token) を利用したい場合は、代わりに GitHub App との連携を検討してください。GitHub Apps と OAuth Apps の違い をご覧ください。

ステップ 5: 統合のテスト(任意)

本番運用前に、GitHub 連携をテストしましょう:

  1. Logto の開発テナントでコネクターを利用します。
  2. ユーザーが GitHub でサインインできることを確認します。
  3. 正しいスコープがリクエストされているか確認します。
  4. トークンを保存している場合は API コールもテストします。

GitHub OAuth アプリは、どの GitHub ユーザーアカウントでもすぐに動作します。他のプラットフォームのようにテストユーザーやアプリ承認は不要です。

設定を保存する

Logto コネクター設定エリアで必要な値をすべて記入したことを確認してください。「保存して完了」または「変更を保存」をクリックすると、GitHub コネクターが利用可能になります。

サインイン体験で GitHub コネクターを有効にする

ソーシャルコネクターを正常に作成したら、サインイン体験で「GitHub で続行」ボタンとして有効にすることができます。

  1. Console > サインイン体験 > サインアップとサインイン に移動します。
  2. (オプション)ソーシャルログインのみが必要な場合は、サインアップ識別子に「該当なし」を選択します。
  3. 設定済みの GitHub コネクターを「ソーシャルサインイン」セクションに追加します。
サインイン体験タブ

テストと検証

.NET Core (Blazor Server) アプリに戻ります。これで GitHub を使用してサインインできるはずです。お楽しみください!

さらなる読み物

エンドユーザーフロー:Logto は、MFA やエンタープライズシングルサインオン (SSO) を含む即時使用可能な認証 (Authentication) フローを提供し、アカウント設定、セキュリティ検証、マルチテナント体験の柔軟な実装のための強力な API を備えています。

認可 (Authorization):認可 (Authorization) は、ユーザーが認証 (Authentication) された後に行えるアクションやアクセスできるリソースを定義します。ネイティブおよびシングルページアプリケーションの API を保護し、ロールベースのアクセス制御 (RBAC) を実装する方法を探ります。

組織 (Organizations):特にマルチテナント SaaS や B2B アプリで効果的な組織機能は、テナントの作成、メンバー管理、組織レベルの RBAC、およびジャストインタイムプロビジョニングを可能にします。

顧客 IAM シリーズ:顧客(または消費者)アイデンティティとアクセス管理に関する連続ブログ投稿で、101 から高度なトピックまでを網羅しています。