2016-08-18 4 views
0

그래서 지금까지 사용자가 자신의 Google 계정에 대한 권한을 요청했습니다. 그런 다음 해당 토큰을 가져와 다음 URL https://api.comma.ai/v1/auth/?access_token=에 추가하여 토큰을 가져와 사용할 수 있도록 토큰을 저장해야합니다. 그러나, 내가 얻은 401보다 나은 { "성공": 거짓, "오류": "oauth failed"}라는 제목으로 ... 생각하십니까? 이것은 처음으로 다이빙입니다. 나는 이것이 어디에서 잘못 될 지 확신하지 못한다. 어떤 도움이라도 대단히 감사합니다. 누군가가 그것을보고 할 필요가있는 경우"error": HttpURLConnection과 함께 "oauth failed"

여기

public class MainActivity extends AppCompatActivity { 

    Context mContext = MainActivity.this; 
    private AccountManager mAccountManager; 
    private AuthPreferences authPreferences; 
    EditText emailText; 
    TextView responseView; 
    ProgressBar progressBar; 
    static final String API_KEY = ""; 
    static final String API_URL = "https://api.comma.ai/v1/auth/?access_token="; 
    static final String ClientId = "45471411055-m902j8c6jo4v6mndd2jiuqkanjsvcv6j.apps.googleusercontent.com"; 
    static final String ClientSecret = ""; 
    static final String SCOPE = "https://www.googleapis.com/auth/userinfo.email"; 
    private static final int AUTHORIZATION_CODE = 1993; 
    private static final int ACCOUNT_CODE = 1601; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     responseView = (TextView) findViewById(R.id.responseView); 
     emailText = (EditText) findViewById(R.id.emailText); 
     progressBar = (ProgressBar) findViewById(R.id.progressBar); 
     final Context context = this; 
     mAccountManager = AccountManager.get(this); 
     authPreferences = new AuthPreferences(this); 


     SignInButton signInButton = (SignInButton) findViewById(R.id.sign_in_button); 
     signInButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (authPreferences.getUser() != null && authPreferences.getToken() != null) { 
        doCoolAuthenticatedStuff(); 
        new RetrieveFeedTask().execute(); 
       } else{ 
        chooseAccount(); 
       } 
      } 
     }); 
//  Button queryButton = (Button) findViewById(R.id.queryButton); 
// 
//  queryButton.setOnClickListener(new View.OnClickListener() { 
//   @Override 
//   public void onClick(View v) { 
//    if (isNetworkAvailable() == true) { 
//     new RetrieveFeedTask().execute(); 
//     Intent intent = new Intent(context, NavDrawerActivity.class); 
//     startActivity(intent); 
//    } else { 
//     Toast.makeText(MainActivity.this, "No Network Service, please check your WiFi or Mobile Data Connection", Toast.LENGTH_SHORT).show(); 
//    } 
//   } 
//  }); 

     SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE); 
     boolean dontShowDialog = sharedPref.getBoolean("DONT_SHOW_DIALOG", false); 
     if (!dontShowDialog) { 
      WifivsDataDialog myDiag = new WifivsDataDialog(); 
      myDiag.show(getFragmentManager(), "WiFi"); 
      myDiag.setCancelable(false); 
     } 
    } 

    private void doCoolAuthenticatedStuff() { 
     Log.e("AuthApp", authPreferences.getToken()); 
    } 

    private void chooseAccount() { 
     Intent intent = AccountManager.newChooseAccountIntent(null, null, new String[]{"com.google"}, false, null, null, null, null); 
     startActivityForResult(intent, ACCOUNT_CODE); 
    } 

    private void requestToken() { 
     Account userAccount = null; 
     String user = authPreferences.getUser(); 
     if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.GET_ACCOUNTS) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return; 
     } 
     for (Account account : mAccountManager.getAccountsByType(GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE)) { 
      if (account.name.equals(user)) { 
       userAccount = account; 
       break; 
      } 
     } 

     mAccountManager.getAuthToken(userAccount, "oauth2:" + SCOPE, null, this, new OnTokenAcquired(), null); 
    } 

    private void invalidateToken() 
    { 
     AccountManager mAccountManager = AccountManager.get(this); 
     mAccountManager.invalidateAuthToken("com.google", authPreferences.getToken()); 
     authPreferences.setToken(null); 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (resultCode == RESULT_OK) { 
      if (requestCode == AUTHORIZATION_CODE) { 
       requestToken(); 
      } else if (requestCode == ACCOUNT_CODE) { 
       String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); 
       authPreferences.setUser(accountName); 

       // invalidate old tokens which might be cached. we want a fresh 
       // one, which is guaranteed to work 
       invalidateToken(); 

       requestToken(); 
      } 
     } 
    } 

    public class OnTokenAcquired implements AccountManagerCallback<Bundle> 
    { 
     @Override 
     public void run(AccountManagerFuture<Bundle> result) 
     { 
      try { 
       Bundle bundle = result.getResult(); 
       Intent launch = (Intent) bundle.get(AccountManager.KEY_INTENT); 
       if(launch != null) 
       { 
        startActivityForResult(launch, AUTHORIZATION_CODE); 
       } else { 
        String token = bundle.getString(AccountManager.KEY_AUTHTOKEN); 

        authPreferences.setToken(token); 
        doCoolAuthenticatedStuff(); 
       } 
      } catch (Exception e){ 
       Log.e("ERROR", e.getMessage(), e); 
      } 
     } 
    } 

    public boolean isNetworkAvailable() 
    { 
     ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 
     if(networkInfo != null && networkInfo.isConnected()) 
     { 
      Log.e("Network Testing", "Available"); 
      return true; 
     } 
     Log.e("Network Testing", "Not Available"); 
     return false; 
    } 



    class RetrieveFeedTask extends AsyncTask<Void, Void, String> { 

     private Exception exception; 

     protected void onPreExecute() { 
      progressBar.setVisibility(View.VISIBLE); 
      responseView.setText(""); 
     } 

     protected String doInBackground(Void... urls) { 

      // Do some validation here 

      try { 
       URL url = new URL(API_URL + authPreferences); 
       HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
       urlConnection.addRequestProperty("client_id", ClientId); 
       urlConnection.addRequestProperty("client_secret", ClientSecret); 
       urlConnection.setRequestProperty("Authorization", "OAuth " + authPreferences); 
       try { 
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
        StringBuilder stringBuilder = new StringBuilder(); 
        String line; 
        while ((line = bufferedReader.readLine()) != null) { 
         stringBuilder.append(line).append("\n"); 
        } 
        bufferedReader.close(); 
        return stringBuilder.toString(); 
       } 
       finally{ 
        urlConnection.disconnect(); 
       } 
      } 
      catch(Exception e) { 
       Log.e("ERROR", e.getMessage(), e); 
       return null; 
      } 
     } 

     protected void onPostExecute(String response) { 
      if(response == null) { 
       response = "THERE WAS AN ERROR"; 
      } 
      progressBar.setVisibility(View.GONE); 
      Log.i("INFO", response); 
      responseView.setText(response); 
      // 
      // TODO: check this.exception 
      // TODO: do something with the feed 

//   try { 
//    JSONObject object = (JSONObject) new JSONTokener(response).nextValue(); 
//    String requestID = object.getString("requestId"); 
//    int likelihood = object.getInt("likelihood"); 
//    JSONArray photos = object.getJSONArray("photos"); 
//    . 
//    . 
//    . 
//    . 
//   } catch (JSONException e) { 
//    e.printStackTrace(); 
//   } 
     } 
    } 
} 

그리고 MainActivity.java

는 AuthPreferences.java입니다.

public class AuthPreferences { 
    private static final String KEY_USER = "user"; 
    private static final String KEY_TOKEN = "token"; 

    private SharedPreferences preferences; 

    public AuthPreferences(Context context) { 
     preferences = context 
       .getSharedPreferences("auth", Context.MODE_PRIVATE); 
    } 

    public void setUser(String user) { 
     Editor editor = preferences.edit(); 
     editor.putString(KEY_USER, user); 
     editor.commit(); 
    } 

    public void setToken(String password) { 
     Editor editor = preferences.edit(); 
     editor.putString(KEY_TOKEN, password); 
     editor.commit(); 
    } 

    public String getUser() { 
     return preferences.getString(KEY_USER, null); 
    } 

    public String getToken() { 
     return preferences.getString(KEY_TOKEN, null); 
    } 
} 
+1

코드에서 비밀 키를 제거해야합니다. – David

+0

David, 비밀 키는 GitHub 하하에 있습니다. 그래서 게시하거나 일반적으로 그것을 제거 말하고 있습니다. 일반적으로 내 매니페스트 파일에 넣어야합니까? 또한, 오류의 원인에 대한 아이디어? –

답변

0

나는 OAuth2 용 Android를 사용하지 않았지만 귀하의 코드를 이해하는 한 몇 가지 오류가 있다고 생각합니다. RetrieveFeedTask 수정이 같은 액세스 토큰 사용 (OAuth2를 토큰 무기명 토큰 내가 아는 모든 일반적으로) 접근 방식이 맞다면 당신이 링크를 어디에 게시 할 수 있습니다 (I는 확실하지 않다 또한

URL url = new URL(API_URL + authPreferences.getToken()); 
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
urlConnection.addRequestProperty("client_id", ClientId); 
urlConnection.addRequestProperty("client_secret", ClientSecret); 
urlConnection.setRequestProperty("Authorization", "OAuth " + authPreferences.getToken()); 

을이 조각 에서 왔니?). OAuth2를 이해하는 한,이 시점에서 Bearer 토큰을 사용하여 간단하게 권한을 부여 할 수 있으며 더 이상 URL/클라이언트 ID 및 비밀에 액세스 토큰을 제공 할 필요가 없다는 것을 알았습니다. 또는 한 단계가 누락되었을 수 있습니다 (예 : 두 가지 요청에서 상위 코드 분할). 명시 적으로 OAuth2 표준을 따르고 있는지 확인하고 사용중인 보조금 유형을 확인하십시오. 그런 다음 응용 프로그램을 디버그하여 오류가 반환 된 위치를 찾으십시오.

관련 문제