代码之家  ›  专栏  ›  技术社区  ›  MunkiPhD

使用OpenID的谷歌友好名称?

  •  17
  • MunkiPhD  · 技术社区  · 16 年前

    我得到了一些可怕的东西,如下所示:

    www.google.com/accounts/o8/id?id=AItOawmtAnQvSXGhRTkAHZWyxi4L4EKa7xoTT1dk  
    

    JohnDoe
    

    以友好的方式从Google获取用户名的协议是什么,比如说myopenid?

    3 回复  |  直到 16 年前
        1
  •  13
  •   Andrew Arnott    16 年前

    你不能。OP发布的标识符严格取决于OP。RP实际上没有任何发言权。现在,一些OPs支持在登录时提供属性,如昵称、电子邮件地址等。谷歌对这些属性的支持非常有限,只提供电子邮件地址。

    谷歌选择不发布用户可识别标识符,因为这是一种信息泄露风险。雅虎通过向用户提供人性友好和非人性友好的标识符,用户可以在两者之间进行选择。MyOpenID和其他OP通常只使用用户在OP注册时选择的用户友好标识符。

    必须仍然使用官方声明的标识符 从Google获取您传递给的用户的正式用户名 FormsAuthentication.RedirectFromLogin

        2
  •  10
  •   Charles Menguy jdw6415    14 年前

    基于Roy的回答,我尝试使用 DotNetOpenAuth 而且效果很好。

    var req = openid.CreateRequest("https://www.google.com/accounts/o8/id");
    var fetch = new FetchRequest();
    fetch.Attributes.Add(new AttributeRequest(WellKnownAttributes.Contact.Email,true));
    fetch.Attributes.Add(new AttributeRequest(WellKnownAttributes.Name.First,true));
    fetch.Attributes.Add(new AttributeRequest(WellKnownAttributes.Name.Last,true));
    
    req.AddExtension(fetch);
    

    注意:确保第二个参数 AttributeRequest

    响应部分是直截了当的。

    var openid = new OpenIdRelyingParty();
    var response = openid.GetResponse();
    var fetch = response.GetExtension<FetchResponse>();
    if (fetch != null) {
    IList<string> emailAddresses =fetch.Attributes[WellKnownAttributes.Contact.Email].Values;
    IList<string> firstNames = fetch.Attributes[WellKnownAttributes.Name.First].Values;
    IList<string> lastName = fetch.Attributes[WellKnownAttributes.Name.Last].Values;
    }
    
        3
  •  6
  •   Roy Hyunjin Han    14 年前

    Google OpenID endpoint Pyramid web框架和Janrain的 python-openid

    from openid.consumer import consumer
    from openid.extensions.ax import AttrInfo, FetchRequest, FetchResponse
    from openid.store.filestore import FileOpenIDStore
    from openid.store.sqlstore import PostgreSQLStore, MySQLStore, SQLiteStore
    
    AX_FIRSTNAME = 'http://axschema.org/namePerson/first'
    AX_LASTNAME = 'http://axschema.org/namePerson/last'
    AX_EMAIL = 'http://axschema.org/contact/email'
    
    @view_config(route_name='openID_start', permission=NO_PERMISSION_REQUIRED)
    def start(request):
        'Start openID authentication process'
        params = request.params
        openIDURL = params.get('openIDURL')
        if not openIDURL:
            return HTTPResponse('Parameter expected: openIDURL')
        openIDConsumer = get_consumer(request)
        try:
            openIDRequest = openIDConsumer.begin(openIDURL)
        except consumer.DiscoveryFailure, error:
            return HTTPResponse('Discovery failed: %s' % escape(error))
        else:
            if not openIDRequest:
                return HTTPResponse('Not an openID provider: %s' % escape(openIDURL))
    
            axRequest = FetchRequest()
            axRequest.add(AttrInfo(AX_FIRSTNAME, required=True))
            axRequest.add(AttrInfo(AX_LASTNAME, required=True))
            axRequest.add(AttrInfo(AX_EMAIL, required=True))
            openIDRequest.addExtension(axRequest)
    
            sourceURL = request.host_url
            targetURL = request.route_url('openID_finish')
            if openIDRequest.shouldSendRedirect():
                return HTTPFound(location=openIDRequest.redirectURL(sourceURL, targetURL))
            return HTTPResponse(openIDRequest.htmlMarkup(sourceURL, targetURL))
    
    @view_config(route_name='openID_finish', permission=NO_PERMISSION_REQUIRED)
    def finish(request):
        'Finish openID authentication process'
        openIDConsumer = get_consumer(request)
        targetURL = request.route_url('openID_finish')
        openIDResponse = openIDConsumer.complete(request.params, targetURL)
        html = openIDResponse.status + '<br>'
        for key, value in openIDResponse.__dict__.iteritems():
            html += '%s: %s<br>' % (escape(key), escape(value))
        html += '<br>'
        if consumer.SUCCESS == openIDResponse.status:
            axResponse = FetchResponse.fromSuccessResponse(openIDResponse)
            html += 'First name: %s<br>' % escape(axResponse.get(AX_FIRSTNAME))
            html += 'Last name: %s<br>' % escape(axResponse.get(AX_LASTNAME))
            html += 'Email: %s<br>' % escape(axResponse.get(AX_EMAIL))
        return HTTPResponse(html)
    
    def get_consumer(request):
        try:
            openIDStore = {
                'sqlite': SQLiteStore,
                'postgresql': PostgreSQLStore,
                'mysql': MySQLStore,
            }[db.bind.name](db.bind.raw_connection())
        except KeyError:
            openIDStore = FileOpenIDStore('data/openIDs')
        try:
            openIDStore.createTables()
        except:
            pass
        return consumer.Consumer(request.session, openIDStore)
    
    推荐文章