2

IOS クライアントを受け入れるセキュリティのために OAuth 2 を使用して動作するサンプル Web アプリケーションを取得しようとしていますが、少し問題があります。

ブラウザ クライアント

node.js/passportサンプル コードを使用して、Google クライアント ID とシークレット (https://code.google.com/apis/console) を追加しました。私がしなければならなかったのは、サーバーの承認コールバックでリダイレクト URI を指すようにすることだけでした。

IOS クライアント

上記と同じサーバー側コードと、IOS 用の gtm-oauth2 ライブラリを使用して、いくつかの問題が発生しました。Google の指示に従ってインストール済みアプリケーションのクライアント ID を作成し、それらを使用するようにサーバーを変更して、ios アプリに追加しました。アプリは Google サインイン ページにアクセスできますが、リダイレクト時にエラーが発生します (リダイレクト URI を変更していないため、これは理にかなっています)。

Google は、リダイレクト URI について次の2 つのオプションを提供しています。

  1. 何かを壷にする
  2. ローカルホスト

サーバーは何らかのソートまたはリダイレクトを必要としますが、IOS リダイレクト URI のサブビングは機能しておらず、サーバーが検証のために呼び出される特定の URI を持つ必要があることを考えると、そうすべきではないようです。

passport.use(new GoogleStrategy({
    clientID: GOOGLE_CLIENT_ID,
    clientSecret: GOOGLE_CLIENT_SECRET,
    callbackURL: "http://127.0.0.1:3000/auth/google/callback"
  },
  function(accessToken, refreshToken, profile, done) {
    // asynchronous verification, for effect...
    process.nextTick(function () {

      // To keep the example simple, the user's Google profile is returned to
      // represent the logged-in user.  In a typical application, you would want
      // to associate the Google account with a user record in your database,
      // and return that user instead.
      return done(null, profile);
    });
  }
));

...

app.get('/auth/google/callback', 
  passport.authenticate('google', { failureRedirect: '/login' }),
  function(req, res) {
    res.redirect('/');
  });

app.get('/logout', function(req, res){
  req.logout();
  res.redirect('/');
});

2 つの異なるエラーが発生します。

  1. ブラウザ クライアントで機能するリダイレクトと、インストール済み/ios アプリのクライアント ID + シークレットの使用 - リダイレクト エラー
  2. iOS クライアント ID + シークレット + iOS + リダイレクト (urn) の使用 - クライアント エラー

IOS リダイレクト URI を IOS クライアントに追加する必要がありますか、それとも node.js サーバーにある種のリダイレクト パラメータを挿入して、クライアントについて通知する必要がありますか? または、基本的な何かが欠けていますか?

4

1 に答える 1

3

ここで達成しようとしていること、つまり、インストールされたアプリケーションWeb サーバー アプリケーションフローに同じ資格情報を使用することは機能しません。Google は、認証情報を発行したアプリケーションの種類を認識し、これを適用します。(これは間違っています。コメントを参照してください。)

シナリオの一般的な方法は、サーバーにWeb サーバー アプリケーション フローを実装し、iOS デバイスで認証エンドポイント URLを開いてログインを開始することですredirect_uriが、サーバーに を設定します。そうすれば、サーバーでアクセス トークンリフレッシュ トークンを取得し、そこから Google API を呼び出すことができます。

iOS クライアントと Web サーバー間の通信方法は、他のすべてのものから完全に独立しています。

于 2012-08-21T13:59:21.437 に答える