2010-07-13 4 views
5

Я смущаюсь.Получение адреса gmail с ... openid? OAuth?

Я смог сделать openid login своего рода работой, используя LightOpenID.

Все, что я делаю, это всего лишь openid_identity, например, «https://www.google.com/accounts/o8/id?id=xxx». Довольно неутешительно: я ожидал получить адрес электронной почты тоже.

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

Существует функция $openid->getAttributes(), но все это я получаю от этого просто пустой массив: Я предполагаю, что Google не собирается дать мне что-нибудь еще, чем это openid_identity.

So I guess Я должен использовать OAuth, правильно? Я об этом не знаю. я только нашел ужасный и запутанную документацию, что либо делает вид, чтобы объяснить все (и я сделать значит все), или он не объясняет ничего на всех.

Да, конечно, я попытался просмотреть предыдущие сообщения об этом, точно так же, как и в Google. Прочтите еще раз выше, пожалуйста.

+0

, пожалуйста, посмотрите мой вопрос (может быть, вам полезен) здесь: http://stackoverflow.com/questions/2667447/how-to-use-the-correct-google-openid-url-to-login -to-my-site Так что, насколько я знаю, именно так, как это делается для OpenID в gmail, вы не можете явно выразить свой адрес gmail как часть своего OpenID –

+0

. Если это так, мы возвращаемся ко второй части вопроса: 'OAuthWTF'? –

ответ

10

Я только что обнаружил LightOpenID, и я думаю, что это замечательно.Я сумел получить адрес электронной почты, на имя и фамилию и предпочитаемый язык, используя следующую модификацию 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>'; 
} 

?> 

Я изменил код, чтобы сделать его немного более удобным для чтения, вывод:

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 
) 

Я до сих пор не могу получить почтовый индекс и другие данные от Google, но у меня был успех с myOpenID.com.

+0

Спасибо, но мой вопрос: где список атрибутов 'required', которые я могу задать? Я могу найти список 'openix.ax.wtf', но я понятия не имею, как их использовать в LightOpenID ...:/ –

+0

О, вот оно -> http://www.axschema.org/types/... все еще есть способ спросить google, какой из этих полей будет экспортироваться? Или просто попробовать их всех, а некоторые будут работать, а некоторые не будут? –

+0

Does LightOpenID хранит запрос, который вы сделали в 'if (isset ($ _ GET ['login']))'? Похоже, он не выглядит, но он должен (по соображениям производительности). В случае с Google это безразлично, но может быть и не так, если пользовательский идентификатор (USI) является заявленным идентификатором (CI). Предположим, вы ввели myusername.myopenid.com. На этапе обнаружения для этого URL-адреса вы узнаете, что URL-адрес конечной точки, который отвечает авторитетно для этого идентификатора. Если вы не сохраните эту информацию, на втором этапе вам придется снова проверить, имеет ли конечная точка полномочия над CI. – Artefacto

1

Наличие учетной записи Google не означает, что вы получаете учетную запись gmail. You can start a Google account with any email address.

Сказав, что я не думаю, что его часть спецификации вернет адреса электронной почты или данные входа в систему как часть идентификатора.

+1

хорошо пункт. Я хотел бы получить * этот * адрес электронной почты, неважно, если это не gmail. –

1

OAuth и OpenID не совпадают. Они решают совершенно разные вещи. Я согласен с тем, что вы проверили: Federated Login for Google Account Users у него есть немного больше объяснений относительно того, как учетные записи работают для учетных записей Google.

Решения:

  1. This is in Python but you should be able to adjust it accordingly for PHP.
  2. This is in .Net - again you should be able to change the AX mode yourself.
5

Вы можете использовать обмен атрибут OpenId в. См. Документацию Google here (в частности, openid.ax.type.email).

+1

отлично! Хотя я не мог понять, как «сопоставить» эти атрибуты, такие как 'openid.ax.type.email', с другими (другими словами) LightOpenID (« contact/email »), зная, что это может быть сделано *, я глубже погрузился в LightOpenID и мне удалось это сделать :) спасибо –

Смежные вопросы