0

Я создаю RESTfull-сервер с ASP.NET Web API 2. FTM У меня есть три клиентов: приложение AngularJs, приложение Android и IPhone.API-интерфейс Crossplatform multiclient oauth2

Мне нужно создать логин через Google и Facebook для всех, и вам нужна ваша помощь в его разработке.

Моя идея заключается в следующем (с помощью Google аутентификации в качестве примера):

  1. в консоли Google Developer создать "клиента OAuth 2.0 идентификаторы":

    • для AngularJS приложения (тип веб-приложения с разрешенным происхождением)
    • для Android (тип Android)
    • для IO (тип IO)
    • для WEB API бэкэнда (веб-приложения типа без какого-либо разрешенных происхождения)
  2. каждого клиент свяжется Google со своими библиотеками/APIs для авторизации и согласия запроса пользователя на прицелах, необходимых , но и для оффлайн использование. Так что authorization_code принимается клиентом от Google.

  3. каждый клиент будет ссылаться на веб-сервер GET метод ExternalLogin и отправлять authorization_code в качестве входного параметра.

  4. веб-сервер будет обмениваться (через API Google) повторно авторизационным_кодом на access_token и получать всю необходимую информацию о пользователе от Google (через API Google). Проверьте базу данных, если пользователь уже зарегистрирован (если нет - приложение создаст учетную запись), а затем введите токен локального доступа, который должен использоваться для всех дальнейших вызовов веб-сервера.

Преимущества довольно проста:

  • простой поток, то же самое для каждого клиента
  • один метод для входа/регистрация для каждого клиента
  • логика в собирать данные пользователя в одном месте (веб-сервер) - так что, если нам нужны дополнительные данные для сбора от Пользователя, нам нужно внести изменения только в бэкэнд. Клиентам необходимо добавлять поля только для разрешения экрана.

Мои вопросы:

  • является следующий поток правильно и достаточно стабильна? Будет ли он работать и для Facebook?
  • FTM Я застрял на шаге 4. AngularJs получил authorization_code с его ClientId.Веб-сервер пытается обменять этот authorization_code для access_token с другим ClientId (у веб-бэкэнда есть свой ClientId в консоли разработчика Google, прочитанный выше). Я получаю сообщение об ошибке: unauthorized_client. Странно, вызывать все идентификаторы ClientID в одном и том же «Project» в консоли разработчика Google. Есть ли способ заставить его работать?
+0

Примечание: пользователь, имеющий авторизацию с идентификатором клиента из вашего приложения AngualrJS, не получит доступ через Android. Идентификатор клиента, секретный токен обновления - это группа, которую они не смешивают. – DaImTo

+0

@DaImTo благодарит за ваш комментарий. Мне нужно, чтобы пользователь авторизовался через Android/AngularJS/IOS ClientId, а затем передал authorization_code на бэкэнд и получил доступ к данным пользователей с помощью Web-Backend ClientId и передал authorization_code. Это не сработает, вы думаете? – z0omie

+0

Обновление токена, созданного с помощью веб-учетных данных, не будет обновляться с использованием учетных данных для мобильного приложения. Если вы запрашиваете доступ к пользователю с помощью Android/AngularJS/IOS, вам нужно будет использовать учетные данные Android/AngularJS/IOS, чтобы получить доступ. Вы не можете их смешивать только потому, что они были созданы в рамках того же проекта. – DaImTo

ответ

0

Поток довольно много хорошо, но с одним исключением: вам нужно идентификаторов клиента установки только для реальных клиентских приложений (отсюда Authorized JavaScript origins), а не для внутреннего интерфейса тоже.

Facebook, по крайней мере, на стороне бэкэнда (только для другой библиотеки для проверки), у вас не должно быть проблем с абстрагированием от общего интерфейса провайдера.

Что касается проверки целостности ID маркеров на server side - сделать GET на конечной точке Google, чтобы проверить этот знак, пусть themworry об алгоритме проверки: https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}

Вот как это может выглядеть:

private const string GoogleApiTokenInfoUrl = "https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}"; 

public ProviderUserDetails GetUserDetails(string providerToken) 
{ 
    var httpClient = new MonitoredHttpClient(); 
    var requestUri = new Uri(string.Format(GoogleApiTokenInfoUrl, providerToken)); 

    HttpResponseMessage httpResponseMessage; 
    try 
    { 
     httpResponseMessage = httpClient.GetAsync(requestUri).Result; 
    } 
    catch (Exception ex) 
    { 
     return null; 
    } 

    if (httpResponseMessage.StatusCode != HttpStatusCode.OK) 
    { 
     return null; 
    } 

    var response = httpResponseMessage.Content.ReadAsStringAsync().Result; 
    var googleApiTokenInfo = JsonConvert.DeserializeObject<GoogleApiTokenInfo>(response); 

    if (!SupportedClientsIds.Contains(googleApiTokenInfo.aud)) 
    { 
     Log.WarnFormat("Google API Token Info aud field ({0}) not containing the required client id", googleApiTokenInfo.aud); 
     return null; 
    } 

    return new ProviderUserDetails 
    { 
     Email = googleApiTokenInfo.email, 
     FirstName = googleApiTokenInfo.given_name, 
     LastName = googleApiTokenInfo.family_name, 
     Locale = googleApiTokenInfo.locale, 
     Name = googleApiTokenInfo.name, 
     ProviderUserId = googleApiTokenInfo.sub 
    }; 
} 
0

Вы должны зарегистрироваться Firebase Auth (переименован в Google Identity Toolkit). Это упростит вам работу, и все, что вам нужно сделать, это принять один токен на вашем сервере.

Обратите внимание, что вам не нужна база данных firebase для использования Firebase Auth.

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