我正在使用GAE Python和Django。我想在我的代碼如下:GAE針對直接提供者聯合身份驗證的Python示例
相關Python代碼:
providers = {
'Google' : 'https://www.google.com/accounts/o8/ud',
'Yahoo' : 'yahoo.com',
}
class BaseRequestHandler(webapp2.RequestHandler):
def generate(self, template_name, template_values={}):
directory = os.path.dirname(__file__)
path = os.path.join(directory, 'templates', template_name)
self.response.out.write(template.render(path, template_values, debug=_DEBUG))
class MainHandler(BaseRequestHandler):
def get(self):
user = users.get_current_user()
log_in_out_url = users.create_login_url(federated_identity="https://www.google.com/accounts/o8/id")
if user:
log_in_out_url = users.create_logout_url(self.request.uri)
template_values = {
'user': user,
'log_in_out_url': log_in_out_url,
"openid_url_google": providers["Google"],
"openid_url_yahoo": providers["Yahoo"],
}
self.generate('homepage.html', template_values);
相關的HTML代碼:
<div id="login_username" >
{% if user %}
<span class="loginout"> <a href="{{log_in_out_url}}"> Log Out </a> </span>
{% else %}
<span class="loginout"> <a href="{{log_in_out_url}}"> Log In </a> </span>
{% endif %}
<ul class="dropdown" id="openid_login_providers" >
<li> <a href="{{ openid_url_google }}" > Google </a> </li>
<li> <a href="{{ openid_url_yahoo }}" > Yahoo </a> </li>
</ul>
</div >
上使用Chrome 「檢查元素」(當我的開發服務器上運行)我看到下面的Django替換:
<div id="login_username">
<span class="loginout"> <a href="/_ah/login?continue=http%3A//localhost%3A8080/"> Log In </a> </span>
<ul class="dropdown" id="openid_login_providers">
<li> <a href="https://www.google.com/accounts/o8/id"> Google </a> </li>
<li> <a href="yahoo.com"> Yahoo </a> </li>
</ul>
</div>
[基於上提供的python示例https://developers.google.com/appengine/articles/openid?csw=1]
當點擊谷歌的鏈接,文件名爲「ID」會下載其中包含:
<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)">
<XRD>
<Service priority="0">
<Type>http://specs.openid.net/auth/2.0/server</Type>
<Type>http://openid.net/srv/ax/1.0</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/mode/popup</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/icon</Type>
<Type>http://specs.openid.net/extensions/pape/1.0</Type>
<URI>https://www.google.com/accounts/o8/ud</URI>
</Service>
</XRD>
</xrds:XRDS>
當點擊雅虎的鏈接,它會試圖打開以下鏈接:
http://localhost:8080/yahoo.com
我確定我錯過了一些明顯的東西,但無法弄清楚。我在做什麼錯
我有興趣提供登錄只支持到直接提供者聯合身份(如谷歌和雅虎),其中將不需要用戶名傳遞
更改爲每立卑建議:
class Federated(BaseRequestHandler):
def get(self):
provider_uri = self.request.get('provider')
log_in_out_url = ""
user = users.get_current_user()
if user:
log_in_out_url = users.create_logout_url(federated_identity=provider_uri)
else:
log_in_out_url = users.create_login_url(federated_identity=provider_uri)
self.redirect(log_in_out_url)
return
<ul class="dropdown" id="openid_login_providers" >
<li> <a href="/federated?provider={{ openid_url_google }}" > Google </a> </li>
<li> <a href="/federated?provider={{ openid_url_yahoo }}" > Yahoo </a> </li>
</ul>
多謝拉立卑..我中有你的建議的修改結束我的問題上面..你可以請看看,並確認如果這是你建議..或任何更正或改善.. – gsinha
也,在上面的解決方案建議您,我如何確保用戶返回到登錄後在同一頁面(他點擊聯合登錄鏈接)..而不是我的主頁(/).. – gsinha
是的,這是一個我認爲真的很好。我也更新了答案以反映這些變化 – Lipis