2011-10-18 25 views
10

Chcę skonfigurować api odpoczynku z dostawcą Oauth 2.0 do uwierzytelniania. Używam Pythona. Czy istnieje biblioteka do konfigurowania dostawcy Oauth 2.0 zakodowanego w pythonie, który działa na silniku aplikacji? Dzięki.Operator wyszukiwarki Google oauth2 dostawca

Odpowiedz

2

Czy zapoznałeś się z artykułem o OAuth for Python? Mówi, że jest tak "W tym odwołaniu opisano, jak używać OAuth z aplikacjami Python jako dostawcy usług."

+0

że używa Google dla uwierzytelniania nie mój serwis, który sprawia, że ​​moje uwierzytelniania całkowicie uzależnione od Google! – neo

+0

Następnie spójrz na [python-oauth2] (https://github.com/simplegeo/python-oauth2), aby uzyskać pełną implementację protokołu OAuth w języku Python. –

+1

Myślę, że pomimo nazwy może być używany do tworzenia tylko 0 dostawców OIDh – neo

22

Obsługa OAuth2 w obu środowiskach wykonawczych Python i Java App Engine.

W Pythonie wszystko czego potrzebujesz to:

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) 

W Javie należałoby użyć:

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); 

Oto pełna Python 2.7 teleskopowa, która pozwoli zweryfikować użytkownika:

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) 

Aplikacja.yaml jest banalna

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 

Należy zauważyć, że klient powinien wysłać token OAuth2 w nagłówku żądania HTTP Authorization: Bearer, np.

Authorization: Bearer ya29XAHES6ZT4w72FecXjZu4ZWskTSX3x3OqYxUSTIrA2IfxDDPpI 

Jeśli zdarzy ci się być budowanie aplikacji na Androida, można łatwo wygenerować te znaki za pomocą interfejsu 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); 

Jeśli chcesz zobaczyć wszystko ułożyła, prosimy o kasie projekty te dotyczące pełnego źródła:

+0

jesteś pewien? Afaik Gae obsługuje tylko Oauth 1.0a – systempuntoout

+0

Zostałem przetestowany, ale kod nie działa - Exception: - Użyłem Pythona 2.5. – Chameleon

+0

Rozglądałem się wokół Google i StackOverflow. Jest to jedyna odpowiedź z dobrze działającym kodem, który znalazłem. (patrz kompletny przykład podanych adresów URL). Też pracowałem dla Javy, dlatego tytuł pytania może wprowadzać użytkowników java w błąd. – Guy

0

nie mogę wypowiedzieć się na temat powyższej odpowiedzi więc dodałem go tutaj dla każdego, kto zmaga się z tym fragmencie:

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

ten został złamany na AppEngine przez miesiąc, jeśli korzystasz z kont serwisowych (i od dzisiaj, myślę także tokenów użytkownika Google), ponieważ długość tokena powoduje problemy w bibliotece AE. Google powiedział mi, że jest mało prawdopodobne, aby to naprawić wkrótce.

Jest to jedyna rzecz, która pracuje dla mnie w tej chwili:

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

Co to oznacza? Jaka jest logika? – Praxiteles

+0

Używa apletu Google google do "odkodowania" tokena okaziciela, wyodrębniając adres e-mail z odpowiedzi. – KevH

Powiązane problemy