Дружественное имя от Google, используя OpenID? - PullRequest
17 голосов
/ 31 августа 2009

Когда я играю в пинг-понг с провайдером Google OpenID, я не могу получить понятное имя / псевдоним / имя пользователя (как бы вы это ни называли).

Я получаю нечто ужасное, похожее на следующее:

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

вместо чего-то хорошего, как

JohnDoe

Каков протокол для получения имени пользователя от Google в приятной дружественной манере, как, скажем, myopenid?

** Я использую DotNetOpenAuth *

Ответы [ 3 ]

13 голосов
/ 31 августа 2009

Вы не можете. Идентификатор, который выдает OP, строго зависит от OP. RP на самом деле не имеет никакого значения. Теперь некоторые операторы поддержки предлагают атрибуты с логином, такие как псевдоним, адрес электронной почты и т. Д. Google имеет очень ограниченную поддержку для них, предлагая только адрес электронной почты.

Google решил не выпускать распознаваемые пользователем идентификаторы, поскольку это риск раскрытия информации. Yahoo пошла по обоим путям, предлагая пользователям как удобные для пользователя, так и не являющиеся людьми идентификаторы, из которых пользователь может выбирать. MyOpenID и другие OP обычно имеют простой в использовании идентификатор, который пользователь выбирает при регистрации в OP.

Возможно, вы захотите, чтобы Google на вашем RP выбрал более дружественную строку для отображения пользователю, когда он вошел в систему, или, поскольку Google не единственный, кто делает это, напишите код, чтобы выяснить, когда идентификатор не читается и отображает что-то более дружественное для пользователя, чтобы они знали, что они вошли в систему (возможно, их адрес электронной почты или псевдоним, который они выбирают на вашем сайте).

Внимание : если вы решите отобразить более дружественный идентификатор, чем тот, который выдает Google, вам все равно нужно использовать официальный Заявленный идентификатор от Google для официального имени пользователя, который вы переходите на FormsAuthentication.RedirectFromLogin и для поиска имени пользователя в вашей базе данных. Все, что вы собираете вместе, обычно представляет угрозу безопасности.

10 голосов
/ 27 апреля 2012

на основе ответа Роя, я попытался сделать тот же запрос, используя 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 имеет значение true.

ответная часть прямолинейна.

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;
}
6 голосов
/ 02 февраля 2012

По состоянию на 2012 год, похоже, что конечная точка Google OpenID поддерживает поиск имени и фамилии по протоколу обмена атрибутами. Вот пример кода Python с использованием веб-фреймворка Pyramid и пакета 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)
...