Сохранение информации сразу после входа Google в Azure Mobile Services (серверная часть .NET)


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

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

Возможно ли это? Как мне это сделать?!

1 2

1 ответ:

В настоящее время это возможно только в среде выполнения .NET. Если вы используете среду выполнения узла, вы не сможете этого сделать.

Для среды выполнения .NET вам нужно создать класс, который наследует от GoogleLoginProvider (я назову свой CustomGoogleLoginProvider), а затем вам нужно будет переопределить метод CreateCredentials:

public override ProviderCredentials CreateCredentials(ClaimsIdentity claimsIdentity)
{
    // grab any information from claimsIdentity which you would like to store

    // If you need the access token for use with the graph APIs, you can use the following
    string providerAccessToken = claimsIdentity.GetClaimValueOrNull(ServiceClaimTypes.ProviderAccessToken);

    // use the access token with HttpClient to get graph information to store

    return base.CreateCredentials(claimsIdentity);
}

Затем в вашем WebApiConfig.cs, добавьте в метод Register() сразу после создания Объекта options Следующее:

options.LoginProviders.Remove(typeof(GoogleLoginProvider));
options.LoginProviders.Add(typeof(CustomGoogleLoginProvider));

В Метод CreateCredentials () вызывается непосредственно перед созданием маркера мобильных служб. На этом этапе маркер Google был проверен, и claimsIdentity был заполнен тем, что Google отправил обратно.

Некоторая информация будет доступна в claimsIdentity по умолчанию, но у вас также может быть информация, которая требует, чтобы вы позвонили в Google. Это можно сделать только в том случае, если вы настроили соответствующие области .

Если вы действительно хотите пойти обычай API route, вам просто нужно будет сделать вызов с вашего контроллера:

ServiceUser user = (ServiceUser)this.User;
GoogleCredentials creds = (await user.GetIdentitiesAsync()).OfType<GoogleCredentials>().FirstOrDefault();
string accessToken = creds.AccessToken;

Узловая версия getIdentities() задокументированаздесь .