2016-10-25 21 views
0

私はアプリケーションにWithingsのユーザーの行動データを示すAndroid Appをビルドしています。Withings APIとAndroidの統合

しかし、私はrefresh_token URLを呼び出すようにしようとしています:

https://oauth.withings.com/account/request_token?oauth_callback=******&oauth_consumer_key=******&oauth_nonce=******&oauth_signature=CcMrI7JaI8M5tEenye3s95wx%2BZ4%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1477386344&oauth_version=1.0 

それから私は、以下のような無効な署名の応答を取得しています:あなたは私のオンscribe lib
を使用することができ、すべての

{ 
    "status":0, 
    "message":"Invalid signature :\n CcMrI7JaI8M5tEenye3s95wx+Z4= .. \n{\"oauth_callback\":\"******\",\"oauth_consumer_key\":\"ce54bd6c671546ef8f8d394c0db4bd86688289d5f7fb39f371c5ebce4d01\",\"oauth_nonce\":\"f339febe0fdf4b53b953501e45a049db\",\"oauth_signature\":\"CcMrI7JaI8M5tEenye3s95wx+Z4=\",\"oauth_signature_method\":\"HMAC-SHA1\",\"oauth_timestamp\":\"1477386344\",\"oauth_version\":\"1.0\"}\n{\"base_string\":\"GET&https%3A%2F%2Foauth.withings.com%2Faccount%2Frequest_token&oauth_callback%3D******%26oauth_consumer_key%3D******%26oauth_nonce%3Df339febe0fdf4b53b953501e45a049db%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1477386344%26oauth_version%3D1.0\"}\n{\"key\":\"******\",\"secret\":\"******\",\"callback_url\":null}" 
} 
+0

編集のためのRohanに感謝し、間違いの申し訳ありません。 –

+0

アンドロイドにwithings APIを統合しましたか? –

+0

私のコードが古すぎるので、あなたの質問をより多くの情報で更新できますか? – gmetax

答えて

1

ファーストサンプルコード私はユーザーがアプリケーションを確認するために使用するWebViewを持つ認証アクティビティを持っています。次に、その認証アクティビティが応答をMainActivityに返します。

私の例では、認証されたユーザーが資格情報を毎回尋ねないように、DBにローカルに格納しています。
また、Pythonサーバーにアクセストークンを送信しています。このトークンは、Withings Cloudに保存されているすべてのデータをサーバーDBに保存し、グラフアクティビティで表示するためのものです。 {私はその部分を削除した}ので、多分何かが欠落しているコピーペーストの

はなく、コードのほとんどは

public class WithingsApi extends DefaultApi10a { 

    private static final String AUTHORIZATION_URL ="https://oauth.withings.com/account/authorize?oauth_token=%s"; 
    private static final String apiKey = "API_KEY"; 
    private static final String apiSecret = "API_SECRET"; 

    @Override 
    public String getRequestTokenEndpoint() { 
     return "https://oauth.withings.com/account/request_token"; 
    } 

    @Override 
    public String getAccessTokenEndpoint() { 
     return "https://oauth.withings.com/account/access_token"; 
    } 

    @Override 
    public String getAuthorizationUrl(Token requestToken) { 
     return String.format(getAUTHORIZATION_URL(), requestToken.getToken()); 
    } 

    public static String getKey(){ 
     return apiKey; 
    } 

    public static String getSecret(){ 
     return apiSecret; 
    } 

    public static String getAUTHORIZATION_URL() { 
     return AUTHORIZATION_URL; 
    } 

} 




@SuppressLint("SetJavaScriptEnabled") 
public class AuthenticationActivity extends Activity { 
    final String LOGTAG = "WITHINGS"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_authentication); 

     final WebView wvAuthorise = (WebView) findViewById(R.id.wvAuthorise); 
     wvAuthorise.getSettings().setJavaScriptEnabled(true); 
     wvAuthorise.setWebViewClient(new MyWebViewClient(wvAuthorise)); 

     MainActivity.service = new ServiceBuilder().provider(WithingsApi.class) 
       .apiKey(WithingsApi.getKey()) 
       .apiSecret(WithingsApi.getSecret()) 
       .build(); 

     new Thread(new Runnable() { 
      public void run() { 
       MainActivity.requestToken = MainActivity.service.getRequestToken(); 
       final String authURL = MainActivity.service.getAuthorizationUrl(MainActivity.requestToken); 
       wvAuthorise.post(new Runnable() { 
        @Override 
        public void run() { 
         wvAuthorise.loadUrl(authURL); 
        } 
       });    

      } 
     }).start(); 

    } 

    class MyWebViewClient extends WebViewClient{ 
     WebView wvAuthorise; 
     MyWebViewClient(WebView wv){ 
      wvAuthorise = wv; 
     } 
     @Override 
     public void onPageFinished(WebView view, String url) { 
       getUSERID(url); 
     } 
    } 

    private void getUSERID(final String url) { 

     try { 
      String divStr = "userid="; 
      int first = url.indexOf(divStr); 

      if(first!=-1){ 
       final String userid = url.substring(first+divStr.length()); 

       Intent intent = new Intent(); 
       intent.putExtra("USERID",userid); 
       setResult(RESULT_OK,intent); 
       finish(); 
      } 
      else 
      { 
       //... 
      } 

     } catch (Exception e) { 
      Log.e(LOGTAG,e.getMessage()); 
      //... 
     } 
    } 
} 



public class MainActivity extends FragmentActivity { 

    public static OAuthService service; 
    public static Token requestToken; 
    String secret, token; 
    Token accessToken; 
    String userId = ""; 

    private UsersDataSource datasource; 
    private TextView nameTV; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     _mainActivity = this; 

     nameTV = (TextView) findViewById(R.id.nameTitleTextView); 
     nameTV.setText("--"); 

     getCredentials(); 
    } 

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

     if (requestCode == AUTHENTICATION_REQUEST) { 

      if (resultCode == RESULT_OK) { 
       Bundle extras = intent.getExtras(); 
       if (extras != null) { 
        userId = extras.getString("USERID"); 

        getAccessTokenThread.execute((Object) null); 
       } 
      } 
     } 
    } 
    @Override 
    protected void onResume() { 
     datasource.open(); 
     super.onResume(); 
    } 

    @Override 
    protected void onPause() { 
     datasource.close(); 
     super.onPause(); 
    } 

    private void getCredentials() { 
     try { 
      datasource = new UsersDataSource(this); 
      datasource.open(); 

      List<User> users = datasource.getAllUsers(); 

      if (users.isEmpty()) { 
       startAuthenticationActivity(); 
      } else { 
       // TODO load all users and if isn't anyone correct 
       // startAuthenticationActivity 
       secret = users.get(0).getSecret(); 
       token = users.get(0).getToken(); 
       userId = users.get(0).getUserId(); 
       Log.i(LOGTAG, "secret : " + secret); 
       Log.i(LOGTAG, "token : " + token); 
       Log.i(LOGTAG, "userId : " + userId); 
       try { 
        service = new ServiceBuilder().provider(WithingsApi.class) 
          .apiKey(WithingsApi.getKey()) 
          .apiSecret(WithingsApi.getSecret()).build(); 
        accessToken = new Token(token, secret); 

        loadData(); 
       } catch (Exception ex) { 
        startAuthenticationActivity(); 
       } 

      } 
     } catch (Exception ex) { 
      Log.e(LOGTAG, "try on create" + ex.getLocalizedMessage()); 
     } 
    } 

    private void startAuthenticationActivity() { 
     Intent intent = new Intent(this, 
       ics.forth.withings.authentication.AuthenticationActivity.class); 
     startActivityForResult(intent, AUTHENTICATION_REQUEST); 
    } 

    AsyncTask<Object, Object, Object> getAccessTokenThread = new AsyncTask<Object, Object, Object>() { 
     @Override 
     protected Object doInBackground(Object... params) { 
      accessToken = service 
        .getAccessToken(requestToken, new Verifier("")); 

      secret = accessToken.getSecret(); 
      token = accessToken.getToken(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Object result) { 
      // authentication complete send the token,secret,userid, to python 
      datasource.createUser(token, secret, userId); 
      loadData(); 
     }; 

    }; 
} 

ここ
OAuthServiceクラスはスクリーブ
からであるUPDATEですトークンクラスはScribeからです
UserDataSourceクラスはDBヘルパークラスですhere

+0

ありがとう@metax、このコードを試しますが、MainActivityで使用しているOAuthServiceクラス、Tokenクラス、UserDataSourceクラスを提供できますか? –

+0

また、Withings APIの認証の最初のステップ、つまりoAuth urlの取得で無効な署名が取得されています。 –

+0

ありがとう@gmetax、それは働いた、私はwithingsからユーザーIDを得た。 –