我正在尝试使用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
中的示例提前致谢
答案 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);
(务必使用CommonsHttpOAuthConsumer
和CommonsHttpOAuthProvider
)