`
river418
  • 浏览: 26939 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Android:SNS客户端开发一:OAuth认证方法

 
阅读更多

 编写微博客户端,最重要的就是用户授权方法。现在主流SNS社区开放API后,基本都采用OAuth认证进行授权。本文主要记录新浪微博1.0a版本的OAuth认证。但是随着2.0版本的逐渐普及,会在今后的加入2.0版本的方法。

     有关OAuth认证的理论及相应流程在这里不做过多追述,各大网站上都已经写的十分清晰,这里主要写下我自己的实现方法。对于OAuth认证,这里采用signpost-oauth开源项目。

     首先编写一个类,用于存储认证过程中需要用到基本信息。

public class SinaConstant {// 新浪OAuth辅助信息类

	// 所分配的APP_KEY
	public static final String CONSUMER_KEY = "";
	// 所分配的APP_SECRET
	public static final String CONSUMER_SECRET = "";
	// 用于获取未授权的request token
	public static final String REQUEST_URL = "http://api.t.sina.com.cn/oauth/request_token";
	// 用于获取access token
	public static final String ACCESS_URL = "http://api.t.sina.com.cn/oauth/access_token";
	// 用于对未授权的request token进行授权
	public static final String AUTHORIZE_URL = "http://api.t.sina.com.cn/oauth/authorize";
	// 回调地址
	public static final String OAUTH_CALLBACK_URL = "mysina://CallActivity";

}

 注:1、其中回调地址用于指向从新浪页面授权后跳转到页面;2、对应的key和secret填写新浪微博对应提供的app_key及app_secret

     建立一个Activity用于进行添加账号的操作。将改Activity设置为单例模式

<activity
            android:label="@string/app_name"
            android:launchMode="singleInstance"            android:name=".AddUserActivity" >
            <intent-filter >
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="CallActivity"
                    android:scheme="mysina" />
            </intent-filter>
        </activity>

注:1、android:launchMode="singleInstance"将该Activity设置为单例;2、data标签与SinaConstant类中的回调地址对应,用于从浏览器回传值时呼出该Activity

 

    建立AddUserActivity,对应代码如下:

 

public class AddUserActivity extends Activity {
	/** Called when the activity is first created. */
	Context context;
	private OAuthConsumer sinaconsumer;
	private OAuthProvider sinaprovider;
                private OAuthRequestToken oauthtool;
public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.usermanager);
		sinaconsumer = new CommonsHttpOAuthConsumer(SinaConstant.CONSUMER_KEY,SinaConstant.CONSUMER_SECRET);//初始化用于OAuth认证的Consumer对象
		sinaprovider = new CommonsHttpOAuthProvider(SinaConstant.REQUEST_URL,SinaConstant.ACCESS_URL, SinaConstant.AUTHORIZE_URL);//初始化用于OAuth认证的Provider对象     		
		ImageButton adduser = (ImageButton) findViewById(R.id.addUserImage);this.context = this;		
		adduser.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
			System.out.println("OAuth认证新浪");
				oauthtool = new OAuthRequestToken(context, sinaconsumer,sinaprovider);
				oauthtool.execute();	
			}

		});
	}
protected void onNewIntent(Intent intent) {//AddUserActivity为单例,再第二次开启时加载该方法
		super.onNewIntent(intent);
		Uri uri = intent.getData();
		String verifier = null;
		verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
		try {						
                                 sinaprovider.setOAuth10a(true);//设置OAuth版本号			
                      sinaprovider.retrieveAccessToken(sinaconsumer, verifier);//通过服务器返回的Verifier去获取账号对应的Token
		SortedSet<String> user_ids = sinaprovider.getResponseParameters().get("user_id");
		String user_id = user_ids.first();
		String Token= sinaconsumer.getToken();
		String TokenSecret = sinaconsumer.getTokenSecret();
		System.out.println(userKey + "&*&" + userSecret);
		} catch (Exception e) {
			e.printStackTrace();
		}
}

 注:1、在OnNewIntent方法中,sinaprovider.retrieveAccessToken()需要与网路交互,最好采取异步操作,本代码中忽略,异步方法可以参考在onClickListener监听中的OAuthRequestToken。

 

我们可以在上面的代码中看到,我们已经获取到相应的Token及TokenSecret了。通过这2个值,我们技能对授权账号进行操作,获取账号信息,发送微博,获取微博,更新资料等。

 

在第一步认证中,用到了一个异步类OAuthRequestToken,代码如下 :

public class OAuthRequestToken extends AsyncTask<String, Void, String> {

	private OAuthConsumer consumer;
	private OAuthProvider provider;

	private Context context;
	private ProgressDialog pd;

	public OAuthRequestToken(Context context, OAuthConsumer consumer,
			OAuthProvider provider) {
		this.context = context;
		this.consumer = consumer;
		this.provider = provider;
	}

	@Override
	protected String doInBackground(String... params) {
		// TODO Auto-generated method stub
		// if(type.equalsIgnoreCase("sina")){

		try {
			Uri uri = null;
			// retrieveRequestToken的第二个参数是回调URL
			final String url = provider.retrieveRequestToken(consumer,SinaConstant.OAUTH_CALLBACK_URL);
			System.out.println(consumer.getToken());
			uri = Uri.parse(url);
			context.startActivity(new Intent(Intent.ACTION_VIEW, uri));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}

		
		return "success";
	}

	@Override
	protected void onPostExecute(String result) {
		// TODO Auto-generated method stub
		super.onPostExecute(result);
		pd.dismiss();
		if(result == null){
			Toast.makeText(context, "网络异常,请稍后重试", Toast.LENGTH_LONG).show();
		}
		
	}

	@Override
	protected void onPreExecute() {
		// TODO Auto-generated method stub
		super.onPreExecute();
		pd = new ProgressDialog(context);
		pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
		pd.setMessage("正在加载");
		pd.show();
	}

}

 OAuth认证,在本文中是通过调用系统浏览器到新浪微博指定地址进行授权,如果使用UCWeb之类的浏览器可能会出现无法回调的异常。所以建议使用WebView来实现授权页面。相应的方法会在后面写到。

2
4
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics