2012-12-17 6 views
0

나는 다음과 같은 상황이 : 나는 현재 메트로 스타일의 응용 프로그램을 작성하려고 해요, 지하철 응용 프로그램에서 Google 로그인을 제공하는 반복의 허가-보조금 (OAuth2를/구글 오픈 ID)를 피하는

의를 할 수있는 기능을 사용자는 자신의 Google 계정으로 로그인하고 앱은 Userinfo.profile 및 Userinfo.email과 같은 몇 가지 권한을 요청합니다.

저는 현재 OAuthv2를 사용하고 있으며, 세부 사항을 요청하는 것은 꽤 힘들었습니다 (상당한 노력과 연구 끝에).

URL이 사용 :

const string url = "https://accounts.google.com/o/oauth2/auth?" + 
        "client_id=" + clientId + 
        "&redirect_uri=" + "urn:ietf:wg:oauth:2.0:oob" + 
        "&response_type=code" + 
        "&scope=https://www.googleapis.com/auth/userinfo.profile+https://www.googleapis.com/auth/userinfo.email" + 
        "&access_type=offline"; 

나는 사용자가 인증 유지하려면 지금 문제는, 나는함으로써 클라이언트 측에서 토큰을 저장하여 그것을해야 할 것입니다 중 사용자를 검색하거나 Google을 사용하여 로그인 할 방법을 찾은 다음 세션을 유지하고 인증되었는지 확인하십시오.

문제는, 후자를 수행하는 방법을 모르며 그것을 사용하는 방법을 모릅니다. 지금은 애플리케이션을 열 때마다 사용자가 Google 인증 페이지로 리디렉션됩니다. Google 인증 페이지에서는 모든 재시작 시마다 전체 절차가 반복적으로 시작됩니다.

내가 원하는 것은 사용자가 로그인하면 특정 방법으로 권한을 다시 요청하여 관리자를 식별 할 수 있고 항상 부담을 줄 수 있다는 것입니다.

나는 OpenID에 보였다,하지만 난 항상이 URL에 대한 응답으로

<?xml version="1.0" encoding="UTF-8"?> 
<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)"> 
<XRD> 
<Service priority="0"> 
<Type>http://specs.openid.net/auth/2.0/server</Type> 
<Type>http://openid.net/srv/ax/1.0</Type> 
<Type>http://specs.openid.net/extensions/ui/1.0/mode/popup</Type> 
<Type>http://specs.openid.net/extensions/ui/1.0/icon</Type> 
<Type>http://specs.openid.net/extensions/pape/1.0</Type> 
<URI>https://www.google.com/accounts/o8/ud</URI> 
</Service> 
</XRD> 
</xrds:XRDS> 

를 얻을 :

https://www.google.com/accounts/o8/id?openid.mode=checkid_setup&openid.ns=http://specs.openid.net/auth/2.0&openid.return_to=urn:ietf:wg:oauth:2.0:oob&openid.ns.ui=http://specs.openid.net/extensions/ui/1.0&openid.ns.ax=http://openid.net/srv/ax/1.0&openid.ax.mode=fetch_request&openid.ax.required=email,firstname,language,lastname,country&openid.ns.ext=http://specs.openid.net/extensions/oauth/1.0&openid.ext2.consumer=https://www.google.com/accounts/o8/ud?openid.mode=checkid_setup&openid.ns=http://specs.openid.net/auth/2.0&openid.return_to=urn:ietf:wg:oauth:2.0:oob&openid.ext2.scope=https://www.googleapis.com/auth/userinfo.profile+https://www.googleapis.com/auth/userinfo.email 

내가 잘못을 구축하고 있는가?

만약 어떤 제안에 중 하나를 수행하는 방법이 '제대로', 제가 구글 이메일을 사용에서 사용자 로그를 허용 (구글과의 통합을 달성하기 위해 노력하고 하고 있습니다 만 그는 hasn 경우 ' 애플리케이션을 승인하고, 그렇게하도록 요청하고, 두 번째 로그인하는 사람을 찾는 방법) 또는 내가 할 수있는 방법에 대해 언제든지 알려 주시기 바랍니다.

또한, .Net 4.5 프레임 워크의 스트립 다운 버전을 사용하여 전체 4.5에 의존하기 때문에 OpenID 라이브러리를 사용할 수없는 것으로 보입니다. 단지

To support SSO, the online provider must allow you to register a redirect URI in the form ms-app://appSID, where appSID is the SID for your app. 

이 그것을 의미합니까 수 없습니다 :

MSDN이 보면 * 편집 *는 최대 온다? Google에서 http(s):// 인 도메인에 대해서만 키를 요청할 수 있기 때문에?

답변

1

본 적이 있습니까? https://developers.google.com/accounts/docs/OAuth2Login

웹 서버 흐름을 사용 중이며 오프라인 액세스를 요청한 것으로 보입니다. 이렇게하면 코드를 바꾼 후 새로 고침 토큰을 제공해야합니다. 애플리케이션에서이 토큰을 고정시킵니다.로그인에 대한 승인을받은 경우 토큰을 다시받을 수 있으며이를 사용하여 Google에서 사용자의 사용자 ID를 가져올 수 있습니다.

특정 애플리케이션에 대해 유효한 새로 고침 토큰을 갖고 있다면 애플리케이션에서 계속 추적해야합니다. 사용자. 그런 다음 해당 토큰을 사용하여 현재 자격 증명을 가져옵니다. tokeninfo enpoint를 사용하여 토큰의 유효성을 검사 할 수 있습니다. 사용자에 대해 유효한 토큰을 가지고 있으면 다른 새로 고침 토큰을 얻기 위해 코드 흐름을 통해 해당 토큰을 보낼 필요가 없습니다.

tokeninfo 엔드 포인트를 사용하는 경우, 액세스 토큰에 대한 요청에 https://www.googleapis.com/auth/userinfo.profile 범위가있는 경우에만 userid 필드가 나타납니다. 이 필드의 값은 로그인 한 사용자의 불변 식별자입니다. 이것을 저장하면 사용자의 영구 식별자가 있어야합니다.

+0

예 인증 토큰을 받고 액세스 토큰 등으로 교환합니다. 정상적으로 작동하지만 사용자가 응용 프로그램에서 로그 아웃하면 Google URL을 통해 사용자에게 적절한 식별자, 그래서 어떤 토큰을 사용해야할지 알아낼 수 있습니까? 사용자가 로그인하고 그의 userId를받는 페이지와 같은 것이므로 사용할 토큰을 알고 있습니까? [이 승인] (https://developers.google.com/accounts/docs/OAuth2InstalledApp) 모두 정상적으로 작동합니다. – Daneo

+1

설치된 애플리케이션의 경우 현재 Google에 사용자를 보내고 메시지가 표시되지 않는 방법이 있습니다. 이것은 js 클라이언트 응용 프로그램에서 가능하지만 보안상의 이유로 설치된 응용 프로그램에서는 허용되지 않습니다. 사용자가 앱에서 로그 아웃하는 것은 아주 드물 것입니다. 예를 들어 accts를 전환하고 싶을 수도 있습니다. 당신은 그것들을 영구히 로그인 상태로 남겨두고 그냥 accts를 추가하고 스위치 할 수 있습니다. –

+0

나는이 질문과 보안상의 이유로 응답을 업데이트 할 것입니다. clientSecret과 Id는 어디에 저장해야합니까? 왜냐하면 응용 프로그램을 해체하면 비밀을보고있을 수 있으므로이 경우 어떻게해야합니까? 아니면 그렇게 중요하지 않습니까? – Daneo