当我从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')
答案 0 :(得分:3)
这取决于您使用Github进行的授权类型,有两种方法可以做到这一点, OAuth令牌授权和 Web应用程序流。< / p>
如果您正在进行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...
如果您已应用客户端ID并且希望被用户授权为独立的Web应用程序,则会出现这种情况,此类授权的步骤比以前更复杂:
如果您不了解此流程,请查看Github OAuth - Web Application Flow
让我们看看我们如何在Google App Engine中做到
这是您的示例中涉及的部分,只需将用户重定向到具有指定参数的授权网址
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会根据前面的参数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
代码有点模拟你的应用程序流,它需要一些调整才能在生产中运行:)
答案 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)
如果您没有访问令牌,这将导致两次重定向。