앱 * 및 * 웹 사이트에 대해 OAuth2로 인증
주로 앱을 통해 액세스하는 웹 사이트를 개발 중이며 사용자 등록 및 인증에 OAuth2를 사용하고 싶습니다. Android 앱이기 때문에 Android에서 괜찮은 UI를 제공하기 때문에 Google의 OAuth2 항목을 사용하기 시작합니다.
Google은 "애플리케이션에 대한 사용자 인증을 아웃소싱하는 방법으로 Google의 인증 시스템을 사용하도록 선택할 수 있습니다. 이렇게하면 사용자 이름 및 비밀번호 저장소를 생성, 유지 및 보호 할 필요가 없습니다." 내가하고 싶은 것입니다. 그러나 모든 예제를 살펴보면 웹 사이트 또는 앱이 Google 서비스에 대해 사용자를 인증하는 것에 대한 내용 만 찾을 수 있습니다.
그리고 실제로 Google의 OAuth2에 내 앱 ( "클라이언트")을 등록 할 때 웹 사이트 클라이언트와 "설치된"클라이언트 (예 : 모바일 앱)에 대한 옵션이 있지만 둘다는 아닙니다. 두 개의 개별 클라이언트를 만들 수 있지만 OAuth2 초안을 읽고 문제가있을 것이라고 생각합니다. 이제 설명하겠습니다.
이것이 어떻게 작동 할 것이라고 생각했는지는 다음과 같습니다.
- 사용자는 MyApp에게 자신의 개인 데이터에 액세스하도록 요청합니다.
- 앱은 Android의
AccountManager
클래스를 사용 하여 Google API에 대한 액세스 토큰을 요청합니다. - Android가 사용자에게 " 'MyApp'앱이 Google의 기본 정보에 액세스하려고합니다. 괜찮습니까?"라고 말합니다.
- 사용자가 예라고 말합니다.
AccountManager
전화에 저장된 자격 증명을 사용하여 Google의 OAuth2 서버에 연결하고 액세스 토큰을 요청합니다.- 액세스 토큰 (녹색 선 다음에 표시됨)이 반환됩니다.
AccountManager
MyApp에 액세스 토큰을 반환합니다.- MyApp은 액세스 토큰을 포함한 사용자의 개인 데이터에 대한 요청을 MySite에 보냅니다.
- MySite는 액세스 토큰을 사용하여 사용자를 확인해야합니다. 여기 에 설명 된대로 Google- "Google,이 토큰이 유효합니까?"와 함께 토큰의 유효성을 검사합니다 .
- 이제 제가 원하는 것은 구글이 "네, 누구든 당신에게 그것을 준 사람은 실제로 그 사용자입니다."라고 말하는 것이지만, 실제로 일어날 것이라고 생각하는 것은 (OAuth2 초안과 구글의 문서를 기반으로) "아니오"라고 말할 것입니다. 이 토큰은 MyApp에서만 유효하며 귀하는 MySite입니다. GTFO! ".
그래서 어떻게해야합니까? 그리고 "OpenID 사용"또는 "OAuth2를 사용하지 마십시오"또는 기타 유사한 도움이되지 않는 답변을 말하지 마십시오. 오와 나는 것 정말 좋은 계속 사용하는 같은 AccountManager
UI를하기보다는이 엉터리 팝업 WebView
의
편집하다
Nikolay의 잠정적 대답 (작동하면 다시보고하겠습니다!)은 실제로 작동해야한다는 것이며 Google 서버는 액세스 토큰이 어디에서 왔는지 신경 쓰지 않습니다. 나에게는 약간 불안해 보이지만 작동하는지 볼 것입니다!
최신 정보
이 패턴을 Google 대신 Facebook으로 구현했으며 완전히 작동합니다. OAuth2 서버는 액세스 토큰의 출처를 신경 쓰지 않습니다. 적어도 페이스 북은 그렇지 않다. 그래서 나는 구글도 그렇지 않다고 생각한다.
그 점에서 액세스 토큰을 저장하는 것은 매우 나쁜 생각입니다! 그러나 모든 요청에 대한 인증을 확인하기 위해 Facebook / Google의 서버를 누르지 않아도됩니다. 모든 요청이 느려질 수 있기 때문입니다. 아마도 가장 좋은 방법은 액세스 토큰의 유효성을 검사 할 때 제공하는 추가 인증 쿠키를 사이트에 추가하는 것이지만 더 간단한 방법은 액세스 토큰을 암호처럼 취급하고 해시를 저장하는 것입니다. 액세스 토큰이 정말 길기 때문에 솔트 할 필요가 없습니다. 따라서 위의 단계는 다음과 같습니다.
9. MySite는 액세스 토큰을 사용하여 사용자를 확인해야합니다. 먼저 해시 된 유효한 액세스 토큰의 캐시를 확인합니다. 토큰의 해시가 발견되면 사용자가 인증 된 것입니다. 그렇지 않으면 여기 에 설명 된대로 Google에서 "Google,이 토큰이 유효합니까?" 와 함께 확인합니다 .
10. Google에서 액세스 토큰이 유효하지 않다고하면 사용자에게 GTFO를 알립니다. 그렇지 않으면 Google은 "예, 유효한 사용자입니다"라고 말한 다음 등록 된 사용자 데이터베이스를 확인합니다. 해당 Google 사용자 이름 (또는 Facebook을 사용하는 경우 Facebook ID)을 찾을 수없는 경우 새 사용자를 만들 수 있습니다. 그런 다음 액세스 토큰의 해시 된 값을 캐시합니다.
인증을 위해 OAuth 토큰을 사용하는 OpenID Connect가 필요할 수 있습니다. 의 AccountManager
경우 현재 OAuth 지원은 약간 엉뚱한 데, 곧 출시 될 예정인 새로운 Google Play 서비스 가이를 개선 할 수있을 것입니다. 데모는 여기를 참조하십시오 .
비슷한 StackOverflow 질문 에 대한 답변 을 방금 게시 했습니다 .
Google은이 하이브리드 앱을 호출 하고 'Android 앱이 웹 백엔드 용 오프라인 액세스를 얻는 방법 '을 설명합니다 .
요점은 인증 코드 (OAuth2 토큰이 아님)를 반환하기 위해 마사지 된 scope
문자열 을 전달해야한다는 것 GoogleAuthUtil.getToken
입니다. 이 도식 에 따라 해당 인증 코드는 모바일 앱에서 서버로 전달되고 OAuth2 토큰 및 새로 고침 토큰으로 교환 될 수 있습니다 .
scope
매개 변수는 다음과 같이 뭔가를 할 필요가 :
oauth2:server:client_id:<your_server_client_it>:api_scope:<scope_url_1> <scope_url_2> ...
모바일 애플리케이션에서 검색 한 액세스 토큰을 다른 곳에서 사용할 수 있습니다. Drive SDK에는 https://developers.google.com/drive/quickstart-android 의 흐름을 안내하는 멋지고 간단한 소개가 있습니다.
적어도 Google에서는 액세스 토큰이 결국 만료됩니다. 이것이 안드로이드 AccountManager
에 invalidateAuthToken
메소드 가있는 이유입니다. 캐시 된 액세스 토큰이 만료되었으므로에 이전 토큰 AccountManager
제공을 중지하고 대신 새 토큰을 가져 오도록 지시 해야합니다 . 토큰 자체가 해당 사용자로서 영구적 인 액세스를 제공하지 않기 때문에 토큰을 캐시하는 것이 다소 안전합니다. 대신 유효 할 때 "최근 과거의 어느 시점에서이 토큰은 신뢰할 수있는 출처에 의해 획득되었습니다."라고만 표시됩니다.
다음은 토큰으로 작업 할 때 도움이되는 몇 가지 사항입니다. 첫 번째는 Google의 tokeninfo 엔드 포인트입니다. 토큰 자체는 base64로 인코딩 된 JSON입니다. 즉, 암호화되지 않았으므로 통신에 HTTPS를 사용해야합니다. 그러나 이는 또한 토큰을 검사하고 무슨 일이 일어나고 있는지 더 잘 이해할 수 있음을 의미합니다.
https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=
토큰이 "abcdef"이면 다음으로 이동합니다.
https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=abcdef
Google이 토큰을 풀 것입니다. 토큰이 여전히 유효한 시간 (초)을 알려주는 "expires_in"필드를 포함하는 간단한 JSON 객체입니다. 아래 비디오에서 6:03에 압축 해제 된 토큰을 볼 수 있습니다.
https://developers.google.com/events/io/sessions/383266187
That video includes a thorough overview of OAuth2 and is well worth watching in its entirety if you're going to be dealing with OAuth and tokens. The speaker also discusses other forms of Oauth2 tokens, that are not access tokens, that do not expire.
Another useful resource is the OAuth Playground. This lets you do basic things like request scopes, make up requests, and get back tokens. This link seems to work sporadically, and on Chrome I had to install the Oauth Playground app:
https://developers.google.com/oauthplayground/
And here is a tutorial by Tim Bray, the speaker in the video, explaining how to use access tokens to communicate to a server from an Android app. This was useful to me because I began to understand how the different things in the Google API Console work together:
http://android-developers.blogspot.in/2013/01/verifying-back-end-calls-from-android.html
With regards to the actual answer to your question, I would say you never need to cache the access token on the server. As explained in the Verifying Back End Calls from Android link above, verifying a token is almost always a fast static call, meaning there's no reason to cache the tokens:
The libraries can cache the Google certs and only refresh them when required, so the verification is (almost always) a fast static call.
Finally, you can indeed use the AccountManager
to get access tokens. However, Google now instead encourages the use of the GoogleAuthUtil
class in the Play Services library instead:
In a nutshell what's the difference from using OAuth2 request getAuthToken and getToken
Here note the comment by Tim Bray, the same guy yet again from the above links, saying that they are putting their efforts into the GoogleAuthUtil
route. Note, however, that this means you would be limited to Google authentication. I believe that the AccountManager
could be used to get, for example, a Facebook token instead--not the case with GoogleAuthUtil
.
it describes exactly what you want: https://developers.google.com/identity/protocols/CrossClientAuth
When we had a need to do something similar on a non-google OAuth Server, we kept the tokens in a DB on the website. The app would then use web services to request the token when needed to request data.
사용자는 웹 또는 앱에서 OAuth 등록을 수행 할 수 있습니다. 동일한 애플리케이션 토큰을 공유 했으므로 동일한 액세스 토큰을 공유 할 수 있습니다. 등록 후 우리는 필요한 앱에서 사용할 수 있도록 DB에 액세스 및 새로 고침 토큰을 저장합니다.
참고 URL : https://stackoverflow.com/questions/11631928/authenticating-with-oauth2-for-an-app-and-a-website
'Program Tip' 카테고리의 다른 글
jquery가 메모리를 너무 많이 누수하는 이유는 무엇입니까? (0) | 2020.11.25 |
---|---|
외부 primop에 대한 cmm 호출 형식 (integer-gmp 예) (0) | 2020.11.25 |
예를 들어 아래에 더 이상 콘텐츠가 없을 때 NestedScrollView & CollapsingToolbarLayout의 스크롤을 비활성화하는 방법은 무엇입니까? (0) | 2020.11.25 |
systemgroup.com.apple.configurationprofiles 경로에 대한 시스템 그룹 컨테이너 (0) | 2020.11.25 |
와이드 스크린 모니터를 두 개 이상의 가상 모니터로 분할하는 방법이 있습니까? (0) | 2020.11.25 |