2010-07-13 35 views
5

Tôi đang bối rối.Nhận địa chỉ gmail bằng ... openid? oauth?

Tôi có thể thực hiện công việc đăng nhập mở bằng cách sử dụng LightOpenID.

Tất cả những gì tôi làm chỉ là openid_identity chẳng hạn như "https://www.google.com/accounts/o8/id?id=xxx". Khá đáng thất vọng: Tôi cũng hy vọng sẽ nhận được địa chỉ email.

ví dụ tôi cần phải đăng nhập (đó là những gì openid không) để biết địa chỉ email của google tài khoản người dùng sử dụng để đăng nhập.

Có chức năng $openid->getAttributes() nhưng tất cả tôi nhận được từ đó chỉ là một mảng trống: Tôi đoán google sẽ không cung cấp cho tôi bất cứ điều gì khác hơn là openid_identity.

Vì vậy, tôi đoán Tôi phải sử dụng OAuth, phải không? Tôi không biết gì về điều đó. Tôi đã chỉ tìm thấy tài liệu khủng khiếp và bối rối, mà một trong hai giả vờ để giải thích tất cả mọi thứ (và tôi làm nghĩa mọi thứ), hoặc nó không giải thích bất cứ điều gì ở tất cả.

Có, tất nhiên tôi đã cố gắng xem các bài đăng trước đó về điều đó, giống như tôi đã tìm kiếm trên google. Đọc lại đoạn trên, làm ơn.

+0

vui lòng xem câu hỏi của tôi (có thể hữu ích cho bạn) tại đây: http://stackoverflow.com/questions/2667447/how-to-use-the-correct-google-openid-url-to-login -to-my-site Vì vậy, về cơ bản theo như tôi biết, đó là cách nó dành cho OpenID tại gmail, bạn không thể có địa chỉ gmail của bạn một cách rõ ràng như một phần của OpenID –

+0

cảm ơn. Nếu vậy, chúng ta quay lại phần thứ hai của câu hỏi: 'OAuthWTF'? –

Trả lời

10

Tôi vừa mới phát hiện LightOpenID và tôi nghĩ điều đó thật tuyệt vời.Tôi đã quản lý để có được địa chỉ email, tên đầu tiên và cuối cùng và ngôn ngữ ưa thích bằng cách sử dụng sửa đổi sau đây của example-gmail.php:

<?php 

require_once('openid.php'); 

if (empty($_GET['openid_mode'])) 
{ 
    if (isset($_GET['login'])) 
    { 
     $openid = new LightOpenID(); 
     $openid->identity = 'https://www.google.com/accounts/o8/id'; 
     $openid->required = array('namePerson/first', 'namePerson/last', 'contact/email', 'pref/language'); 

     header('Location: ' . $openid->authUrl()); 
     //header('Location: ' . str_replace('&amp;', '&', $openid->authUrl())); 
    } 

    else 
    { 
     echo '<form action="?login" method="post">' . "\n"; 
     echo '<button>Login with Google</button>' . "\n"; 
     echo '</form>' . "\n"; 
    } 
} 

else if ($_GET['openid_mode'] == 'cancel') 
{ 
    echo 'User has canceled authentication!'; 
} 

else 
{ 
    $openid = new LightOpenID(); 

    echo 'User ' . ($openid->validate() ? $_GET['openid_identity'] . ' has ' : 'has not ') . 'logged in.'; 

    echo '<pre>'; 
    print_r($openid->getAttributes()); 
    echo '</pre>'; 
} 

?> 

tôi đã thay đổi mã để làm cho nó một chút dễ đọc hơn, sản lượng:

User https://www.google.com/accounts/o8/id?id=*** has logged in. 

Array 
(
    [namePerson/first] => Alix 
    [contact/email] => ***@gmail.com 
    [pref/language] => en 
    [namePerson/last] => Axel 
) 

Tôi vẫn không thể nhận mã bưu điện và các mã khác từ Google nhưng tôi đã thành công với myOpenID.com.

+0

Cảm ơn, nhưng câu hỏi của tôi là: danh sách các thuộc tính 'yêu cầu' tôi có thể yêu cầu? Tôi chỉ có thể tìm thấy danh sách 'openix.ax.wtf', nhưng tôi không có ý tưởng về cách sử dụng chúng trong LightOpenID ...:/ –

+0

Ồ, đây là -> http://www.axschema.org/loại/... vẫn còn, có cách nào để hỏi google mà các lĩnh vực này sẽ xuất khẩu? Hoặc chỉ cần thử tất cả và một số sẽ làm việc trong khi một số sẽ không? –

+0

LightOpenID có lưu trữ yêu cầu bạn đã thực hiện trong 'if (isset ($ _ GET ['login']))'? Nó không xuất hiện, nhưng nó nên (vì lý do hiệu suất). Trong trường hợp của Google, nó không quan tâm, nhưng nó có thể không phải là nếu mã định danh do người dùng cung cấp (USI) là mã định danh được xác nhận quyền sở hữu (CI). Giả sử bạn nhập myusername.myopenid.com. Trong giai đoạn khám phá cho url đó, bạn phát hiện ra rằng url của điểm cuối phản hồi tác giả cho số nhận dạng đó. Nếu bạn không lưu thông tin đó, trong giai đoạn thứ hai, bạn sẽ phải kiểm tra lại nếu điểm cuối có thẩm quyền đối với CI. – Artefacto

1

Có tài khoản Google không có nghĩa là bạn có tài khoản gmail. You can start a Google account with any email address.

Có nói rằng tôi không nghĩ rằng một phần của đặc tả để trả lại địa chỉ email hoặc dữ liệu đăng nhập như một phần của danh tính.

+1

điểm tốt. Tôi muốn nhận địa chỉ email * đó *, không quan trọng nếu đó không phải là gmail. –

5

Bạn có thể sử dụng trao đổi thuộc tính OpenID của. Xem tài liệu của Google here (cụ thể là openid.ax.type.email).

+1

tuyệt vời! Mặc dù tôi không thể hiểu cách "ánh xạ" các thuộc tính đó như 'openid.ax.type.email' sang các thuộc tính khác của LightOpenID (' contact/email'), biết rằng nó * có thể * được thực hiện, tôi nhìn sâu hơn vào LightOpenID của tài liệu và tôi quản lý để làm điều đó :) cảm ơn –

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