[NodeJS] Google、Facebook、TwitterのOAuth認証を実装する
こんにちは、@yoheiMuneです。
今日は、node.jsのpassportというモジュールを用いて、Google, Facebook, TwitterのOAuth認証を実装する方法をブログに書きたいと思います。
有名どころの認証も含め140種類以上をサポートしているらしく、各種認証の実装も似たように行うことができるので、 学習コストが低く簡単に導入できると感じました。
Passportは、本体モジュールが1つと、あとは使う認証先毎にモジュールが用意されています。
例えば、GoogleのOAuthを使う場合には、以下の2つをインストールします。
とさっそくですが、Passportで行うGoogle認証は、OAuthではなくOpenIDを利用した形式です。 OAuthではないですが、認証を他サービスを利用できるので、OAuthの代替として使っていけると思います。
PassportでGoogleの認証をするために、以下のモジュールをインストールします。
続いて実装方法ですが、以下の3ステップで行います。
いい感じに簡単です☆
FacebookのOAuth認証を行う為には、まずFacebookアプリ登録ページでアプリとして登録する必要があります。
登録すると、「AppID」と「App Secret」という値が提供されるので、その値を後続の処理で利用します。
またFacebookアプリ登録では、ログイン可能なURLを1つしか指定できない?ようなので、開発と本番など環境毎にアプリ登録する必要があるようです(勘違いだったらすみません)。
アプリの登録が終わったらPassportを用いた実装を行います。実装内容はGoogle認証と同じ手順となります。
これで、FacebookのOAuth認証の実装が完了です。
最後にTwitterのOAuth認証を行う方法です。手順はFacebookとだいたい同じ感じです。
まずはTwitterへアプリケーション登録を行います。Twitterアプリケーション登録で、アプリケーションを登録する必要があります。 Facebookと異なり、開発環境や本番環境が違えど、1つの登録があれば大丈夫のようです。
Webアプリケーションで使いたいため、コールバックURLの指定を行います。 指定を行わない場合は、認証コードが発行され、そのコードをユーザーがアプリに登録する必要が出てくるようです。
アプリ登録が終わったら、実装を行います。
node.jsでOAuth認証を実装する場合には、今後ぜひ使って行きたいライブラリだと感じました。
最後までご覧頂きましてありがとうございました。
今日は、node.jsのpassportというモジュールを用いて、Google, Facebook, TwitterのOAuth認証を実装する方法をブログに書きたいと思います。
OAuth認証を簡単に実装できるPassportモジュール
node.jsでOAuthを実装するにはいくつかの方法がありますが、Passportというnpmモジュールが大変便利です。有名どころの認証も含め140種類以上をサポートしているらしく、各種認証の実装も似たように行うことができるので、 学習コストが低く簡単に導入できると感じました。
Passportは、本体モジュールが1つと、あとは使う認証先毎にモジュールが用意されています。
例えば、GoogleのOAuthを使う場合には、以下の2つをインストールします。
$ npm install passport -- save
$ npm install passport-google --saveそれでは、具体的なOAuthの認証を見て行きましょー。
GoogleのOAuth認証を行う
以下で記載している手順の最新版は、http://passportjs.org/guide/google/を確認ください。
とさっそくですが、Passportで行うGoogle認証は、OAuthではなくOpenIDを利用した形式です。 OAuthではないですが、認証を他サービスを利用できるので、OAuthの代替として使っていけると思います。
PassportでGoogleの認証をするために、以下のモジュールをインストールします。
$ npm install passport-google --saveこれで準備は完了です。
続いて実装方法ですが、以下の3ステップで行います。
- 1、Configurationの実装
- 2、Routingの実装
- 3、HTMLの実装
1、Configurationの実装
passportを利用する部分を以下のように実装します。// モジュール準備 var passport = require('passport'); var GoogleStrategy = require('passport-google').Strategy; // Passportを利用する実装 passport.use(new GoogleStrategy({ // 以下のreturnURL先をRoutingで実装します returnURL: 'http://www.example.com/auth/google/return', realm: 'http://www.example.com/' }, // 認証が終わったら呼び出される関数です function(identifier, profile, done) { // identifierがopenID // profileがユーザー情報(例:profile.displayName) // done関数を実行して処理終了を通知 // 以下例では、openIdを元にサイト内でユーザーを特定して、 // 次の処理(=Routing)へ移るように実装されています。 User.findOrCreate({ openId: identifier }, function(err, user) { done(err, user); }); } ));PassportのGoogle認証用のStrategyクラスを利用して、認証を実装します。
2、Routingの実装
続いてNode.jsのExpressなどを使った場合の、ルーティング設定を行います。// 認証を開始する為のURL app.get('/auth/google', passport.authenticate('google')); // 認証終了後のGoogleからのコールバックに対応するURL app.get('/auth/google/return', passport.authenticate('google', { successRedirect: '/', failureRedirect: '/login' }));もし、上記の実装でdone(err, user)で設定したuserを扱いたい場合には、以下のように実装します。
// 認証終了後のGoogleからのコールバックに対応するURL app.get('/auth/google/return', function (req, res, next) { passport.authenticate('google', function (err, user) { // 必要に応じてresponseを作ったり、cookieの制御を行う。 })(req, res, next); });
3、HTMLの実装
最後にGoogle認証を開始するHTMLを作成します。<a href="/auth/google">Sign In with Google</a>このリンクをクリックすることで、上記に実装したGoogle認証を実行することが出来ます。
いい感じに簡単です☆
FacebookのOAuth認証を行う
以下で記載している手順の最新版は、http://passportjs.org/guide/facebook/を確認ください。
FacebookのOAuth認証を行う為には、まずFacebookアプリ登録ページでアプリとして登録する必要があります。
登録すると、「AppID」と「App Secret」という値が提供されるので、その値を後続の処理で利用します。
またFacebookアプリ登録では、ログイン可能なURLを1つしか指定できない?ようなので、開発と本番など環境毎にアプリ登録する必要があるようです(勘違いだったらすみません)。
アプリの登録が終わったらPassportを用いた実装を行います。実装内容はGoogle認証と同じ手順となります。
1、Configurationの実装
Passportを利用して、FacebookのOAuth認証のリクエストを扱う部分を実装します。// モジュールロード // passport-facebookモジュールを事前にnpm installしておく必要があります。 var passport = require('passport') , FacebookStrategy = require('passport-facebook').Strategy; // リクエスト送信とコールバックの処理 passport.use(new FacebookStrategy({ // アプリ登録した際のAppIdとAppSecretを指定します。 clientID: FACEBOOK_APP_ID, clientSecret: FACEBOOK_APP_SECRET, // ログイン許可のあるドメインでコールバックを指定する必要があります。 callbackURL: "http://www.example.com/auth/facebook/callback" }, function(accessToken, refreshToken, profile, done) { User.findOrCreate(..., function(err, user) { if (err) { return done(err); } done(null, user); }); } ));
2、Routingの実装
続いてRoutingの実装です。Google認証の場合と、同じ感じです。// このURLが呼ばれたら、Facebook認証を開始します。 app.get('/auth/facebook', passport.authenticate('facebook')); // もし認証時にFacebookで利用する権限を拡大したい場合には、以下のように拡大したい権限を指定します。 // passport.authenticate('facebook', { scope: ['read_stream', 'publish_actions'] }); // コールバックに対応する処理を記載します。 app.get('/auth/facebook/callback', passport.authenticate('facebook', { successRedirect: '/', failureRedirect: '/login' }));
3、HTMLの実装
最後に、上記認証を開始する為の入り口となるHTMLを記載します。<a href="/auth/facebook">Login with Facebook</a>
これで、FacebookのOAuth認証の実装が完了です。
TwitterのOAuth認証を行う
以下で記載している手順の最新版は、http://passportjs.org/guide/twitter/を確認ください。
最後にTwitterのOAuth認証を行う方法です。手順はFacebookとだいたい同じ感じです。
まずはTwitterへアプリケーション登録を行います。Twitterアプリケーション登録で、アプリケーションを登録する必要があります。 Facebookと異なり、開発環境や本番環境が違えど、1つの登録があれば大丈夫のようです。
Webアプリケーションで使いたいため、コールバックURLの指定を行います。 指定を行わない場合は、認証コードが発行され、そのコードをユーザーがアプリに登録する必要が出てくるようです。
アプリ登録が終わったら、実装を行います。
1、Configurationの実装
Passportを通して、OAuth認証を行う部分を実装します。// モジュールロード // passport-twitterモジュールを事前にnpm installしておく必要があります。 var passport = require('passport') , TwitterStrategy = require('passport-twitter').Strategy; passport.use(new TwitterStrategy({ // 上記アプリ登録で取得したキーを指定します。 consumerKey: TWITTER_CONSUMER_KEY, consumerSecret: TWITTER_CONSUMER_SECRET, // callbackで受け取りたいURLを指定します。 callbackURL: "http://www.example.com/auth/twitter/callback" }, // Callback時の処理を記載します。 function(token, tokenSecret, profile, done) { User.findOrCreate(..., function(err, user) { if (err) { return done(err); } // ここではユーザーが存在すれば、次の処理へ移ります。 done(null, user); }); } ));
2、Routingの実装
続いてRoutingの設定です。// 認証を開始する処理を記載します。 app.get('/auth/twitter', passport.authenticate('twitter')); // コールバックで呼び出された際の処理を記載します。 app.get('/auth/twitter/callback', passport.authenticate('twitter', { successRedirect: '/', failureRedirect: '/login' }));
3、HTMLの実装
最後に上記の認証開始URLを踏む為の、HTMLを記載します。<a href="/auth/twitter">Sign in with Twitter</a>これでTwitterのOAuth認証の実装が完了しました。
最後に
各種サービスを用いた認証処理は、各サービス毎に採用している企画が違うし、 同じOAuthでも少しずつ違いがあったりと、それぞれを実装するのはものすごく大変です。 このPassportはそんなめんどくさいところを隠蔽してくれているので、大変ありがたいライブラリです。 またコールバック時の情報の受け取り方も一貫しているので、1つ実装すると他のも実装しやすくて大変助かります。node.jsでOAuth認証を実装する場合には、今後ぜひ使って行きたいライブラリだと感じました。
最後までご覧頂きましてありがとうございました。