ホームページ >ウェブフロントエンド >jsチュートリアル >スパのソーシャルログイン:GoogleとFacebookを介してユーザーを認証する
単一のページアプリケーションアーキテクチャを備えたWebアプリケーションの数が増加しています。これらのアプリケーションは、多くの場合、ユーザープロファイルの詳細を保存するなど、ある程度のユーザーが制限する相互作用を必要とします。従来のHTMLベースのアプリケーションでこの機能を実装することは比較的簡単ですが、各APIリクエストに認証を必要とする単一ページアプリケーションではさらに難しいです。
この記事では、passport.jsライブラリを使用して複数のプロバイダーにソーシャルログインを実装し、その後のAPI呼び出しのトークンベースの認証を実装する手法を実証します。
この記事のすべてのソースコードは、GitHubリポジトリからダウンロードできます。
キーポイント
なぜあなたのスパでソーシャルログインを使用するのですか?
Webアプリケーションにログインメカニズムを実装する際には、多くの問題を考慮する必要があります。
主にソーシャルネットワーク(主にソーシャルネットワーク)を使用すると、プラットフォームを使用して独自のアプリを確認できます。これは、多くの異なるAPI -OAuth 1.0、OAuth 2.0、OpenID、OpenID Connectなどを通じて実装されています。
これらのソーシャルログインテクノロジーを使用して、ログインプロセスを実装することには多くの利点があります。
なぜAPIにトークンベースの認証を使用するのですか?
クライアントがAPIにアクセスする必要があるときはいつでも、アクセスを許可するかどうかを判断するための何らかの方法が必要です。これを達成するには多くの方法がありますが、主なオプションは次のとおりです。
Cookieベースのアプローチは、Cookieにいくつかの識別子を保存するだけで、API要求を自動的に識別するために使用されることです。これは、最初にCookieを設定するには何らかのメカニズムが必要であることを意味し、同じホストへのすべての(適切な)リクエストにCookieが自動的に含まれるため、後続のリクエストで漏れます。
トークンベースのアプローチは、Cookieベースの認証のバリアントですが、より多くの制御を可能にします。基本的に、クッキーベースの認証システムと同じ方法でトークンを生成しますが、リクエストに自分自身を含めます - 通常は「承認」ヘッダーに、またはURLに直接。これは、ストレージトークンを完全に制御できることを意味します。これには、要求が含まれます。
注:HTTPヘッダーが「承認」と呼ばれている場合でも、実際に認証に使用しています。これは、クライアントが何をするかではなく、クライアントが誰であるかを判断するためにそれを使用しているためです。トークンを生成するために使用される戦略も重要です。これらのトークンは参照トークンにすることができます。つまり、サーバーが実際の詳細を見つけるために使用される識別子にすぎません。または完全なトークン。つまり、トークンにはすべての必要な情報が既に含まれていることを意味します。
トークンを参照するには、ユーザーの資格情報がクライアントに漏れることはないため、重要なセキュリティの利点があります。ただし、行われた各リクエストの実際の資格情報にトークンを解析する必要があるため、パフォーマンスペナルティがあります。
完全なトークンは逆です。彼らはトークンを理解している人にユーザーの資格情報を公開しますが、トークンは完了しているため、それを探すときにパフォーマンスの損失はありません。
通常、この標準によりトークンのセキュリティが改善されるため、JSON Webトークン標準を使用してフルトークンが実装されます。具体的には、JWTは暗号化トークンを許可します。つまり、トークンが改ざんされていないことを保証できます。また、暗号化できることも規定されています。つまり、トークンを暗号化キーなしではデコードすることさえできません。
ノードでJWTを使用してレビューする場合は、node.jsを使用してJSON Webトークンを使用するチュートリアルをご覧ください。
完全なトークンを使用するもう1つの欠点はサイズです。たとえば、リファレンストークンは、長さが36文字であるUUIDを使用して実装できます。代わりに、JWTは数百の文字ほど簡単になります。
この記事では、JWTトークンを使用して、それらがどのように機能するかを示します。ただし、この関数を自分で実装する場合、参照トークンまたはフルトークンを使用するか、これに使用するメカニズムを使用するかを決定する必要があります。
パスポートとは?
パスポートは、Webアプリケーションの認証用のnode.jsのモジュールのセットです。多くのノードベースのWebサーバーを非常に簡単にプラグインでき、モジュラー構造を使用して、過度の膨満せずに必要なログインメカニズムを実装できます。パスポートは、多数の認証ニーズをカバーする強力なモジュールスイートです。これらのモジュールを使用して、異なるエンドポイントの異なる認証要件を可能にするプラグ可能なセットアップを作成できます。使用される認証システムは、URLの特別な値を単純にチェックするだけでなく、すべての作業を行うためにサードパーティのプロバイダーに依存するのと同じくらい簡単です。
この記事では、APIエンドポイントのソーシャルログインとJWTトークンベースの認証を有効にするために、Passport-Google-Oauth、Passport-Facebook、およびPassport-JWTモジュールを使用します。
Passport-JWTモジュールを使用して、いくつかのエンドポイント(実際にアクセスするために認証が必要なAPIエンドポイント)がリクエストに有効なJWTが存在する必要があります。 Passport-Google-OauthおよびPassport-Facebookモジュールは、GoogleとFacebookに対してそれぞれ認証するエンドポイントを提供し、アプリの他のエンドポイントにアクセスするために使用できるJWTを生成するために使用されます。
シングルページのアプリケーションのソーシャルログインを有効にしますここから、シンプルなシングルページアプリを取得し、ソーシャルログインを実装する方法を説明します。このアプリケーションはExpressで記述されており、シンプルなAPIは安全なエンドポイントと安全でないエンドポイントを提供します。続行したい場合は、https://github.com/sitepoint-editors/social-logins-spaからこのアプリのソースコードを確認できます。このアプリケーションは、ダウンロードされたソースコードでNPMインストールを実行して、すべての依存関係をダウンロードすることで構築できます。
アプリを正常に使用するには、GoogleおよびFacebookにソーシャルログイン資格情報を登録し、アプリに資格情報を提供する必要があります。完全な指示は、DEMOアプリケーションのREADMEファイルに記載されています。これらの資格情報は、環境変数としてアクセスされます。したがって、アプリケーションは次のように実行できます:
<code class="language-bash"># Linux / OS X $ export GOOGLE_CLIENTID=myGoogleClientId $ export GOOGLE_CLIENTSECRET=myGoogleClientSecret $ export FACEBOOK_CLIENTID=myFacebookClientId $ export FACEBOOK_CLIENTSECRET=myFacebookClientSecret $ node src/index.js</code>
<code class="language-bash"># Windows > set GOOGLE_CLIENTID=myGoogleClientId > set GOOGLE_CLIENTSECRET=myGoogleClientSecret > set FACEBOOK_CLIENTID=myFacebookClientId > set FACEBOOK_CLIENTSECRET=myFacebookClientSecret > node src/index.js</code>このプロセスの最終結果は、Token認証サポート(JSON Webトークンを使用)を安全なエンドポイントに追加し、ソーシャルログインサポート(GoogleおよびFacebookを使用)を追加して、残りのトークンプロビジョニングの使用を取得することです。これは、ソーシャルプロバイダーを使用して1回認証し、生成されたJWTを使用してアプリ内のすべての将来のAPI呼び出しを行う必要があることを意味します。
JWTは、安全でありながら完全に自己完結型であるため、シナリオにとって特に良い選択です。 JWTは、JSONペイロードと暗号化された署名で構成されています。ペイロードには、認証されたユーザーの詳細、認証システム、トークンの有効期間が含まれています。署名は、悪意のある第三者がそれを偽造できないことを保証します。署名キーを持っている人はトークンを生成できます。
この記事を読むと、アプリケーションの一部として含まれるconfig.jsモジュールへの参照がよく表示されます。このモジュールは、アプリケーションの構成に使用され、ノードConvictモジュールを使用して外部的に構成されています。この記事で使用されている構成は次のとおりです。
http.port - アプリケーションが実行されるポート。デフォルトは3000で、「ポート」環境変数でオーバーライドされています。
Passport Webサイトの手順に従って、Passport.session()を使用して電話をかけることにより、セッションサポートをセットアップすることが許可されます。アプリでセッションサポートは使用していないため、これは不要です。これは、Stateless APIを実装しているためです。そのため、各リクエストをセッションに維持する代わりに、各リクエストに認証を提供します。
パスポートでJWTトークン認証をセットアップするのは比較的簡単です。 Passport-JWTモジュールを使用します。これにより、すべての重い持ち上げが行われます。このモジュールは、「JWT」で始まる値を持つ「承認」ヘッダーを探し、ヘッダーの残りを認証用のJWTトークンとして扱います。次に、JWTを解読し、操作のために自分のコードに格納されている値を提供します。たとえば、ユーザールックアップを実行します。無効な署名などのJWTが無効である場合、トークンは期限切れになりました...リクエストは、あなた自身のコードの追加の関与なしに認識されません。
次に、JWTトークン認証を構成する方法は次のとおりです。
上記の上記では、いくつかの内部モジュールを使用しました:<code class="language-bash"># Linux / OS X $ export GOOGLE_CLIENTID=myGoogleClientId $ export GOOGLE_CLIENTSECRET=myGoogleClientSecret $ export FACEBOOK_CLIENTID=myFacebookClientId $ export FACEBOOK_CLIENTSECRET=myFacebookClientSecret $ node src/index.js</code>
config.js - アプリケーション全体の構成プロパティが含まれています。これらのプロパティは構成されており、値をいつでも使用できると想定できます。
トークンを正常にデコードした後、ペイロードとしてコールバックに渡されます。ここでは、トークンの「トピック」によって識別されたユーザーを見つけようとしています。実際、トークンが取り消されていないことを確認するなど、追加のチェックを行うことができます。
ユーザーが見つかった場合、パスポートに提供し、パスポートをReq.Userとしてリクエスト処理の残りに提供します。ユーザーが見つからない場合、パスポートにユーザーに提供されず、パスポートは認証が失敗したと考えます。
これはリクエストハンドラーに接続できるため、リクエストが成功するために認証が必要になるようにします。
上記の3行目は、パスポートにリクエストを処理させる魔法です。これにより、Passportは、渡されたリクエストで構成した「JWT」ポリシーを実行し、すぐに継続または故障させることができます。
このテストを実行するために、https://www.jsonwebtoken.ioにアクセスし、そこでフォームに記入することにより、手動でJWTを生成しました。 「ペイロード」は私が使用しているものです:
有効なトークンでのみリソースにアクセスできるようになり、実際にトークンを生成する方法が必要です。これは、正しい詳細を備えたJWTを構築し、上記と同じキーで署名するJSONWebtokenモジュールを使用して行われます。 JWTSを生成するときに、まったく同じオーディエンス、発行者、およびキー構成設定を使用することに注意してください。また、JWTの有効期間が1時間であることを指定します。これは、アプリにとって合理的であると思われる期間であり、構成から簡単に変更できるように抽出することもできます。 この場合、JWT IDは指定されていませんが、これを使用してトークン用の完全に一意のIDを生成することができます。たとえば、UUIDを使用します。これにより、トークンを取り消し、DataStoreに取り消されたIDのコレクションを保存し、パスポートポリシーでJWTを処理するときにJWT IDがリストにないかどうかを確認する方法が提供されます。 トークンを生成する機能があるため、ユーザーに実際にログインする方法が必要です。これは、ソーシャルログインプロバイダーが登場する場所です。ユーザーがソーシャルログインプロバイダーにリダイレクトし、成功するとJWTトークンを生成し、将来のリクエストのためにブラウザのJavaScriptエンジンに提供できる機能を追加します。私たちはすでにこのコンポーネントのほぼすべてを持っているので、それらをまとめる必要があります。 パスポートのソーシャルログインプロバイダーは、2つの部分に分割されます。まず、適切なプラグインを使用してソーシャルログインプロバイダーのパスポートを実際に構成する必要があります。第二に、ユーザーが指示されるエクスプレスルートは、認証を開始するために必要であり、認証が成功した後にユーザーがリダイレクトされるルートが必要です。 これらのURLを新しいサブブロウザーウィンドウで開きます。これは、完了したら閉じて、開いたウィンドウ内のJavaScriptメソッドを呼び出すことができます。これは、プロセスがユーザーに対して比較的透明であることを意味します。せいぜい新しいウィンドウが開いているのを見て、資格情報を提供するように依頼しますが、彼らが現在ログインしているという事実以外に何も見ることができません。
これにより、ウィンドウ上にグローバル関数オブジェクト(AuthingicateCallbackという名前)が登録されます。これにより、アクセストークンが保存され、ルートを開き、認証を開始します。
ここでは、オープンプログラム(つまり、メインアプリケーションウィンドウ)に上記のAuthingAteCallbackメソッドを呼び出す単純なJavaScriptコードのみがあり、その後、自分自身を閉じます。
Google認証パスポートの構成は次のようになります:
次は、このログインを管理するためにルーティングハンドラーをセットアップすることです。これらは次のようになります:
Facebook認証を実装 このモジュールは、Googleモジュールとほぼ同じ方法で動作するため、同じ設定と同じ設定が必要です。唯一の本当の違いは、それが異なるモジュールとそれにアクセスするURL構造であることです。 Facebook認証を構成するには、クライアントID、クライアントキー、およびリダイレクトURLも必要です。クライアントIDおよびクライアントキー(FacebookのアプリIDとアプリキーと呼ばれる)は、Facebook開発者コンソールでFacebookアプリを作成することで取得できます。 Facebookログイン製品がアプリに追加されていることを確認して、動作させる必要があります。 Facebook認証パスポート構成は次のとおりです
これは、「Google」の代わりに「Facebook」が使用されていることを除いて、Googleの構成とほぼ同じです。 URLルーティングも似ています
ソーシャルログインプロバイダーを使用して、ユーザーログインと登録をアプリにすばやく簡単に追加します。実際、これにより、ブラウザのリダイレクトを使用してユーザーをソーシャルログインプロバイダーに送信し、アプリに送り返すため、従来のアプリに比較的簡単に統合されていても、単一ページアプリに統合できます。 この記事は、これらのソーシャルログインプロバイダーを、使いやすく、使用したい将来のプロバイダーに簡単に拡張できることを約束する単一ページアプリケーションに統合する方法を示しています。 Passportには、さまざまなプロバイダーと連携できる多くのモジュールがあり、適切なモジュールを見つけて、GoogleやFacebookで上記のように構成するだけです。 この記事は、ジェームズ・コルチェによって査読されました。 SitePointコンテンツを最高の状態にしてくれたすべてのSitePointピアレビュアーに感謝します に関するFAQ
ソーシャルログインを私のWebアプリケーションに統合することの利点は何ですか? ソーシャルログインを使用するときにユーザーデータのセキュリティを確保する方法は? Webアプリケーションに複数のソーシャルログインを統合できますか? 複数のソーシャルメディアアカウントを使用してユーザーに対処する方法は? ユーザーがソーシャルメディアアカウントを無効にした場合はどうなりますか? CSSを使用して、ソーシャルログインボタンの外観をカスタマイズできます。ただし、ソーシャルメディアプラットフォームが提供するブランドガイドラインに従ってください。たとえば、Facebookの「F」ロゴは常に元の形式で使用する必要があり、いかなる方法でも変更しないでください。 はい、ソーシャルログインはWebおよびモバイルアプリケーションに使用できます。ソーシャルログインをモバイルアプリに統合するプロセスは、Webアプリのプロセスと似ていますが、ソーシャルメディアプラットフォームが提供する特定のSDKを使用する必要がある場合があります。 ソーシャルメディアプラットフォームでテストアカウントを作成し、これらのアカウントを使用してアプリにログインすることにより、ソーシャルログイン機能をテストできます。これにより、アプリが開始される前に問題やエラーを特定するのに役立ちます。 ユーザーがサインアップするソーシャルメディアアカウントを忘れた場合、メールアドレスまたは電話番号を入力してアカウントにリンクされたソーシャルメディアアカウントのリストを受信できるリカバリオプションを提供できます。 いくつかのツールとプラグインを使用してコーディングなしでソーシャルログインを統合できますが、コーディングの知識を知ることは有益です。これにより、統合プロセスの柔軟性と制御が可能になり、発生する可能性のある問題を解決するのにも役立ちます。 <code class="language-bash"># Windows
> set GOOGLE_CLIENTID=myGoogleClientId
> set GOOGLE_CLIENTSECRET=myGoogleClientSecret
> set FACEBOOK_CLIENTID=myFacebookClientId
> set FACEBOOK_CLIENTSECRET=myFacebookClientSecret
> node src/index.js</code>
認可ヘッダーは提供していませんでした。継続することはできません。ただし、有効な承認ヘッダーを提供する場合は、成功した応答が得られます。
<code class="language-javascript">// src/index.js
const passport = require('passport');
.....
app.use(passport.initialize());</code>
サポートトークン生成
<code class="language-bash"># Linux / OS X
$ export GOOGLE_CLIENTID=myGoogleClientId
$ export GOOGLE_CLIENTSECRET=myGoogleClientSecret
$ export FACEBOOK_CLIENTID=myFacebookClientId
$ export FACEBOOK_CLIENTSECRET=myFacebookClientSecret
$ node src/index.js</code>
ソーシャルログインプロバイダー
<code class="language-bash"># Windows
> set GOOGLE_CLIENTID=myGoogleClientId
> set GOOGLE_CLIENTSECRET=myGoogleClientSecret
> set FACEBOOK_CLIENTID=myFacebookClientId
> set FACEBOOK_CLIENTSECRET=myFacebookClientSecret
> node src/index.js</code>
この関数は、認証を開始する方法でトリガーできます。これは通常、タイトル領域のログインリンクですが、詳細はアプリに完全に依存します。 <code class="language-bash"># Linux / OS X
$ export GOOGLE_CLIENTID=myGoogleClientId
$ export GOOGLE_CLIENTSECRET=myGoogleClientSecret
$ export FACEBOOK_CLIENTID=myFacebookClientId
$ export FACEBOOK_CLIENTSECRET=myFacebookClientSecret
$ node src/index.js</code>
Passport-Google-Oauthモジュールを使用すると、Googleに対して認証されます。これには、3つの情報が必要です
<code class="language-bash"># Windows
> set GOOGLE_CLIENTID=myGoogleClientId
> set GOOGLE_CLIENTSECRET=myGoogleClientSecret
> set FACEBOOK_CLIENTID=myFacebookClientId
> set FACEBOOK_CLIENTSECRET=myFacebookClientSecret
> node src/index.js</code>
<code class="language-javascript">// src/index.js
const passport = require('passport');
.....
app.use(passport.initialize());</code>
最初のソーシャルログインプロバイダーができたので、2番目のソーシャルログインプロバイダーを拡張して追加しましょう。今回は、Passport-Facebookモジュールを使用してFacebookになります。
<code class="language-javascript">// src/authentication/jwt.js
const passport = require('passport');
const passportJwt = require('passport-jwt');
const config = require('../config');
const users = require('../users');
const jwtOptions = {
// 从 "Authorization" 标头获取 JWT。
// 默认情况下,这会查找 "JWT " 前缀
jwtFromRequest: passportJwt.ExtractJwt.fromAuthHeader(),
// 用于签署 JWT 的密钥
secretOrKey: config.get('authentication.token.secret'),
// JWT 中存储的发行者
issuer: config.get('authentication.token.issuer'),
// JWT 中存储的受众
audience: config.get('authentication.token.audience')
};
passport.use(new passportJwt.Strategy(jwtOptions, (payload, done) => {
const user = users.getUserById(parseInt(payload.sub));
if (user) {
return done(null, user, payload);
}
return done();
}));</code>
ここでは、デフォルトのセットで十分であるため、使用する範囲を指定する必要はありません。それ以外の場合、GoogleとFacebookの間の構成はほぼ同じです。 <code class="language-javascript">// src/index.js
app.get('/api/secure',
// 此请求必须使用 JWT 进行身份验证,否则我们将失败
passport.authenticate(['jwt'], { session: false }),
(req, res) => {
res.send('Secure response from ' + JSON.stringify(req.user));
}
);</code>
概要
ソーシャルログインをWebアプリケーションに統合すると、いくつかの利点があります。まず、ユーザーは、別のユーザー名とパスワードを覚えていない既存のソーシャルメディアアカウントに登録できるため、ユーザーの登録プロセスを簡素化します。第二に、単純化された登録プロセスにより、より多くのユーザーがサインアップできるようになるため、コンバージョン率を改善できます。最後に、ソーシャルメディアプロファイルでユーザーデータにアクセスできるようになり、ウェブサイトでのエクスペリエンスをパーソナライズするために使用できます。
ソーシャルログインを統合するときにユーザーデータのセキュリティを確保することが重要です。これは、OAUTH 2.0などの安全なプロトコルを使用して認証することで行うことができます。これにより、ユーザーパスワードがアプリと共有されないようにします。さらに、アプリケーションで必要なユーザーデータの最小額のみを要求し、このデータが安全に保存されることを確認する必要があります。
はい、Webアプリケーションに複数のソーシャルログインを統合できます。これにより、ユーザーがより多くの選択肢を提供し、登録の可能性を高めることができます。ただし、ユーザーが使用することを選択したソーシャルログインに関係なく、ユーザーエクスペリエンスがシームレスであることを確認することが重要です。
複数のソーシャルメディアアカウントを持つユーザーの処理は困難です。解決策の1つは、ユーザーがアプリの複数のソーシャルメディアアカウントを単一のアカウントにリンクできるようにすることです。このようにして、リンクされたアカウントでログインするオプションがあります。
ユーザーがソーシャルメディアアカウントを無効にした場合、アカウントを使用してアプリにログインすることができなくなります。これを処理するために、ユーザーにメールアドレスまたは電話番号をアカウントに追加するオプションを提供できます。ソーシャルメディアアカウントを無効にすると、この情報をログインできます。
ソーシャルログインボタンの外観をカスタマイズする方法は?
モバイルアプリにソーシャルログインを使用できますか?
ソーシャルログイン機能をテストする方法は?
ユーザーが使用するソーシャルメディアアカウントに登録するのを忘れた場合はどうすればよいですか?
コーディングなしでソーシャルログインを統合できますか?
以上がスパのソーシャルログイン:GoogleとFacebookを介してユーザーを認証するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。