Exemplo n.º 1
0
class OAuthProvider(Provider):

    name = ""
    always_callback = False
    config = {}

    def __init__(self, app):
        self.app = app
        self.remote = OAuthRemoteApp(self, self.name, **self.config)
        self.key = '%s_oauthtok' % self.name

    def register(self, doc):
        callback = None
        if request.args.get('next') or self.always_callback:
            callback = url_for('verify', hashkey=doc["_id"],
                               _external=True,
                               next=request.args.get('next') or "/v1/verified")

        resp = self.remote.authorize(callback=callback)

        if self.key in session:
            doc[self.key] = session.pop(self.key)

        return {"goto": resp.headers['Location']}

    def verify(self, doc):

        if self.key in doc:
            session[self.key] = doc.pop(self.key)

        if 'oauth_verifier' in request.args:
            try:
                data = self.remote.handle_oauth1_response()
            except OAuthException as e:
                if self.app.debug: raise
                return json_exception(e)
        elif 'code' in request.args:
            try:
                data = self.remote.handle_oauth2_response()
            except OAuthException as e:
                if self.app.debug: raise
                return json_exception(e)
        else:
            return json_error(400, "missing_code",
                    "You need to provide either oauth_verifier or code")

        print data

        def getter():
            return data

        self.remote.tokengetter(getter)

        try:
            if not self.confirm(doc, data):
                return json_error(400, "wrong_user",
                        "The user doesn't match. Sorry")
        except Exception, e:
            if self.app.debug: raise
            return json_exception(e, 500)

        doc["status"] = "confirmed"