25

OAuth および OAuth2 プロバイダー (Facebook、Google、Twitter など) を使用してユーザーを検証し、アクセス トークンを提供する iOS があります。名前や電子メール アドレスなどの最小限のデータを除いて、アプリはこれらのサービスを認証以外には使用しません。

次に、アプリはアクセス トークンをサーバーに送信して、ユーザーが認証されたことを示します。

サーバーは Node.js で記述されており、何かを実行する前に、提供されたアクセス トークンを正しい OAuth* サービスに対して検証する必要があります。

私は周りを見回してきましたが、これまでに見つけたすべての node.js 認証モジュールは、サーバーが提供する Web ページを介してログインおよび認証するためのもののようです。

提供されたアクセス トークンの簡単な検証を実行できる node.js モジュールを知っている人はいますか?

4

4 に答える 4

73

私の知る限り(そして仕様を読んでわかる限り)、OAuthとOAuth 2の仕様では、アクセストークンの検証に単一のエンドポイントを指定していません。つまり、アクセストークンのみを検証するには、プロバイダーごとにカスタムコードが必要になります。

指定したエンドポイントをどうするかを調べました。

フェイスブック

Facebook用のグラフAPIの「me」エンドポイントを使用してトークンが有効かどうかを確認している人もいるようです。基本的に、リクエスト:

https://graph.facebook.com/me?access_token={accessToken}

グーグル

Googleには、アクセストークン情報を取得するための専用のデバッグエンドポイントがあり、優れたドキュメントもあります。基本的に、リクエスト:

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token={accessToken}

ただし、本番環境ではこれを行わないことをお勧めします。

エンドポイントはデバッグに役立ちますが、tokeninfo本番環境では、キーエンドポイントからGoogleの公開鍵を取得し、ローカルで検証を実行します。jwks_uriメタデータ値を使用して、検出ドキュメントからキーURIを取得する必要があります。デバッグエンドポイントへの要求は抑制されるか、断続的なエラーが発生する可能性があります。

Googleが公開鍵を変更することはめったにないため、HTTP応答のキャッシュディレクティブを使用して公開鍵をキャッシュでき、ほとんどの場合、tokeninfoエンドポイントを使用するよりもはるかに効率的にローカル検証を実行できます。この検証では、証明書を取得して解析し、適切な暗号化呼び出しを行って署名を確認する必要があります。幸い、これを実現するために、さまざまな言語で利用できる十分にデバッグされたライブラリがあります(jwt.ioを参照)。

ツイッター

Twitterには、これを行うための本当に明白な方法がないようです。アカウント設定データはかなり静的であるため、これが検証の最良の方法である可能性があります(ツイートを取得すると、おそらく待ち時間が長くなりますか?)、(適切なOAuth署名などを使用して)リクエストできます。

https://api.twitter.com/1.1/account/settings.json

このAPIは、ウィンドウごとに15回にレート制限されていることに注意してください。

全体として、これは最初に表示されるよりも難しいようです。サーバーに何らかのセッション/認証サポートを実装することをお勧めします。基本的に、一度取得した外部OAuthトークンを確認してから、作成を続けるのではなく、自分のサーバーでユーザーID(電子メール、FB IDなど)を使用して認証する独自のセッショントークンをユーザーに割り当てることができます。自分で取得するすべてのリクエストに対するOAuthプロバイダーへのリクエスト。

お役に立てば幸いです。

于 2012-09-07T08:43:28.237 に答える
2

本番環境の Google の場合は、 google -auth-library ( npm install google-auth-library --save) をインストールし、次を使用します。

const { OAuth2Client } = require('google-auth-library');
const client = new OAuth2Client(GOOGLE_CLIENT_ID); // Replace by your client ID

async function verifyGoogleToken(token) {
  const ticket = await client.verifyIdToken({
    idToken: token,
    audience: GOOGLE_CLIENT_ID  // Replace by your client ID 
  });
  const payload = ticket.getPayload();
  return payload;
}

router.post("/auth/google", (req, res, next) => {
  verifyGoogleToken(req.body.idToken).then(user => {
    console.log(user); // Token is valid, do whatever you want with the user 
  })
  .catch(console.error); // Token invalid
});

バックエンド サーバーで Google トークンを認証する の詳細については、node.js、java、python、および php の例を参照してください。

Facebookの場合、次のような https リクエストを実行します。

const https = require('https');

router.post("/auth/facebook", (req, res, next) => {

  const options = {
    hostname: 'graph.facebook.com',
    port: 443,
    path: '/me?access_token=' + req.body.authToken,
    method: 'GET'
  }

  const request = https.get(options, response => {
    response.on('data', function (user) {
      user = JSON.parse(user.toString());
      console.log(user);
    });
  })

  request.on('error', (message) => {
    console.error(message);
  });

  request.end();
})
于 2021-02-10T18:17:01.067 に答える