Доступ к информации о пользователе с помощью API Google для .NET

Я использую предварительную версию API Google (1.7.0) для авторизации пользователя через OAuth2. Я следил за пример кода MVC. Это моя реализация FlowMetadata:

private static readonly IAuthorizationCodeFlow flow = ...; // Implementation of tokens

public static async Task<Google.Apis.Auth.OAuth2.Web.AuthorizationCodeWebApp.AuthResult> GetCredentials(Controller controller, CancellationToken cancellationToken) {
    var result = await new AuthorizationCodeMvcApp(controller, new Models.Generic.AppFlowMetadata()).AuthorizeAsync(cancellationToken);
    if (result.Credential != null)
    {
         // Struggling here. How do I make a request to get the e-mail address?
    }
}

Теперь у меня есть действительный UserCredential и, следовательно, токен доступа, но я не могу найти управляемые API для доступа к информации о пользователе. Я нашел этот вопрос, но это предполагает, что я просто делаю необработанные запросы, а не использовать официальную библиотеку.

Как я могу получить адрес электронной почты пользователя?


person CodingIntrigue    schedule 23.01.2014    source источник
comment
Можете ли вы опубликовать код private static readonly IAuthorizationCodeFlow flow = ...; // Implementation of tokens. На самом деле я застрял на этом этапе и не получил никакого решения. Вот ссылка на мой вопрос   -  person Divya    schedule 19.07.2017
comment
прямо сейчас я получаю эту проблему. Мой вопрос   -  person Divya    schedule 19.07.2017


Ответы (4)


Вы должны сделать следующее:

  1. В дополнение к пакету NuGet Google.Apis.Auth необходимо установить следующую страницу: https://www.nuget.org/packages/Google.Apis.Oauth2.v2

  2. Добавьте Google.Apis.Oauth2.v2.Oauth2Service.Scope.UserinfoProfile, а также Google.Apis.Oauth2.v2.Oauth2Service.Scope.UserinfoEmail в список областей (при инициализировать AppFlowMetadata).

  3. Теперь добавьте следующий код:

if (result.Credential != null)
{
    var oauthSerivce = new Google.Apis.Oauth2.v2.Oauth2Service(
        new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "OAuth 2.0 Sample",
        });

    var userInfo = await oauthSerivce.Userinfo.Get().ExecuteAsync();
    // You can use userInfo.Email, Gender, FamilyName, ... 
}
person peleyal    schedule 27.01.2014
comment
Отличная работа. Единственная небольшая корректировка, которую я внес в ваш ответ, заключалась в добавлении области Google.Apis.Oauth2.v2.Oauth2Service.Scope.UserinfoEmail :) - person CodingIntrigue; 28.01.2014
comment
Как насчет удостоверения? - person Sebastián Rojas; 12.01.2017
comment
@SebastiánRojas result.Credential - person razon; 21.04.2017

Установите свои области на:

At: Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow.Scopes

И используйте этот адрес конечной точки: https://www.googleapis.com/oauth2/v1/userinfo?alt=json

Это должно помочь вам получить необходимую информацию.

person Yair Nevet    schedule 25.01.2014

Здесь я редактирую свой ответ. Пожалуйста, обратите внимание на это. На странице Default2.aspx я показываю значение Session["username"] и Session["useremail"] в метке. Надеюсь, это поможет вам.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using DotNetOpenAuth.OpenId;
using DotNetOpenAuth.OpenId.RelyingParty;
using DotNetOpenAuth.OpenId.Extensions.SimpleRegistration;
using DotNetOpenAuth.OpenId.Extensions.AttributeExchange;

public partial class _Default : System.Web.UI.Page 
{

   protected void Page_Load(object sender, EventArgs e)
   {

       openIdAuth();

   }

   protected void openIdAuth()
  {
       OpenIdAjaxRelyingParty rp = new OpenIdAjaxRelyingParty();
       var response = rp.GetResponse();

       if (response != null)
       {
         switch (response.Status)
         {
            case AuthenticationStatus.Authenticated:
                NotLoggedIn.Visible = false;
                Session["GoogleIdentifier"] = response.ClaimedIdentifier.ToString();

                var fetchResponse = response.GetExtension<FetchResponse>();
                Session["FetchResponse"] = fetchResponse;
                var response2 = Session["FetchResponse"] as FetchResponse;

                string UserName = response2.GetAttributeValue(WellKnownAttributes.Name.First) ?? "Guest"; // with the OpenID Claimed Identifier as their username.
                string UserEmail = response2.GetAttributeValue(WellKnownAttributes.Contact.Email) ?? "Guest";

                Session["username"] = UserName;
                Session["useremail"] = UserEmail;

                Response.Redirect("Default2.aspx");
                break;

            case AuthenticationStatus.Canceled:
                lblAlertMsg.Text = "Cancelled.";
                break;

            case AuthenticationStatus.Failed:
                lblAlertMsg.Text = "Login Failed.";
                break;
        }

    }
    var CommandArgument = "https://www.google.com/accounts/o8/id";
    string discoveryUri = CommandArgument.ToString();
    OpenIdRelyingParty openid = new OpenIdRelyingParty();

    var url = new UriBuilder(Request.Url) { Query = "" };
    var request = openid.CreateRequest(discoveryUri); // This is where you would add any OpenID extensions you wanted
    var fetchRequest = new FetchRequest(); // to fetch additional data fields from the OpenID Provider

    fetchRequest.Attributes.AddRequired(WellKnownAttributes.Contact.Email);
    fetchRequest.Attributes.AddRequired(WellKnownAttributes.Name.First);
    fetchRequest.Attributes.AddRequired(WellKnownAttributes.Name.Last);
    fetchRequest.Attributes.AddRequired(WellKnownAttributes.Contact.HomeAddress.Country);
    request.AddExtension(fetchRequest);

    request.RedirectToProvider();
   }
 }
person Anurag Jain    schedule 23.01.2014
comment
Похоже, он извлекает контакты пользователя? Мне нужен только адрес электронной почты авторизованного пользователя - person CodingIntrigue; 24.01.2014
comment
Пользователь авторизовался через OAuth - person CodingIntrigue; 24.01.2014
comment
вы использовали учетную запись администратора Google ?? - person Anurag Jain; 24.01.2014
comment
Чтобы уточнить. Я прошу конечного пользователя авторизовать мое приложение с помощью запроса OAuth2. Мне нужен адрес электронной почты этого пользователя. - person CodingIntrigue; 24.01.2014
comment
давайте продолжим это обсуждение в чате - person Anurag Jain; 24.01.2014
comment
@RGraham В этом решении пользователь будет аутентифицирован через OAuth, после чего я получу адрес электронной почты. Надеюсь, я Райт. - person Anurag Jain; 27.01.2014

Завершите код для получения данных UserProfile.

var secrect = new ClientSecrets()
{
    ClientId = "myClientId",
    ClientSecret = "mySecret"
};

var scopes = new[] { Oauth2Service.Scope.UserinfoEmail, auth2Service.Scope.UserinfoProfile };

UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(secrect, scopes, "user", CancellationToken.None).Result;
    
var oauthSerivce = new Oauth2Service(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = "MyApplicationName",
});

var userInfo = oauthSerivce.Userinfo.Get().Execute();
person Przemysław Michalski    schedule 30.12.2020