Android应用中的OAuth请求令牌= null

时间:2010-06-04 15:35:54

标签: android oauth

我正在尝试使用OAuth验证某些内容(在本例中为LinkedIn),但请求的令牌始终返回null?

以下是我的代码:

public void authenticateAppOauthApi() {
        Log.d(TAG, "authenticateAppOauthApi");

        OAuthServiceProvider provider = new OAuthServiceProvider(
                REQUEST_TOKEN_PATH, AUTHORIZE_PATH, ACCESS_TOKEN_PATH);

        OAuthConsumer consumer = new OAuthConsumer(CALLBACK_URL, API_KEY,
                SECRET_KEY, provider);

        OAuthAccessor accessor = new OAuthAccessor(consumer);

        Intent intent = new Intent(Intent.ACTION_VIEW);
        Log.d(TAG, "Intent intent = new Intent(Intent.ACTION_VIEW );");
        // intent.setData(Uri.parse(url));
        String url = accessor.consumer.serviceProvider.userAuthorizationURL
                + "?oauth_token=" + accessor.requestToken + "&oauth_callback="
                + accessor.consumer.callbackURL;

        intent.setData(Uri.parse(url));
        Log.d(TAG, "intent.setData(Uri.parse(url)); = " + url);
        mContext.startActivity(intent);

        Log.d(TAG, "finish authenticateApp");
}

我基本上遵循了http://donpark.org/blog/2009/01/24/android-client-side-oauth

中的示例

提前致谢

4 个答案:

答案 0 :(得分:1)

你可以尝试这段代码。

OAuthClient oAuthClient = new OAuthClient(new HttpClient4());
try {
 oAuthClient.getRequestToken(accessor);
} catch (IOException e) {
 e.printStackTrace();
} catch (OAuthException e) {
 e.printStackTrace();
} catch (URISyntaxException e) {
 e.printStackTrace();
}

答案 1 :(得分:0)

只是一个想法,是HTTP URL还是HTTPS URL?

我在访问HTTPS网址时遇到了一些问题,浏览器&应用程序告诉证书是错误的。

Android不知道某些根证书。

答案 2 :(得分:0)

我在使用我在Scala Android应用中的网络上找到的OAuth库时遇到了一些问题。而不是找到一种方法来使用lib我只是自己推出...不确定它是否适用于linkedin(它适用于Yammer,它使用HTTPS)。好吧,下面是相关代码,请注意,我对Android和Scala都很陌生,所以可能有更好的方法来实现这一点。

布局文件“R.layout.authorization”非常基本,包含两个按钮和RelativeLayout中的文本字段。

class Authorization extends Activity {

  val client = new DefaultHttpClient()
  val reqUrl = "https://www.yammer.com/oauth/request_token"
  val authUrl = "https://www.yammer.com/oauth/authorize?oauth_token="
  val accessUrl = "https://www.yammer.com/oauth/access_token"

  override def onCreate(bundle:Bundle) = {
    super.onCreate(bundle)
    this.setContentView(R.layout.authorization)

    val authButton = findViewById(R.id.authButton).asInstanceOf[Button]
    val getCodeButton = findViewById(R.id.getCode).asInstanceOf[Button]

    val prefs = getSharedPreferences(PreferenceFile(), 0)
    if(prefs.contains("oauth_request_token")) { 
      authButton.setVisibility(View.VISIBLE)
    }

    setupListeners(authButton, getCodeButton) 
  }

  private def getAuthVerifier() = { 
    val authVerifierBox:EditText = Authorization.this.findViewById(R.id.authVerifier).asInstanceOf[EditText]
    if(authVerifierBox != null && authVerifierBox.getText() != null) {
      authVerifierBox.getText().toString()    
    } else {
      ""
    }
  }

  private def setupListeners(authButton:Button, getCodeButton:Button) = {
    authButton.setOnClickListener(new View.OnClickListener() {
      override def onClick(view:View) = {
        retrieveAuthTokenAndSecret()  
      }
    })
    getCodeButton.setOnClickListener(new View.OnClickListener() {
      override def onClick(view:View) = {
        try {
          // Retrieve a request token with an async task and then start the browser...
          // Use of an implicit definition to convert tuple to an async task.
          (() => {
              // Task to perform
              val reqPost = new HttpPost(reqUrl)
              reqPost.setHeader("Authorization", OAuthHeaderBuilder(null,null,null))
              reqPost.setHeader("Content-Type", "application/x-www-form-urlencoded")
              val reqResp= client.execute(reqPost)
              reqResp.getEntity()
          },  
           (entity:HttpEntity) => {
            // PostExecute handle result from task...
            if(entity != null) {
              val reader = new BufferedReader(new InputStreamReader(entity.getContent()))
              val line = reader.readLine()
              val (oauth_request_token, oauth_token_secret) = OAuthTokenExtractor(line)

              // Store request tokens so they can be used when retrieving auth tokens...
              val editor = getSharedPreferences(PreferenceFile(), 0).edit()
              editor.putString("oauth_request_token", oauth_request_token)
              editor.putString("oauth_token_secret", oauth_token_secret)
              editor.commit()

              // Start browser...
              val intent = new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl + oauth_request_token))
              startActivity(intent)
              val authButton = findViewById(R.id.authButton).asInstanceOf[Button]
              authButton.setVisibility(View.VISIBLE)                
            }
          }).doInBackground()
        } catch {
          case e:Exception => Log.e("ERROR", "ERROR IN CODE:"+e.toString())
        }
      }
    })
  }

  private def retrieveAuthTokenAndSecret() = {
    val authVerifier = getAuthVerifier()  
    val accessPost = new HttpPost(accessUrl)
    val prefs = getSharedPreferences(PreferenceFile(), 0)
    val token = prefs.getString("oauth_request_token","")
    val secret = prefs.getString("oauth_token_secret","")
    accessPost.setHeader("Authorization", OAuthHeaderBuilder(token, secret, authVerifier))
    accessPost.setHeader("Content-Type", "application/x-www-form-urlencoded")
    val accessResp = client.execute(accessPost)
    val entity = accessResp.getEntity()
    if(entity != null) {
      val reader = new BufferedReader(new InputStreamReader(entity.getContent()))
      val builder = new StringBuilder()
      val line = reader.readLine()
      val (oauth_token, oauth_token_secret) = OAuthTokenExtractor(line)
      val result = new Intent()
      val editor = getSharedPreferences(PreferenceFile(), 0).edit()
      editor.putString("oauth_token", oauth_token)
      editor.putString("oauth_token_secret", oauth_token_secret)
      editor.commit()

      setResult(Activity.RESULT_OK, result)
      finish()
    }
  } 
}

OAuthHeaderBuilder基本上是Yammer oauth示例代码的副本:

object OAuthHeaderBuilder {
  // Apply function taken from the Yammer oauth sample 
  def apply(token:String, secret:String,verifier:String):String = {
    val buff = new StringBuilder()
    val currentTime = System.currentTimeMillis()
    // Hardcoded values for consumer key and secret...
    val consumerKey = "<your consumer key here>"
    val consumerSecret = "<your consumer secret here>"
    buff.append("OAuth realm=\"");
    buff.append("\", oauth_consumer_key=\"");
    buff.append(consumerKey);
    buff.append("\", ");

    if (token != null) {
      buff.append("oauth_token=\"");
      buff.append(token);
      buff.append("\", ");
    }

    buff.append("oauth_signature_method=\"");
    buff.append("PLAINTEXT");
    buff.append("\", oauth_signature=\"");
    buff.append(consumerSecret);
    buff.append("%26");
    if (secret != null) {
      buff.append(secret);
    }
    buff.append("\", oauth_timestamp=\"");
    buff.append(currentTime);
    buff.append("\", oauth_nonce=\"");
    buff.append(currentTime);

    if (verifier != null) {
      buff.append("\", ");
      buff.append("oauth_verifier=\"");
      buff.append(verifier);
    }

    buff.append("\", oauth_version=\"1.0\"");

    return buff.toString();
  }
}

为了提取令牌,我制作了一个OAuthTokenExtractor对象......

object OAuthTokenExtractor {
  def apply(line:String) = {
    val token = (line split ("&")).find(x => x.startsWith("oauth_token=")) match {
      case Some(oauth_token) => (oauth_token split ("=") )(1)
      case _ => ""
    }   
    val secret = (line split ("&")).find(x => x.startsWith("oauth_token_secret=")) match {
      case Some(oauth_token_secret) => (oauth_token_secret split ("=") )(1)
      case _ => ""
    }   
    (token,secret)
  }
}

希望有所帮助:)

答案 3 :(得分:0)

更好地使用this article作为参考:

在当前版本的Signpost中有一个获取身份验证URL的代码是:

provider.retrieveRequestToken(CALLBACK_URL);

(务必使用CommonsHttpOAuthConsumerCommonsHttpOAuthProvider