首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >直接提供者联邦身份的GAE Python示例

直接提供者联邦身份的GAE Python示例
EN

Stack Overflow用户
提问于 2014-03-01 08:53:47
回答 1查看 89关注 0票数 0

我正在与Django一起使用GAE Python。我在代码中尝试了以下几点:

相关Python代码:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
<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的以下替代:

代码语言:javascript
复制
<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> 

[基于https://developers.google.com/appengine/articles/openid?csw=1上提供的python示例]

单击Google链接时,将下载名为"id“的文件,该文件包含:

代码语言:javascript
复制
<?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>

单击Yahoo链接时,它将尝试打开以下链接:

代码语言:javascript
复制
http://localhost:8080/yahoo.com 

我确信我遗漏了一些显而易见的东西,但无法弄清楚这一点。我做错什么了

我有兴趣只为直接提供者联邦身份(如谷歌和雅虎)提供登录支持,在那里不需要传递用户名

根据Lipis的建议所作的修改:

代码语言:javascript
复制
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> 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-01 09:38:51

您拥有的providers字符串不是您可以简单地重定向用户到的URL,但是正如在官方例子中提到的,它们是应该在create_login_urlfederated_identity参数中使用的URI。

它将您指向http://localhost:8080/yahoo.com的原因是因为您缺少了<a href="yaho..."中的协议,所以您必须做的是可能链接到以下内容:

代码语言:javascript
复制
<a href="/federated?provider=yahoo.com">

在这里,您将处理&provider参数并将其传递给create_login_url(federated_identity=provider),然后从那里继续。

另外,与手动添加提供程序不同,您可以将所有提供程序提供给模板并按如下方式呈现:

代码语言:javascript
复制
{% for provider in providers %}
   <li><a href="/federated?provider={{providers[provider]}}">{{provider}}</a></li> 
{% endfor %}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22112244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档