2016-08-18 6 views
0

これまでのところ、ユーザーが自分のGoogleアカウントへのアクセスを許可するように依頼しました。そのトークンを取得し、それを次のURLのhttps://api.comma.ai/v1/auth/?access_token=に追加して、そこからトークンを取得し、そのトークンを使用して使用できるようにする必要があります。しかし、私が得たタイトル(「成功」:false、「エラー」:「oauth failed」)は、私が取得した401よりも優れています...私は思いますか?これは私にとって初めてのダイビングです。私はこれについてどこが間違っているのか分からない。どんな助けでも大歓迎です。誰もがそれを見てする必要がある場合"error":HttpURLConnectionで "oauth failed"

MainActivity.java

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(); 
//   } 
     } 
    } 
} 

そして、ここでは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 haha​​にあります。あなたがそれを掲示するときや一般的にそれを取り除くと言っていますか?一般的に私はそれを私のマニフェストファイルに入れなければならないのですか?さらに、エラーの原因に関する考えはありますか? –

答えて

0

私はOAuth2のためにAndroidを使用しませんでしたが、あなたのコードを理解する限り、いくつかのエラーがあると思います。 次のようにアクセストークンを使用し、(のOAuth2トークンは、一般的に、私が知っているすべてのためのベアラトークンです)RetrieveFeedTaskを修正:

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と秘密にアクセストークンを提供する必要がなくなると期待します。または、2つのリクエストで上位コードを分割するなどの手順が欠落している可能性があります。明示的にOAuth2標準に従っていることを確認し、使用している認可タイプを確認してください。次に、アプリケーションをデバッグして、エラーが返される場所を見つけます。