GAE / Python - 从主类重定向工作,但不从被调用方法重定向

时间:2014-03-27 20:22:20

标签: python google-app-engine python-2.7 webapp2

当我从main.py进行重定向时,它可以工作,但是当我尝试从它调用的方法中重定向时,没有任何反应。没有错误,程序什么都不做。

main.py

from githubauth import GetAuthTokenHandler 

class AuthUser(webapp2.RequestHandler):
    """
    If no environment variable exists with the access token in it,
    auth the user as an admin. If it does exist, auth them as a regular
    user.
    """

    def get(self):

        if not ACCESS_TOKEN:
            # No access token exists, auth user as admin 
            get_auth_token = GetAuthTokenHandler() 
            get_auth_token.get()

githubauth.py

import webapp2

class GetAuthTokenHandler(webapp2.RequestHandler):
    """Redirect users to github to get an access request token."""

    def get(self):
        self.redirect('http://api.github.com/authorize')

3 个答案:

答案 0 :(得分:3)

这取决于您使用Github进行的授权类型,有两种方法可以做到这一点, OAuth令牌授权 Web应用程序流。< / p>

OAuth令牌授权

如果您正在进行OAuth授权,则不必创建请求处理程序来获取Github身份验证令牌,请求处理程序用于服务于您服务器上的特定网址,对于此类任务,您应该使用urlfetch()

所以整个流程应该类似于以下代码:

import webapp2
from google.appengine.api import urlfetch

def getAuthToken():
    github_auth_url = "http://api.github.com/authorizations"
    result = urlfetch.fetch(github_auth_url)
    return result

class AuthUser(webapp2.RequestHandler):
    def get(self):
        if not ACCESS_TOKEN:
            # No access token exists, auth user as admin 
            get_auth_token = getAuthToken() 
            # do something with your token...

重定向授权(Web应用程序流程)

如果您已应用客户端ID并且希望被用户授权为独立的Web应用程序,则会出现这种情况,此类授权的步骤比以前更复杂:

  1. 重定向用户以请求GitHub访问
  2. GitHub重定向回您的网站
  3. 如果您不了解此流程,请查看Github OAuth - Web Application Flow

    让我们看看我们如何在Google App Engine中做到

    重定向用户以请求Github访问

    这是您的示例中涉及的部分,只需将用户重定向到具有指定参数的授权网址

    from urllib import urlencode
    
    class AuthUser(webapp2.RequestHandler):
        def get(self):
            # ... do something ...
    
            # Github configuration
            github_client_id = "Your github client id..."
            github_redirect_url = "Your url for github redirecting users back to your GAE"
            github_scope = "Gtihub scopes...."
    
            github_authorize_url = "http://github.com/login/oauth/authorize"
            github_authorize_parameters = {
                    'client_id': github_client_id,
                    'redirect_url': github_redirect_url,
                    'scope': github_scop
                    }
    
            if not ACCESS_TOKEN:
                # if no access_token found on your site, redirect users to Github for authorization
                url_to_redirect = "%s?%s" % (github_authorize_url, urlencode(github_authorize_parameters))
                self.redirect(url_to_redirect)
    

    Github将用户重定向回您的网站

    Github会根据前面的参数redirect_url将用户重定向回您的网站,因此您必须准备另一个请求处理程序,以便从Github接收重定向。

    (你可以这样做是同一个请求处理程序,但它会弄乱你的代码)

    从步骤1返回的重定向将包含一个参数code,您将需要它来交换访问令牌。

    from urllib import urlencode
    
    class GithubRequestHandler(webapp2.RequestHandler):
        def get(self):
            # this handler need to be bind to redirect_url
            # get authentication code
            github_code = self.request.get('code')
    
            # prepare data to exchange access token
            github_token_url = "https://github.com/login/oauth/access_token"
            github_token_parameters = {
                    'client_id': 'Your Github client id',
                    'client_secret': 'Your Github client secret',
                    'code': github_code}
    
            # exchange access token
            data = urlfetch.fetch(github_token_url, payload=urlencode(github_token_parameter), method='POST')
            # data will perform in the following form:
            #     access_token=e72e16c7e42f292c6912e7710c838347ae178b4a&scope=user%2Cgist&token_type=bearer
            # extract access_token from the string
    
            # save the access_token to user's model
    

    P.S。

      

    代码有点模拟你的应用程序流,它需要一些调整才能在生产中运行:)

答案 1 :(得分:1)

RequestHandler需要使用请求和响应进行实例化,以使事情正常工作。 也就是说,实例化一个并从另一个处理程序方法中调用它的方法非常奇怪。

答案 2 :(得分:1)

您尝试创建webapp2请求处理程序,但不能以这种方式完成。 get_auth_token不是WSGI webapp2处理程序实例。 如果你不改变githubauth.py,你必须改变你的main.py。

class AuthUser(webapp2.RequestHandler):

def get(self):

    if not ACCESS_TOKEN:
        self.redirect(to your GetAuthTokenHandler)

如果您没有访问令牌,这将导致两次重定向。