2017-01-11 11 views

答えて

0

Android用 'Facebook'アプリは、Androidアカウントマネージャーにアカウントを作成します。自分の電話番号を入力して(FBアプリに)ログインしたユーザーの場合は、アカウント登録された電話番号をアカウント名として取得できます。

Android上でのFacebookアプリケーションにログインするために使用>

1)電子メールのID -

移動すること> Accounts-> Facebookのここ

を[設定するには、次の3のどちらかが表示されます

2)AndroidのFacebookアプリケーションへのログインに使用される電話番号

3)ユーザーID - 各ユーザーの一意のID。たとえばMark ZuckerbergのIDは「zuck」(https://www.facebook.com/zuck)です。

ここで、「連絡先」の許可を受け入れるようにユーザーを誘導する方法があります。 「連絡先」権限(マニフェストにも「アカウント」権限を追加することを忘れないでください)を取得したら、android.accounts.AccountManagerクラスを使用して、すべてのアカウントデータ(Facebookを含む)にアクセスできます。

AccountManager am = AccountManager.get(this); 
    Account[] accounts = am.getAccounts(); 
    for (Account ac : accounts) { 
     String accountType = ac.type; 
     if (accountType.equals("com.facebook.auth.login")) { 
      String usrDataStr = accountType + "-->" + ac.name; 
      Toast.makeText(this, usrDataStr, Toast.LENGTH_LONG).show(); 
     } 
    } 

上記のコードを使用して、アンドロイドデバイスのアカウントを繰り返すことができます。上記のコードは、基本的にFacebookアカウントがデバイスに存在し、関連するデータを取得するかどうかをチェックします。

少しの調査の後、私はFacebookがログインページに電話番号を入力した場合、ユーザーの電話番号をアカウント名として設定することに気付きました。ただし、電子メールまたはユーザーIDを使用する場合は、アカウント名として設定されます。

私の経験から、大多数の人が自分の電話番号を使用してログインする傾向があることに気付きました。したがって、この技術を使用してユーザーの電話番号を取得する可能性が高くなります。

この方法は、ユーザーの連絡先情報を取得するための不正な方法(電話番号の取得が必須ではない場合)のアプリを開発する場合に適しています。これはユーザーの電話番号を取得するための保証された方法ではなく、セキュリティ上の欠陥である可能性があることを認識すると、Facebookはこのようなユーザー情報の公開をやめる可能性があります。また、その番号は別のデバイスに属することもあります。

私はFacebookにこの問題を報告しましたが、セキュリティチームから「これは予想される動作であり、アプリケーション間の通信/機密情報ではない」との回答がありました。

でサンプルコードをチェックアウト:あなたはユーザの位置を取ることによって、ユーザのアドレスを取得することができます...質問の第二の部分についてはhttps://github.com/umangmathur92/FacebookVulnerabilityProof

では、Googleの「FusedLocationApi」を使用して座標サービスを再生し、位置情報要求の結果、すなわち地理座標を使用して、 'Geocoder'クラスを使用して可能なアドレスのリストを取得します。

1)あなたのonCreate/onCreateView機能インサイド:

GoogleApiClient mGoogleApiClient = return new GoogleApiClient.Builder(getContext()) 
       .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { 
        @Override 
        public void onConnected(@Nullable Bundle bundle) { 
        } 

        @Override 
        public void onConnectionSuspended(int i) { 
        } 
       }) 
       .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { 
        @Override 
        public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
        } 
       }) 
       .addApi(LocationServices.API) 
       .build(); 
      mGoogleApiClient.connect(); 
       LocationRequest mLocationRequest = new LocationRequest(); 
       LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder(); 
       builder.addLocationRequest(mLocationRequest); 
       LocationSettingsRequest mLocationSettingsRequest = builder.build(); 

       PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, mLocationSettingsRequest); 
       result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 
        @Override 
        public void onResult(@NonNull LocationSettingsResult locationSettingsResult) { 
         final Status status = locationSettingsResult.getStatus(); 
         switch (status.getStatusCode()) { 
          case LocationSettingsStatusCodes.SUCCESS: 
           Log.i(MY_LOG, "All location settings are satisfied."); 
           getLocation(); 
           break; 
          case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
           Log.i(MY_LOG, "Location settings are not satisfied. Show the user a dialog to upgrade location settings "); 
           break; 
          case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
           Log.i(MY_LOG, "Location settings are inadequate, and cannot be fixed here. Dialog not created."); 
           break; 
         } 
        } 
       }); 

2) 'のgetLocation' 関数:

private void getLocation() { 
     mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
     if (mLastLocation != null) { 
      userProfile.setLatitude(mLastLocation.getLatitude()); 
      userProfile.setLongitude(mLastLocation.getLongitude()); 
      AsyncTask<Location, String, List<Address>> reverseGeoCodeTask = getReverseGeoCodeAsyncTask(); 
      reverseGeoCodeTask.execute(mLastLocation); 
     } 
    } 

3)リバースジオコーディングAsyncTask:

private AsyncTask<Location, String, List<Address>> getReverseGeoCodeAsyncTask() { 
     return new AsyncTask<Location, String, List<Address>>() { 

      @Override 
      protected List<Address> doInBackground(Location... locations) { 
       Geocoder geocoder = new Geocoder(getContext(), Locale.getDefault()); 
       try { 
        return geocoder.getFromLocation(locations[0].getLatitude(), locations[0].getLongitude(), 1); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 

      @Override 
      protected void onPostExecute(List<Address> addresses) { 
       super.onPostExecute(addresses); 
       if (Utils.notNullOrEmpty(addresses)) { 
        Address address = addresses.get(0); 
        address.getPostalCode(); 
        address.getLocality(); 
        address.getAdminArea(); 
       } 
      } 
     }; 
    } 

注意:私は許可チェック、簡潔さのためのエラー処理を含むコードの特定の部分をスキップしました。

+0

メールや電話番号の代わりに、これを解決しましたか? :( https://k50.kn3.net/E74B28C18.png – karique

関連する問題