2013-09-26 1 views
3

Я разрабатываю приложение для Android, которое использует GAE, и я пытаюсь выполнить аутентифицированные вызовы. У меня проблема, и все работает. Когда я проверил первый параметр в авторизованной функции (Пользователь), он всегда равен нулю. Вот мой андроид код:Авторизация с помощью GAE на Android. User = null

settings = getSharedPreferences("TicTacToeSample", 0); 
    credential = GoogleAccountCredential.usingAudience(this, 
      "server:client_id:504148155997.apps.googleusercontent.com"); 
    credential.setSelectedAccountName(accountName); 

    if (credential.getSelectedAccountName() == null) { 
     startActivityForResult(credential.newChooseAccountIntent(), 2); 
    } else { 
     Toast.makeText(getApplicationContext(), 
       credential.getSelectedAccountName(), 10000).show(); 

     MessageEndpoint.Builder endpointBuilder = new MessageEndpoint.Builder(
       AndroidHttp.newCompatibleTransport(), new GsonFactory(), 
       credential); 

     messageEndpoint = CloudEndpointUtils.updateBuilder(endpointBuilder) 
       .build(); 
    } 


private void setAccountName(String accountName) { 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putString("pref", accountName); 
     editor.commit(); 
     credential.setSelectedAccountName(accountName); 
     this.accountName = accountName; 
    } 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    switch (requestCode) { 
    case 2: 
     if (data != null && data.getExtras() != null) { 
      String accountName = data.getExtras().getString(
        AccountManager.KEY_ACCOUNT_NAME); 
      if (accountName != null) { 
       setAccountName(accountName); 
       SharedPreferences.Editor editor = settings.edit(); 
       editor.putString("pref", accountName); 
       editor.commit(); 
       // User is authorized. 
       Toast.makeText(getApplicationContext(), 
         credential.getSelectedAccountName(), 10000).show(); 
       credential.setSelectedAccountName(accountName); 
       MessageEndpoint.Builder endpointBuilder = new MessageEndpoint.Builder(
         AndroidHttp.newCompatibleTransport(), 
         new GsonFactory(), credential); 

       messageEndpoint = CloudEndpointUtils.updateBuilder(
         endpointBuilder).build(); 
      } 
     } 
     break; 
    } 
} 

А вот мой GAE:

@Api(name = "deviceinfoendpoint", clientIds = { Ids.WEB_CLIENT_ID, 
     Ids.ANDROID_CLIENT_ID }, audiences = { Ids.ANDROID_AUDIENCE }, namespace = @ApiNamespace(ownerDomain = "safeandroid.com", ownerName = "safeandroid.com", packagePath = "mjmobilesolutions")) 
public class DeviceInfoEndpoint { 
... 

@ApiMethod(name = "insertDeviceInfo") 
    public DeviceInfo insertDeviceInfo(User user, DeviceInfo deviceinfo) 
      throws OAuthRequestException { 
     EntityManager mgr = getEntityManager(); 
     if (user != null) 
      deviceinfo.setUser(user); 
     else 
      throw new OAuthRequestException("Not authorized!"); 
     try { 
      if (containsDeviceInfo(deviceinfo)) { 
       throw new EntityExistsException("Object already exists"); 
      } 

      mgr.persist(deviceinfo); 
     } finally { 
      mgr.close(); 
     } 
     return deviceinfo; 
    } 
} 

Когда я бегу мое приложение, я всегда получаю следующее исключение из insertDeviceInfo функции:

09-26 15:55:18.185: E/com.safeandroid.mjmobilesolutions.GCMIntentService(3833): Exception received when attempting to register with server at https://velvety-347.appspot.com/_ah/api/ 
09-26 15:55:18.185: E/com.safeandroid.mjmobilesolutions.GCMIntentService(3833): com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized 
.. 
09-26 15:55:18.185: E/com.safeandroid.mjmobilesolutions.GCMIntentService(3833):  "message" : "com.google.appengine.api.oauth.OAuthRequestException: Not authorized!", 

Я пробовал поместить web_id и android_id в учетные данные, но это не сработало. Что не так?

+0

Я борюсь с точно то же самое. Он работает с Javascript, но не с Android. Вы нашли решение еще? – Floris

ответ

0

В коде Android, в качестве аудитории, попробуйте поместить «Идентификатор клиента для веб-приложения», который вы можете найти в пользовательском интерфейсе.

credential = GoogleAccountCredential.usingAudience(this, 
     "server:client_id:putHereTheClientIDForWebApplication"); 

Это работает для меня, другие вещи кажется правильным

Смежные вопросы