6

Google Cloud Endpoints APIのクライアントは、エンドポイントAPI自体と同じGoogle App EngineアプリケーションでホストされるJavaScript(AngularJS)Webアプリケーションです。ユーザーはwebapp2 sessions(データストア)を使用して認証します。必ずしもGoogleアカウントを持っているとは限りません。 /api/users/meのようなEndpoints APIへのリクエストは、現在ログインしているユーザーのユーザーデータを返します。webapp2セッションを使用したGoogle Cloud Endpoints認証

まず、私はApp EngineアプリケーションのOAuth2プロバイダーを実装しなければならないと思っていました。 AngularJSアプリケーションで、独自のApp Engine OAuthプロバイダ(GoogleのOAuthプロバイダではなく、組み込みの認証メカニズムのような)からOAuth2アクセストークンをリクエストさせます。

しかし、this commentは、独自のOAuth2プロバイダを実装するのではなく、エンドポイントAPIに対するリクエスト(メッセージフィールドまたはHTTPヘッダー)で任意のパラメータを提供することを提案しています。私はそのパラメータは、ユーザートークン(いくつかの暗号化された値は、ログインユーザーに固有のものでなければならないと思います)。その値はブラウザに渡されます。それは安全ではないですか?可能であれば(コストを節約するために)私のAngularJSアプリケーションをHTTPSに提供しないことを望みます。

これはOAuth2の良い使用例ですか?または、OAuth2は、サードパーティのアプリケーションにユーザデータへのアクセスを許可する場合にのみ使用できますか?

OAuth2は、ユーザートークンをブラウザに安全に渡し、man-in-the-middle攻撃を防ぐ方法です。特定の時間が経過した後にユーザートークンが期限切れになる必要がありますか?

+1

さらに、自分の認証をまったくロールすることはお勧めしません。そうすることで問題が発生します。認証パラメータを渡すことについて言及したとき、私は他のプロバイダ(TwitterやFacebookなど)のコンテキストで、ユーザーを識別するトークンを提供していました。ほとんどの場合、これらの値はHTTPS経由でブラウザに渡すのが安全です。ほとんどのユーザーはFacebook/Twitter/Yahoo/Google /(他の大規模なアイデンティティプロバイダを挿入する)アカウントを1つ以上所有しているので、認証を処理するためにそれらの企業を延期することは、ほとんど常に良いアイデアです。 –

+0

現在、私のアプリケーションは、認証を処理するために、[gae-simpleauth](https://code.google.com/p/gae-simpleauth/)に類似したフェデレーションログインと類似のものを使用しています。ユーザーは、FacebookまたはGoogleアカウント、またはユーザー名/パスワードの組み合わせを使用してログインできます。だから多分私はもはやユーザー名/パスワードをサポートしなくてもよいはずです(私は多くの人々がプライバシー上の理由から自分のFacebookやGoogleアカウントを使ってウェブサイトにログインすることを熱望していないと思います)。 HTTPS経由でAngularJSアプリを提供する場合、エンドポイントAPIをリクエストするユーザーを識別するために、{'provider': 'facebook'、 'access_token': 'TOKEN'} 'などの情報を渡す必要があります。 – Korneel

+2

はい、そうです。ユーザー名/パスワードの認証を諦めたくない場合は、ユーザーのログイン時にトークンを作成することで同様のことができます。トークンには有効期限がなければなりません。それ以外の場合はパスワードと同じです(渡すべきではありません)。リクエストとURLの周りに)。 –

答えて

1

私はちょうどあなたが記述したものを正確に実装し終えました。基本的に、この方法は、トリックを行います。

def get_current_session(request_state): 
    cookies = werkzeug.http.parse_cookie(request_state.headers.get('Cookie')) 
    sess_cookie = cookies.get('mc_session') 
    parts = sess_cookie.split('|') 
    if len(parts) != 3: 
     logging.error('Cookie does not have 3 parts') 
     return False 

    signature = hmac.new(COOKIE_SECRET_KEY, digestmod=hashlib.sha1) 
    signature.update('|'.join(parts)) 
    sig_hex = signature.hexdigest() 
    if compare_hashes(sig_hex, parts[2]): 
     logging.error('Cookie signature mismatch!') 
     return False 

    cookie_data = webapp2_extras.json.b64decode(parts[0]) 
    return sessions_ndb.Session.get_by_sid(cookie_data['_sid']) 

そして、あなたはあなたのAPIメソッドから使​​用していることを呼びたい:

session = get_current_session(self.request_state) 

あなたはですべての詳細を見つけることができます:私の他のコメントを明確にするためhttps://blog.artooro.com/2014/08/21/share-sessions-between-google-cloud-endpoints-and-webapp2/

関連する問題