2014-03-01 24 views
0

我正在使用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> 

回答

2

providers串,你有沒有,你可以簡單地將用戶重定向到URL,但作爲official examples提到他們應該在create_login_urlfederated_identity參數一起使用的URI。

有原因,它指向你http://localhost:8080/yahoo.com是因爲你缺少的協議在<a href="yaho...",所以你必須做的是,也許鏈接到這樣的事情:

<a href="/federated?provider=yahoo.com"> 

在那裏你會處理&provider的論點,並將其傳遞給create_login_url(federated_identity=provider)並從那裏繼續。的


而且不用手動添加的供應商,你可以提供所有的供應商到您的模板,並使其像這樣:

{% for provider in providers %} 
    <li><a href="/federated?provider={{providers[provider]}}">{{provider}}</a></li> 
{% endfor %} 
+0

多謝拉立卑..我中有你的建議的修改結束我的問題上面..你可以請看看,並確認如果這是你建議..或任何更正或改善.. – gsinha

+0

也,在上面的解決方案建議您,我如何確保用戶返回到登錄後在同一頁面(他點擊聯合登錄鏈接)..而不是我的主頁(/).. – gsinha

+0

是的,這是一個我認爲真的很好。我也更新了答案以反映這些變化 – Lipis

相關問題