2009-08-31 24 views
17

Khi tôi chơi bóng bàn với nhà cung cấp OpenID của Google, tôi không thể có được tên/biệt hiệu/tên người dùng thân thiện (bất cứ điều gì bạn muốn gọi).Tên thân thiện của Google sử dụng OpenID?

tôi nhận được một cái gì đó tồi tệ trông như sau:

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

thay vì một cái gì đó tốt đẹp như

JohnDoe 

Có gì giao thức để nhận tên của người dùng từ Google một cách thân thiện thoải mái như nói, myopenid có tác dụng gì?

** Tôi đang sử dụng DotNetOpenAuth *

Trả lời

13

Bạn không thể. Định danh mà các vấn đề OP là đúng với OP. RP không thực sự có bất kỳ tiếng nói nào trong đó. Bây giờ, một số OP hỗ trợ cung cấp các thuộc tính với thông tin đăng nhập, chẳng hạn như biệt hiệu, địa chỉ email, v.v. Google đã hỗ trợ rất hạn chế cho các địa chỉ này, chỉ cung cấp địa chỉ email.

Google đã chọn không phát hành số nhận dạng do người dùng nhận dạng vì đó là rủi ro tiết lộ thông tin. Yahoo đã đi cả hai tuyến đường bằng cách cung cấp cho người dùng cả số nhận dạng thân thiện với con người và không phải con người mà người dùng có thể lựa chọn. MyOpenID và các OP khác thường đi với chỉ một định danh thân thiện với người dùng mà người dùng chọn khi họ đăng ký tại OP.

Bạn có thể muốn trường hợp đặc biệt Google tại RP của bạn để chọn chuỗi thân thiện hơn để hiển thị cho người dùng khi họ đăng nhập hoặc vì Google không phải là người duy nhất thực hiện việc này, viết mã để tìm ra khi số nhận dạng không thể đọc được và hiển thị nội dung thân thiện hơn với người dùng để họ biết họ đã đăng nhập (có lẽ địa chỉ email hoặc biệt hiệu họ chọn trên trang web của bạn).

Thận trọng: nếu bạn chọn để hiển thị một định danh thân thiện hơn so với cái vấn đề của Google, bạn vẫn phải sử dụng chính thức tuyên bố chủ quyền định danh từ Google cho tên người dùng chính thức của người sử dụng mà bạn vượt qua để FormsAuthentication.RedirectFromLogin và tên người dùng tra cứu trong cơ sở dữ liệu của bạn. Bất cứ điều gì khác bạn đặt cùng nhau thường giới thiệu các rủi ro bảo mật.

+0

Cảm ơn bạn đã xóa thông tin này. Tôi đoán sử dụng số nhận dạng thân thiện mặc định vì email của người dùng có thể hoạt động. Bạn có muốn biết những dịch vụ nào khác không vui vẻ với những cái tên thân thiện không? – MunkiPhD

+0

Yahoo là người duy nhất tôi biết và đôi khi chỉ có hành vi này. –

+1

Andrew, tôi đã tìm hiểu sâu hơn về các bài đăng trên blog của bạn và tìm thấy bài đăng liên quan đến Yahoo. Tôi sẽ phải đọc nó một lần nữa để hiểu rõ nó - nhưng trong những thử thách không biết, tôi thậm chí không thể lấy lại địa chỉ email từ Yahoo, điều này làm tôi bối rối khi tôi sử dụng đăng nhập Yahoo cho stackoverflow - và thông tin của tôi được chuyển giao rõ ràng hơn .. – MunkiPhD

6

Tính đến năm 2012, có vẻ như Google OpenID endpoint hỗ trợ truy xuất tên và họ thông qua giao thức Trao đổi thuộc tính. Dưới đây là một số ví dụ về mã Python sử dụng khung công tác web Pyramid và gói python-openid của Janrain.

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) 
+0

Làm việc như một quả bom./namePerson/first và/namePerson/last – Spider

10

dựa trên câu trả lời của Roy, tôi đã cố thực hiện yêu cầu tương tự bằng cách sử dụng DotNetOpenAuth và hoạt động tốt. yêu cầu:

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); 

lưu ý: đảm bảo parm thứ hai của AttributeRequest constructor được thiết lập là true.

phần phản hồi thẳng về phía trước.

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; 
} 
+0

Tùy thuộc vào cách bạn đang sử dụng (tôi đang sử dụng OWIN), bạn có thể không có WellKnownAttributes trong tập hợp những thứ được cài đặt trong dự án của bạn và có thể bạn không muốn thêm DotNetOpenAuth chỉ vì điều này. Dưới đây là các chuỗi OpenId trong các thuộc tính WellKnownAttributes của chúng (và các nơi khác trong các thư viện OpenId khác): tên: "given_name", họ: "family_name", tên đệm: "middle_name", biệt hiệu: "biệt hiệu" –

Các vấn đề liên quan