2017-02-07 2 views
23

를 식별 :최소 침습적 방법은 고유 어떻게 고유 있도록 응용 프로그램을 설치 한 사용자 식별 할 수있는 안드로이드 사용자

  1. 당신은 그들이 삭제하고 응용 프로그램을 다시 설치하는 경우가 그들을 알고 것이다;
  2. 그들이 동시에 사용할 두 번째 장치에 앱을 설치하는 경우 알 수 있습니다.

예를 들어 Netflix 앱이 사용자 상호 작용없이 데스크톱 계정에 자동으로 연결되는 것을 볼 수 있습니다. 나는 권한이 필요하기 때문에 accountManager.getAccounts() 또는 유사한 방법을 사용한다고 추측합니다. 물론 허가는 Protection level: dangerous으로 표시되어 있습니다. 덜 침습적이거나 위험 할 수있는 방법이 있습니까?


이 대답에 대한 열쇠는 간단하고 (사용자의 경우) 최소 침습적 인 것입니다. Android는 사용자를 식별 할 수있는 방법을 제공하며 사용자의 개인 정보를 피싱하는 많은 방법을 제공합니다. 이것이 유일한 방법 인 경우 지금하고있는 일 (선택 사항 인 이메일 등록)을 수행 할 것입니다. 난 단지 내 애플 리케이션 사용자 (사용자 이름/비밀 번호, 이메일 주소, 제 3 자 OAuth 등)를 인터뷰하지 않고 설치 전반에 걸쳐 내 시스템에 등록 된 경우 알 수있는 방법을 원한다.

내 주요 이유는 다음과 같습니다

  1. 나는 다시 설치 한 후에 그 내용을 분리 된 사용자의 지원 요청을하지 않는다; 및
  2. 고아가 된 콘텐츠를 많이 호스팅하고 싶지 않습니다.
+0

저는 이것이 GET_ACCOUNTS가 위험한 레벨 인 이유 중 하나라고 생각합니다. 계정을 기반으로 앱을 누가 설치했는지 추적하면 개인 정보가 수집됩니다. 그리고 연결된 계정에도 불구하고 기본적으로 동시 사용되는 장치 간에는 연결이 없기 때문에 어떤 식 으로든 생각할 수 없습니다. – Vacutainer

+0

전적으로 동의합니다.여기에서 유스 케이스는 매우 일반적입니다 - 사진 앱을 생각해보십시오. 사용자가 앱을 설치하고, 계정을 만들고, 콘텐츠를 만들고, 계정과 연결합니다. 일부는 비공개이며, 일부는 공유됩니다. 나는 "무서운 권한"을 가진 무서운 사용자없이 장치를 가로 질러 계정을 유지하기를 원합니다. 안드로이드가 갖고 싶었던 것은 각 게시자의 사용자에게 고유 한 "GUID"였기 때문에 com.mycompany.app1과 com.mycompany.app2는 같은 값을 보았습니다. 그러나 나는 그것이 현재 작동하지 않을 이유를 알 수 있습니다. – Andrew

+0

그 맥락에서 유용 할 것입니다, 당신 말이 맞습니다. 다른 한편으로는 사용자가 부분적으로 사적인 내용을 갖는 사용자가 다른 장치에서 "마술처럼"보일 수도 있습니다. 권한 요청 도중 사용 권한을 철저히 설명하면 희소성을 없앨 수 있습니다. 또한 사용자가 자신의 콘텐츠를 하나의 기기에만 국한되도록 선택할 수 있습니다. – Vacutainer

답변

9

Firebase Authentication을 살펴보십시오. 그것은 매우 매끄럽고 통합하는데 많은 노력을 필요로하지 않습니다. 또한 최종 사용자에게는 방해가되거나 성 가실 것 같지 않습니다.

여기 Google에서 video tutorial입니다.

편집 : 사용자가 전화 번호와 휴대 장치가 확신하는 경우 , 당신은 AccountKit를 사용할 수 있습니다. OTA (일회 인증)라고도 불립니다. AccountKit은 사용자 전화 번호만으로 사용자를 확인하고 유효성을 검사합니다.

편집 : 중포 기지 인증 지금 AccountKit는 위에서 언급 한 유사하다 '전화 인증'을 제공합니다. 둘 다 좋은 서비스입니다. 그러나 Firebase phone verification을 사용하면 자신 만의 UI를 처음부터 만들 수 있습니다. 이는 AccountKit보다 훨씬 잘 제어 할 수 있습니다. 또한 UI를 만들고 싶지 않으면 언제든지 사용할 수 있습니다. FirebaseUI

+2

아래에 몇 가지 흥미로운 아이디어가 있지만 그것이 내 목표에 가장 가깝다고 생각하기 때문에이 대답을 받아 들일 것입니다. @ assem-mahrous가 제안한 교차 장치 알림 시스템이 가장 흥미 롭습니다 (설치마다 영구적/결정적이라고 확신 할 수는 없지만). 무엇을 결정할 지 Firebase는 "익명 로그인"을 허용하여 사용자가 즉시 앱에 들어가 탐색하고 자신의 콘텐츠를 구축 한 다음 투자하고 신뢰한다고 생각하면 자신의 신원을 Google 계정으로 업그레이드 할 수 있습니다. 또는 FB 또는 전자 메일/암호). 또한 단일 계정을 시행 할 수 있습니다. – Andrew

+2

@Andrew 사용자에게 푸시 알림을 보내면 자동 푸시로 앱을 제거하는 방법을 사용자가 알 수 있고 앱에 알림을 표시하지 않고 사용자에게 성공과 실패에 대한 응답을 얻을 수 있습니다. –

1

가장 좋은 방법은 Google 또는 Facebook으로 로그인을 구현하는 것입니다. 이는 사용자에게는 매우 매끄럽고 안전하며 (Google 및 Facebook은 신뢰할 수있는 것으로 간주 됨) 전자 메일 등록을 구현할 필요가 없으며 여러 기기에서 신원을 확인할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 그들이 Google/Facebook을 가지고 있지 않다면? 나는 트위터를 사용할 수 있다고 생각한다. 트위터가 없습니까? 어쩌면 Foursquare라고 생각합니다. Foursquare 아니야? 그럼 Weibo. 그럼 Etsy. 그런 다음 Fitbit, Mixi 및 Netflix. 그것은 무한 회귀의 길입니다. 그런 다음 사용자가 OAuth 신원 정보로 당신을 연결하는 것에 익숙한 지, 그리고 애플리케이션 및 사용자 기반을 해당 제공 업체에 쉽게 연결할 수 있는지에 대한 질문이 있습니다. 나는 개인적으로 그 버튼을 클릭하는 것이 편안하다고 느끼지 않습니다 (그래서 나는 현재 어디에서나 연결되어 있습니다). 나는 그것이 너무 적게 돌아 오는 것을 너무 많이 포기한다고 생각한다. – Andrew

+0

이것은 사용자가 결정할 수 있습니다. 방금 사용자에게 가장 안전하며 대부분의 경우 작동하는 옵션을 제안했습니다. –

+1

@Andrew, 생각대로, 아무 것도 작동하지 않습니다. Android 기기를 소유 한 경우 Google 계정으로 설정해야합니다. 누군가가 이상한 뿌리를 둔 안드로이드 이미지를 실행하고 페이스 북이나 트위터 계정이 없다면 우리는 이미 어쨌든 건초 더미에 바늘에 대해 이야기하고 있습니다. 그리고 그것은 완전히 무한한 회귀가 아닙니다. 사용자가 이메일을 사용하여 등록해야하는 계정이없는 경우 몇 가지 간단한 옵션을 제공합니다. 이메일을받지 못하면 어떻게 될까요? :) 내가 뭔 말하는지 알 잖아? –

1

앱이 Android 전용이고 사용자 계정을 만들지 않고 신원을 제공하려면 Google 계정 이름 Android 휴대 전화에서 Google 계정을 사용해야하므로/id가 가장 좋습니다 (Accessing Google Account Id /username via Android). 루트가 아닌 한 Google Play 서비스를 삭제해야합니다.당신은 당신의 질문의 첫 번째 점을 해결하려는 경우

장치 ID가있다 (다시 설치 한 후 확인) - Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID); 그것을 100 % 신뢰할 수 없습니다 비록

+0

답변 해 주셔서 감사합니다 . 제 생각에 'Secure.ANDROID_ID'는 앱을 재설치하거나 기기의 데이터를 지우는 것에 대한 내 우려 사항을 충족시키는 답변에 가까워지고 있습니다. 물론 초기화 문제는 연고에서의 문제입니다. 단일 사용자의 'ADROID_ID'는 장치마다 다를 것이라고 가정합니다. – Andrew

0

표준에 대한을 (철 공장 재설정이 값을 재설정) 이러한 종류의 기능을 구현하려면 표준적인 편안한 API 트래픽과 함께 JSON web tokens (JWT)을 사용해야합니다.

귀하의 안드로이드 응용 프로그램이 모든 crudlike 작업 및 비즈니스 논리에 대해 RESTful API와 상호 작용한다고 가정하면 API에 대한 인증 식별자로 JWT를 사용하면 상당히 잘 작동 할 수 있습니다. 각 JWT에 정보를 임베드하여 원하는 것을 식별 할 수 있습니다 (데이터베이스의 사용자 ID, 로그인 한 사용자의 장치 ID 등). JWT는 본질적으로 API에서 사용할 정보를 저장할 수있는 데이터 구조입니다. 이것이 어떻게 작동하는지에 대한

일부 기본 : 응용 프로그램로 JWT를 얻기

  1. : 사용자 이름/암호를 사용하여 응용 프로그램에서 사용자가 로그인. api는 이후의 모든 요청에 ​​대해 클라이언트가 사용할 암호화 된 JWT를 반환합니다. 자신을 암호화하려고 시도하지 마십시오. api 서비스를 처리 할 수있는 모든 언어 에는이 라이브러리가 있습니다.
  2. JWT의 정보 사용 : JWT 자체는 데이터 구조입니다. 이 요청 헤더를 통해 인증을 공급하면

    { user_id: 1, device_id: 44215, device_os: android, }

    귀하의 API는 JWT의 암호를 해독하며, 다음 세션의 상황에서 사용할 수있는 정보를 가지고 예를 들어, 다음과 같을 수 있습니다.

api에서 사용하는 언어를 제공하면 라이브러리를 추천 할 수 있습니다.

사용자는 기본적으로 제출 한 최종 요구 사항을 참조하여 설치 전반에 걸쳐 사용자와 인터뷰 할 필요가 없다고 결론을 맺습니다. 사용자가 의미를 이해하고 사용자가 단순히 응용 프로그램을 설치하고 인증 자격 증명을 제공하지 않고 응용 프로그램을 사용하기를 원한다면이를 안전하게 수행 할 방법이 없습니다. 해킹 된 방식으로 작동하도록 만들 수는 있지만 근본적으로 불안정합니다.

+0

JWT는 여러 세션에서 상태를 유지하는 데 적합합니다. 그러나 많은 사람들이 다른 곳에서 설명했듯이 JWT는 상태 지속성을 유지하기에 열등합니다. 이것은 정확하게 나의 질문이며 NetFlix에 의해 이미 안전하고 비 hackishly 완료된 방법을 제공했습니다. – Andrew

+0

netflix가 데스크톱 버전을 설치했음을 감지하면 (또는 Android 앱에 Android 앱이 설치되어 있음을 감지 한 경우) 해당 애플리케이션에있는 자격 증명을 사용하여 브라우저를 통해 액세스 권한을 부여하지만 거의 확실하게 로컬에서 JWT를 검색합니다 응용 프로그램 및 인증을 사용합니다. 분석을 위해 데스크톱 앱과 차별화하기 위해 새로운 고유 한 앱을 요청할 수도 있지만 요점은 보안을 위해 각 개별 기기에서 적어도 한 번 사용자를 인터뷰해야한다는 것입니다. – melchoir55

+0

응용 프로그램의 설치 사이에 JWT가 계속 유지되는 경우 "정상적인"응용 프로그램 외부에 데이터를 저장해야합니다. 예를 들어, SD 카드 나 파일 시스템에 암호화 된 파일을 만들 수 있습니다. – melchoir55

4

푸시 알림에 의해 당신의 것과 거의 비슷하게 보이는 무언가를 구현했습니다. 사용자가 내 앱을 제거하면 (그리고 등록 ID에서 사용자를 얻는다) 오류가 발생할 수 있으며, 재설치하면 새 등록을 얻습니다 id, 다른 장치에 대한 사용자 UUID를 얻으려고 시도하십시오.

+0

. Firebase 또는 GCM을 사용하여 UID를 수신하고 있습니까? 또한 소유하지 않은 두 사용자 (예 : 휴대 전화 및 태블릿)에서 인증되지 않은 사용자가 동일한 UID를 수신하는지 여부를 알고 계십니까? 나는 이것이 공개 API에서 가능하지 않을 것이라고 확신하지만, Google이 비공개 API를 사용한다면 가능할 수도 있습니다. – Andrew

+0

firebase가 있지만 내 백엔드에서 laravel로 구현하면 모든 사용자가 고유 토큰을 얻습니다. 앱을 제거하고 다시 설치하면 새로운 토큰을 얻을 수 있습니다. 유일한 고유 한 것은 UUID입니다. 그를 추적하는 것 –

2

가장 간단한 방법은 UUID를 사용하고 sharedPreferences에 해시를 저장하는 것입니다. 앱에서 가능한 한 빨리 UUID를 생성해야합니다.

sharedPrefs = context.getSharedPreferences(APP_SHARED_PREFS,Activity.MODE_PRIVATE); 
if (sharedPrefs.getString("YOUR-KEY-TO-THE-UUID") == null || "".equals(sharedPrefs.getString("YOUR-KEY-TO-THE-UUID"))){ 
    prefsEditor = sharedPrefs.edit(); 
    prefsEditor.putString("YOUR-KEY-TO-THE-UUID", UUID.randomUUID().toString()); 
    prefsEditor.commit(); 
} 
+0

사용자가 장치에서 응용 프로그램을 제거하면 작동하지 않습니다. 사용자가 애플리케이션을 제거하면 SharedPreference 데이터가 삭제됩니다. –