2013-07-29 1 views
0

Java에서 Android 장치로 액세스 토큰을 가져 오려고합니다.OAuth2에서 액세스 토큰 얻기

먼저 설치된 애플리케이션 (Android)의 클라이언트 ID를 Google API Console에 만들고 액세스 토큰을 요청할 패키지를 설정하고 SHA1 fingerprint입니다.

내가 액세스 토큰을 얻기 위해 OAuth2ForDevices에서 읽었을 때, 나는 처음에 사용자 코드를 얻어야 만합니다. 그래서 CLIENT_ID 및 범위는 다음과 같습니다 : Aquery을 사용하여 POST 요청을 보내려고 :

AQuery aq = new AQuery(activity); 
     aq.ajax("https://accounts.google.com/o/oauth2/device/code?" + 
       "scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile" + 
       "client_id=xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com", 
      JSONObject.class,new AjaxCallback<JSONObject>(){ 

      @Override 
      public void callback(String url, JSONObject traffic_flow, AjaxStatus status) { 

       publishProgress(traffic_flow.toString()); 

      } 
    }); 

문제는 JSONObject traffic_flow가에 allways 널 것입니다. 나는 또한이를 사용하여 얻을려고 (그러나 나는 이것이 올바른 방법입니다 일을하지 않는) :

mEmail는 안드로이드 장치에서 전자 메일입니다
authToken = GoogleAuthUtil.getToken(activity, mEmail, "audience:server:client_id:xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com"); 

,하지만 난 GoogleAuthException "알"을 얻었다. 사용자 코드를 올바르게 얻으려면 어떻게해야합니까?

편집 : 나는이를 사용하여 인증 토큰을 얻기 위해 마지막으로 할 수 있었다

:

범위는 이후 나는를 보내고있다 Google API Console에서 생성 된 웹 애플리케이션을위한 클라이언트 ID가 (이다
String scope = "audience:server:client_id:xxxxxxxxxxxx.apps.googleusercontent.com"; 
String token = GoogleAuthUtil.getToken(activity, client.getAccountName(), scope); 

토큰을 내 웹 사이트에 추가하고 확인하는 것), 클라이언트는 PlusClient입니다 (자세한 내용은 Getting started with Google+).

내가 내 테스트 응용 프로그램에서 토큰을 획득했습니다, 이제 문제는 내가 나의 새로운 응용 프로그램에 코드를 포함하고 싶어 할 때, 나는 다시 추한 예외 얻고 있다는 것입니다 :

com.google.android.gms.auth.GoogleAuthException: Unknown at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) 

을 모든 이러한 응용 프로그램의 클라이언트 ID가 동일한 프로젝트에 있으면 매니페스트의 사용 권한이 ok (GET_ACCOUNTS,USE_CREDENTIALS,AUTHENTICATE_ACCOUNTS,INTERNET,ACCESS_NETWORK_STATE) 여야합니다. 그것없이 작동하지 않기 때문에 PlusClient를 만들 때 내가 새 응용 프로그램에서 변경 한 유일한 변화는 어떻게 생각

mPlusClient = new PlusClient.Builder(this, this, this) 
      .setVisibleActivities("http://schemas.google.com/AddActivity") 
      .setScopes(Scopes.PLUS_LOGIN, Scopes.PLUS_PROFILE) 
      .build() 

(내 테스트 응용 프로그램에없이 작동 이유를 알고하지 않습니다) 범위를 설정하는 것입니다 있어야 할 곳에 없는?

+0

내가 구글이 약 2 주 전에 API를 좌표에 대한 작업이, 슬프게도이 내 코드는 내 작품 노트북에 점점 하루에 소비해야한다고 생각 당신과 범위를 교체해야

, 나는 목요일까지 나갈 수 없을 것이다. 나는이 기사를 나에게 올바른 방향으로 밀어 넣었다. http://blog.tomtasche.at/2013/05/google-oauth-on-android-using.html 행운을 빌어 요! 코드에 액세스 할 때 체크 인을 시도하고 상기시키기 위해이 질문을 좋아할 것입니다. – Robadob

+0

@Robadob이 기사를 주셔서 감사합니다. – DropDropped

+0

범위 문자열이'oauth2 : https : //www.googleapis.com/auth/glass.timeline https : // www. googleapis.com/auth/userinfo.profile' 나는 내 문제 중 하나라는 것을 상기합니다. – Robadob

답변

1

이 API를 사용하려면 이 있으면 POST 버전의 AQuery를 사용하고 POST 매개 변수를 다음과 같이 올바르게 전달해야합니다. 이 API OAuth2ForDevices은 사용자가 앱을 승인하는 또 다른 방법이있는 리소스가 제한된 기기를 대상으로합니다. 귀하의 요구 사항은 일반 입력 기능을 갖춘 안드로이드 폰 말에 안드로이드와 함께 정기적으로 OAuth2를 사용하는 경우

params.put("scope", "your scopes"); 
params.put("client_id", "your client id"); 

AQuery aq = new AQuery(activity); 
aq.ajax("https://accounts.google.com/o/oauth2/device/code", params, JSONObject.class, 
    new AjaxCallback<JSONObject>() { 
      @Override 
      public void callback(String url, JSONObject traffic_flow, AjaxStatus status) { 
       publishProgress(traffic_flow.toString()); 
      } 
}); 

그러나, 다음, 안드로이드 표준의 OAuth 메커니즘은 this입니다.

+0

내가하려는 것은 액세스 토큰을 사용하여 내 웹 사이트에 요청을 보내면 Google 공개 키를 사용하여이를 확인할 수 있고 응답을 되돌려 보낼 수 있습니다. [OAuth2InstalledApp] (https://developers.google.com/accounts/docs/OAuth2InstalledApp)에서도 몇 가지 추가 매개 변수가 있지만 사용자의 접근 방식으로 시도했지만 null 응답으로 네트워크 오류가 발생합니다. 내가 작성한 링크를 사용하여 로그인 할 수 있지만이를 사용하여 액세스 코드를 얻을 수 있습니까? – DropDropped

+0

이 버그에 대해 도와주세요 http://stackoverflow.com/questions/21445265/google-coordinate-authentification –

1

이것은 Google Coordinate API와 함께 사용하기 위해 OAuth 2.0 토큰을 얻는 데 사용하는 코드이며, ASyncTask 내에서 실행합니다. 일부 AccountManager 인 텐트에서 startActivityForResult()를 사용하므로 DESIRED_USER를 생성하는 부분은 포함하지 않았습니다. 희망을 갖고 이것을 사용할 수 있습니다.당신은 내가 oauth2:https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile

import android.accounts.Account; 
import android.accounts.AccountManager; 

final String SCOPE = "oauth2:https://www.googleapis.com/auth/coordinate"; 
AccountManager accountManager = AccountManager.get(context); 
//Kill Current token 
accountManager.invalidateAuthToken("com.google",authManager.getToken()); 
//Fetch userAccount 
Account userAccount = null; 
for(Account account : accountManager.getAccounts()) 
    if(account.name.equals(DESIRED_USER)) 
    { 
     try { 
      return accountManager.blockingGetAuthToken(userAccount, SCOPE, false); 
     } catch (Exception e) { 
      System.out.println("Error: "+e.toString()); 
      e.printStackTrace(); 
     } 
    } 
return null; 
+0

답장을 보내 주셔서 감사합니다. 불행히도 이런 식으로 토큰을받을 수 없습니다. 'accountManager.blockingGetAuthToken (account, "oauth2 : https : //www.googleapis.com/auth/userinfo.email", false);을 사용할 때 null – DropDropped

+0

docs say, Returns 이것을 위해 지정된 유형의 인증 토큰 인증에 실패하거나 아무것도 가져올 수없는 경우 null입니다. 아마도 사용중인 계정에 G +가 없습니까? 그렇지 않으면 예외가 발생할 것으로 예상됩니다. "http://developer.android.com/reference/android/accounts/AccountManager.html#blockingGetAuthToken(android.accounts.Account, java.lang.String, boolean) – Robadob

+0

GoogleAuthUtil.getToken() 메소드가 언제 던지기 시작했는지 이전 예외 대신 기기에 등록되지 않은 이메일에 대해 'BadUsername'메시지가 포함 된 GoogleAuthException '기존 계정이 아닌'email_address ''가 포함 된 IllegalArgumentException? http://developer.android.com/reference/com/ google/android/gms/auth/GoogleAuthUtil.html # getToken (android.content.Context, java.lang.String, java.lang.String) – toobsco42