2011-10-18 12 views
10

認証用のoauth 2.0プロバイダで残りのAPIを設定したいと思います。私はPythonを使用しています。 アプリケーションエンジンで動作するPythonでコード化されたoauth 2.0プロバイダを設定するためのライブラリはありますか?おかげさまで googleアプリケーションエンジンoauth2プロバイダ

答えて

2

OAuth for Pythonの商品情報をチェックしてみましたか? 「このリファレンスでは、PythonアプリケーションでOAuthをサービスプロバイダとして使用する方法について説明しています。」

+0

完全にグーグルに依存し、私の認証を行い、認証なく、私のサービスのためのGoogleを使用しています! – neo

+0

次に、PythonでOAuthを完全に実装するには、[python-oauth2](https://github.com/simplegeo/python-oauth2)を参照してください。 –

+1

名前にもかかわらず、それはoauth 1.0プロバイダだけを作成するために使用できると思います – neo

22

OAuth2は、PythonとJava App Engineの両方のランタイムに組み込まれています。 Pythonで

に必要なものは次のとおりです。

あなたが使用するJavaでは
from google.appengine.api import oauth 

# Note, unlike in the Android app below, there's no 'oauth2:' prefix here 
SCOPE = 'https://www.googleapis.com/auth/userinfo.email' 

# magic happens here 
user = oauth.get_current_user(SCOPE) 

OAuthService oauth = OAuthServiceFactory.getOAuthService(); 

// Note, unlike in the Android app below, there's no 'oauth2:' prefix here 
String SCOPE = "https://www.googleapis.com/auth/userinfo.email"; 

// magic happens here 
User user = oauth.getCurrentUser(SCOPE); 

は、ここでは、ユーザーを検証することができます完全なPython 2.7ハンドラです:

from google.appengine.api import oauth 
import logging 
import traceback 
import webapp2 


class MainHandler(webapp2.RequestHandler): 

    def post(self): 
    self.response.headers['Content-Type'] = 'text/plain' 
    self.response.write('Hi there!\n') 

    # Note, unlike in the Android app below, there's no 'oauth2:' prefix here 
    scope = 'https://www.googleapis.com/auth/userinfo.email' 
    try: 
     self.response.write('\noauth.get_current_user(%s)' % repr(scope)) 

     # validates audience of the OAuth2 access token 
     allowed_clients = ['407408718192.apps.googleusercontent.com'] # list your client ids here 
     token_audience = oauth.get_client_id(scope) 
     if token_audience not in allowed_clients: 
     raise oauth.OAuthRequestError('audience of token \'%s\' is not in allowed list (%s)' % (token_audience, allowed_clients))   

     # gets user object for the user represented by the oauth token 
     user = oauth.get_current_user(scope) 
     self.response.write(' = %s\n' % user) 
     self.response.write('- auth_domain = %s\n' % user.auth_domain()) 
     self.response.write('- email  = %s\n' % user.email()) 
     self.response.write('- nickname = %s\n' % user.nickname()) 
     self.response.write('- user_id  = %s\n' % user.user_id()) 
    except oauth.OAuthRequestError, e: 
     self.response.set_status(401) 
     self.response.write(' -> %s %s\n' % (e.__class__.__name__, e.message)) 
     logging.warn(traceback.format_exc()) 


app = webapp2.WSGIApplication([ 
    ('/.*', MainHandler) 
], debug=True) 

app.yamlは簡単です

application: your-app-id 
version: 1 
runtime: python27 
api_version: 1 
threadsafe: true 

handlers: 
- url: /favicon\.ico 
    static_files: favicon.ico 
    upload: favicon\.ico 

- url: .* 
    script: main.app 

クライアントは、Authorization: Bearer HTTPリクエストヘッダーでOAuth2トークンを送信する必要があります。

Authorization: Bearer ya29XAHES6ZT4w72FecXjZu4ZWskTSX3x3OqYxUSTIrA2IfxDDPpI 

あなたがAndroidアプリを構築することが起こる場合は、あなたが簡単にAccountManagerインタフェースを使用して、これらのトークンを生成することができます

AccountManager accountManager = AccountManager.get(this); 
Account[] accounts = accountManager.getAccountsByType("com.google"); 

// TODO: Allow the user to specify which account to authenticate with 
for (Account account : accounts) { 
    Log.i(TAG, "- account.name = " + account.name); 
} 

// Note the "oauth2:" prefix here 
String authTokenType = "oauth2:https://www.googleapis.com/auth/userinfo.email"; 

// Note: AccountManager will cache these token, even after they've expired. 
// TODO: Invalidate expired tokens, either after auth fails, or preemptively via: 
// accountManager.invalidateAuthToken(accounts[0].type, token); 

accountManager.getAuthToken(accounts[0], authTokenType, null, this, 
    new AccountManagerCallback<Bundle>() { 
     @Override 
     public void run(AccountManagerFuture<Bundle> future) { 
     try { 
      String token = future.getResult().getString(AccountManager.KEY_AUTHTOKEN); 
      Log.i(TAG, "Got KEY_AUTHTOKEN: " + token); 
      // Don't forget HTTP Header "Authorization: Bearer <token>" 
      callAppEngineRestApi(token); // <---- Your code here 
     } catch (OperationCanceledException e) { 
      Log.i(TAG, "The user has denied you access to the API"); 
     } catch (Exception e) { 
      Log.i(TAG, "Exception: ", e); 
     } 
     } 
    }, null); 

あなたはすべてを一緒に入れてもらいたい場合は、チェックアウトまでお気軽に

+0

あなたは本当ですか? Afaik GaeはOauth 1.0aだけをサポートしています。 – systempuntoout

+0

私はあなたのコードはテストされましたが、それは制作物ではありません - 例外: - 私はPython 2.5を使用していました。 – Chameleon

+0

GoogleとStackOverflowの周りをかなり見回しました。これは私が見つけた素敵な作業コードでの唯一の答えです。 (完全な例については、付属のURLを参照してください)。 Worked for Javaも問題になりますので、質問のタイトルはJavaユーザーの誤解を招く可能性があります。 – Guy

0

私はこのスニペットに苦しんで、誰のためにそれをここに追加しているので、私は上記の回答にコメントすることはできません。

# magic happens here 
user = oauth.get_current_user(SCOPE) 

このトークンの長さがAEライブラリの問題を引き起こすため、サービスアカウントを使用している場合はAppEngineが1ヶ月間壊れています(今日ではGoogleのユーザートークンとも言えます)。 Googleはすぐにそれを修正する可能性は低いと私に言った。

これは、現時点では、私の作品唯一のものです:

token = self.request.headers['Authorization'].split(' ')[1] 
    url = 'https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=' + token 
    oauth_response = urlfetch.fetch(url) 
    if oauth_response.status_code != 200: 
     raise Exception('Unable to authorise: {}/{}'.format(oauth_response.status_code, oauth_response.content)) 
    token_response = json.loads(oauth_response.content) 
    email = token_response['email'] 
+0

これは何をするのですか?その背後にある論理は何ですか? – Praxiteles

+0

GoogleレスポンスAPIを使用してベアラトークンをデコードし、レスポンスから電子メールアドレスを抽出します。 – KevH

関連する問題