Дружественное имя от Google с помощью OpenID?

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

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

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

вместо чего-то приятного, как

JohnDoe

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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

на основе ответа Роя, я попытался сделать тот же запрос с помощью 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);

Примечание: убедитесь, что для второго parm конструктора 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;
}

Ответ 3

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