0

ASP.NET 웹 API 2로 RESTfull 백엔드를 구축 중입니다. FTM 저는 클라이언트가 있습니다. : AngularJs 웹 응용 프로그램, Android 및 IPhone 응용 프로그램입니다.크로스 플랫폼 다중 클라이언트 oauth2 API 디자인

Google 및 Facebook을 통한 로그인을 모두 작성해야하며 설계시 도움이 필요합니다. 내 생각은 다음 (예제로 사용하여 Google 인증)입니다

:

내가 4 "의 OAuth 2.0 클라이언트 ID를"만들 구글 개발자 콘솔에
  1. : AngularJS와 응용 프로그램에 대한

    • 을 (웹 응용 프로그램 유형, 원점 허용)
    • 안드로이드 (안드로이드 형식)
    • (IO 유형)(어떤 허용 기원없이 형 웹 응용 프로그램) 웹 API 백엔드에 대한3210
  2. 모든 클라이언트 권한을 부여 및 위해도 하지만를 필요한 범위에 요청 사용자의 동의 자체 라이브러리/API와 구글 연락을 드릴 것입니다 오프라인 사용. 따라서 authorization_code는 고객 (Google)에서 수신합니다.

  3. 모든 클라이언트은 웹 백엔드 GET 메소드 인 ExternalLogin을 호출하고 authorization_code를 입력 매개 변수로 보냅니다.

  4. 웹 백엔드는 (Google API를 통해) access_token에 대한 authorization_code를 교환하고 Google API를 통해 필요한 모든 사용자 정보를 Google로부터받습니다. 사용자가 이미 등록한 경우 데이터베이스를 확인하고 (그렇지 않으면 - 응용 프로그램에서 계정을 생성합니다) 로컬 액세스 토큰을 발행하여 이후의 모든 웹 백엔드 호출에 사용해야합니다.

혜택

은 매우 간단하다 :

  • 간단한 흐름, 모든 클라이언트
  • 모든 클라이언트
  • 논리에 등록/로그인 할 수있는 하나의 방법에 대해 동일 수집 사용자 데이터는 한 곳 (웹 백엔드)에 있으므로 사용자가 수집 할 추가 데이터가 필요한 경우 백엔드에서만 변경해야합니다. 클라이언트은 동의 화면에만 범위를 추가해야합니다.

내 질문은 :

  • 다음과 같은 흐름이 충분히 정확하고 안정적이다? 페이스 북의 인증에도 사용할 수 있습니까?
  • FTM 4 단계에서 멈추었습니다. AngularJs는 ClientId에 authorization_code를 받았습니다.웹 백엔드가 access_token 에 대한이 authorization_code를 다른 ClientId (웹 백엔드는 Google 개발자 콘솔에 자체 ClientId가 있습니다. 위의 내용 참조)과 교환하려고합니다. unauthorized_client 오류가 발생합니다. 이상한, Google 개발자 콘솔에서 같은 '프로젝트'에있는 모든 ClientID가 발생합니다. 그것을 작동시키는 방법이 있습니까?
+0

참고 : AngualrJS 앱의 클라이언트 ID를 사용하여 인증 한 사용자는 Android를 통해 액세스 할 수 없습니다. 클라이언트 id, secret, 새로 고침 토큰은 섞이지 않는 그룹입니다. – DaImTo

+0

@DaImTo 귀하의 의견에 감사드립니다. Android/AngularJS/IOS ClientId를 통해 인증하려면 User가 필요하고 authorization_code를 백엔드로 전달하고 Web-Backend ClientId가있는 사용자 데이터에 액세스하여 authorization_code를 전달해야합니다. 네가 생각하지 않을거야? – z0omie

+0

웹 자격 증명으로 만든 새로 고침 토큰은 모바일 응용 프로그램의 자격 증명을 사용하여 새로 고칠 수 없습니다. Android/AngularJS/IOS를 사용하여 사용자에게 액세스를 요청하는 경우 Android/AngularJS/IOS 자격증 명을 사용하여 액세스해야합니다. 동일한 프로젝트에서 만들어 졌기 때문에 혼합 할 수 없습니다. – DaImTo

답변

0

흐름은 꽤 많이 좋아, 한 가지 예외입니다 : 당신이 너무, 설치 클라이언트 ID (따라서 Authorized JavaScript origins) 실제 클라이언트 응용 프로그램에 대한 에만에 필요 아니라 백엔드.

Facebook은 백엔드 측면에서 거의 동일합니다 (유효성 검사를위한 다른 라이브러리). 일반 공급자 인터페이스를 추상화하는 데 문제가 없어야합니다. 다음 https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}

이가 볼 수있는 방법은 다음과 같습니다 :

,이 토큰을 확인 검증 알고리즘에 대해 themworry 수 있도록 구글의 엔드 포인트에 GET을 않음 - server side의 ID 토큰의 무결성을 검증하기위한로서

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 Auth를 사용하기 위해 firebase 데이터베이스가 필요하지 않습니다.

관련 문제