2016-10-25 3 views
0

Withings 사용자의 활동 데이터를 내 애플리케이션에 표시하는 Android 앱을 제작 중입니다.andings에 Withings API 통합

하지만 URL refresh_token도 호출하려고 할 때 :

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 

그럼 내가 잘못된 서명 응답 아래와 같이 점점 오전 :

모두의
{ 
    "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

감사합니다. 로한을 편집 해 주셔서 감사합니다. 실수로 죄송합니다. –

+0

안드로이드에 withings API를 통합 했습니까? –

+0

내 코드가 너무 오래 되었기 때문에 더 많은 정보로 질문을 업데이트 할 수 있습니까? – gmetax

답변

1

먼저 당신의 scribe lib
을 사용할 수 있습니다 내 샘플 코드 나는 사용자가 응용 프로그램을 확인하는 데 사용하는 WebView가있는 인증 활동이 있습니다. 그런 다음 인증 활동은 응답을 MainActivity로 되돌려 보냅니다.

예를 들어 인증 할 때마다 자격 증명을 묻지 않는 DB에 로컬로 저장하고 있습니다.
또한 파이썬 서버에 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에서 사용자 아이디있어. –