2014-03-01 2 views
0

나는 장고와 함께 GAE 파이썬을 사용하고 있습니다. 나는 내 코드에 다음과 같은 시도 :직접 공급자 연합 ID를위한 GAE 파이썬 예제

관련 파이썬 코드 :

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 > 

, 장고에 의한 다음 치환을 볼 수 있습니다 :

<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 예제를 기반으로합니다.]

구글 링크를 클릭하면 파일은 "ID"를 포함하는 다운로드됩니다 이름

:

http://localhost:8080/yahoo.com 
: 야후 링크를 ​​클릭하면

<?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> 

, 그것은 다음과 같은 링크를 열려고 시도

나는 명백한 것을 놓치고 있지만 그 사실을 알 수는 없다고 확신합니다. 무엇 내가 뭐하는 거지 잘못된

난 단지 사용자 이름이

을 전달하기 위해 필요하지 않을 것입니다 (구글과 야후 등) 직접 제공자 연합 신원에 로그인 지원을 제공 할 관심

변경 리 피스의 제안에 따라 :

당신이
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입니다.

이 이유는 당신이 <a href="yaho..."에서 프로토콜을 없기 때문에 http://localhost:8080/yahoo.com 그래서 당신이해야 할 무엇 아마 이런 식으로 연결하는 것입니다에 당신을 가리키는 지 :

<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