Использование OAuth с Scribe на Android - PullRequest
6 голосов
/ 03 августа 2011

Привет! Я использую библиотеку писцов для связи OAuth с LInkedIn.

У меня есть класс входа и класс запроса.

Класс входа в систему создает службу для получения моего токена запроса и его секрета и создает мой токен доступа.Токен доступа затем сохраняется в файле настроек.Кажется, это работает нормально, и я могу сделать успешный вызов API после того, как все токены были созданы.

В своем классе запросов OAuth я получаю токен доступа, создаю другую службу и пытаюсь выполнить вызов API, но когда я загружаю действие, которое вызывает этот класс, это вызывает сбой моего приложения.Я проверил, чтобы убедиться, что токен доступа сохранен и они есть.

Вот мой класс входа в систему

public class Login_LinkedIn extends Activity 
{
SharedPreferences settings;
OAuthService service;
Token requestToken;

Button home;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.webauth);

    initControls();

    service = new ServiceBuilder()
    .provider(LinkedInApi.class)
    .apiKey( getString(R.string.apiKey) )
    .apiSecret( getString(R.string.secKey) )
    .callback( getString(R.string.callBack) )
    .build();

    requestToken = service.getRequestToken();
    final String authURL = service.getAuthorizationUrl(requestToken);

    final WebView webview = (WebView) findViewById(R.id.webView);

    //attach WebViewClient to intercept the callback url
    webview.setWebViewClient(new WebViewClient()
    {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url)
        {

            //check for our custom callback protocol
            //otherwise use default behavior
            if(url.startsWith( getString(R.string.callBack) ))
            {
                //authorization complete hide webview for now.
                webview.setVisibility(View.GONE);
                Uri uri = Uri.parse(url);
                String verifier = uri.getQueryParameter("oauth_verifier");
                Verifier v = new Verifier(verifier);

                //save this token for practical use.
                Token accessToken = service.getAccessToken(requestToken, v);

                OAuthRequest request = new OAuthRequest(Verb.GET, "http://api.linkedin.com/v1/people/~:(first-name,last-name)");
                service.signRequest(accessToken, request);
                Response response = request.send();

                xmlHandler xh = new xmlHandler(response.getBody());

                settings = getSharedPreferences("preferences", 0);
                SharedPreferences.Editor editor = settings.edit();

                editor.putString("accessToken", accessToken.getToken());

                // The requestToken is saved for use later on to verify the OAuth request.
                // See onResume() below
                editor.putString("requestToken", requestToken.getToken());
                editor.putString("requestSecret", requestToken.getSecret());

                editor.putString("first-name", xh.getValue("first-name"));
                editor.putString("last-name", xh.getValue("last-name"));

                editor.commit();

                return true;
            }
            return super.shouldOverrideUrlLoading(view, url);
        }
   });

   //send user to authorization page
   webview.loadUrl(authURL); 
}

@Override
protected void onResume()
{
    super.onResume();

    Intent i = getIntent();

    if(i != null) 
    {
        Uri uri = i.getData();
        if(uri != null)
        {
            String oauthVerifier = uri.getQueryParameter("oauth_verifier");

            Verifier verifier = new Verifier(oauthVerifier);

            requestToken = new Token(settings.getString("requestToken", null), settings.getString("requestSecret", null));

            Token accessToken = service.getAccessToken(requestToken, verifier);

            // Save the access token.
            SharedPreferences.Editor editor = settings.edit();
            editor.remove("requestToken");
            editor.remove("requestSecret");
            editor.putString("accessToken", accessToken.getToken());
            editor.putString("accessSecret", accessToken.getSecret());
            editor.commit();

            // Start the film list activity.
            final Intent intent = new Intent(this,ProConnect.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
        }
    }
} 

private void initControls()
{
    home = (Button)findViewById(R.id.home);

    final Intent intent = new Intent(this,ProConnect.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    home.setOnClickListener(new Button.OnClickListener() 
    {
        public void onClick (View v) 
        {
            startActivity(intent);
        }
    });


}

}

и мой класс запроса

public class oAuthQuery extends Activity
{
OAuthService service;
Token accessToken;
SharedPreferences settings;

public oAuthQuery()
{
    service= new ServiceBuilder()
    .provider(LinkedInApi.class)
    .apiKey( getString(R.string.apiKey) )
    .apiSecret( getString(R.string.secKey) )
    .callback( getString(R.string.callBack) )
    .build();

    settings = getSharedPreferences("preferences", 0);

    accessToken = new Token(settings.getString("accessToken", null), settings.getString("accessSecret", null));

}

public String query(String s)
{
    OAuthRequest request = new OAuthRequest(Verb.GET, s);
    service.signRequest(accessToken, request);
    Response response = request.send();

    return response.getBody();
}

public OAuthService getService()
{
    return service;
}

}

Спасибоза любую помощь Джефф

1 Ответ

1 голос
/ 08 августа 2011

Я решил проблему, это было что-то глупое в конце концов. Я отредактировал свой код, чтобы сохранить секрет доступа и токен доступа, но забыл повторно войти в систему при тестировании приложения на телефоне. Это привело к тому, что код, который сохранил части токена, не был достигнут.

У меня все еще есть проблема с использованием приглашения в API LinkedIn

invite.setOnClickListener(new Button.OnClickListener() 
        {
            public void onClick (View v) 
            {
                inviteXml = inviteCreator.inviteString(to, subj, body, authName, authValue);
                nameField.setText(inviteXml);
                titleField.setText("");


                call = "http://api.linkedin.com/v1/people/~/mailbox";
                request = new OAuthRequest(Verb.GET, call);
                request.addPayload(inviteXml);
                service.signRequest(accessToken, request);
                response = request.send();

                invite.setVisibility(View.GONE);
            }
        });

Я не уверен, что это правильный способ добавить строку XML в вызов. API LinkedIn не определяет, как это должно быть добавлено. У кого-нибудь есть опыт с этим?

...