新浪微博SSO授权以及分享(实战)

标签: 新浪微博 sso 授权 | 发表时间:2013-09-26 05:52 | 作者:Jerome_XX
出处:http://blog.csdn.net

很多人不会使用第三方应用,特写此篇使用下第三方应用:代码具体如下:

【ConstantS.java】

public interface ConstantS {

	// 应用的key 请到官方申请正式的appkey替换APP_KEY
	public static final String APP_KEY = "2045436852";

	// 替换为开发者REDIRECT_URL
	public static final String REDIRECT_URL = "http://www.sina.com";

	// 新支持scope:支持传入多个scope权限,用逗号分隔
	public static final String SCOPE = "email,direct_messages_read,direct_messages_write,"
			+ "friendships_groups_read,friendships_groups_write,statuses_to_me_read,"
			+ "follow_app_official_microblog," + "invitation_write";

	public static final String CLIENT_ID = "client_id";
	public static final String RESPONSE_TYPE = "response_type";
	public static final String USER_REDIRECT_URL = "redirect_uri";
	public static final String DISPLAY = "display";
	public static final String USER_SCOPE = "scope";
	public static final String PACKAGE_NAME = "packagename";
	public static final String KEY_HASH = "key_hash";
}

【MainActivity.java】

import java.text.SimpleDateFormat;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;

import com.weibo.sdk.android.Oauth2AccessToken;
import com.weibo.sdk.android.Weibo;
import com.weibo.sdk.android.WeiboAuthListener;
import com.weibo.sdk.android.WeiboDialogError;
import com.weibo.sdk.android.WeiboException;
import com.weibo.sdk.android.sso.SsoHandler;
import com.weibo.sdk.android.util.AccessTokenKeeper;

public class MainActivity extends Activity {

	/** 显示认证后的信息,如AccessToken */
	private TextView mText;

	/** 微博API接口类,提供登陆等功能 */
	private Weibo mWeibo;

	/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */
	private Oauth2AccessToken mAccessToken;

	/** 注意:SsoHandler 仅当sdk支持sso时有效 */
	private SsoHandler mSsoHandler;
	private Intent intent;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		mText = (TextView) findViewById(R.id.show);

		mWeibo = Weibo.getInstance(ConstantS.APP_KEY, ConstantS.REDIRECT_URL,
				ConstantS.SCOPE);
		// 触发sso测试button
		findViewById(R.id.share).setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(getApplicationContext(),
						ShareActivity.class);
				intent.putExtra("id", R.id.share);
				startActivity(intent);
			}
		});
		// 触发sso测试button
		findViewById(R.id.sso).setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				mSsoHandler = new SsoHandler(MainActivity.this, mWeibo);
				mSsoHandler.authorize(new AuthDialogListener(), null);
			}
		});

		// 从 SharedPreferences 中读取上次已保存好 AccessToken 等信息,
		// 第一次启动本应用,AccessToken 不可用
		mAccessToken = AccessTokenKeeper.readAccessToken(this);
		if (mAccessToken.isSessionValid()) {
			String date = new java.text.SimpleDateFormat("yyyy/MM/dd hh:mm:ss")
					.format(new java.util.Date(mAccessToken.getExpiresTime()));
			mText.setText("access_token 仍在有效期内,无需再次登录: \naccess_token:"
					+ mAccessToken.getToken() + "\n有效期:" + date);

		} else {
			mText.setText("使用SSO登录前,请检查手机上是否已经安装新浪微博客户端,"
					+ "目前仅3.0.0及以上微博客户端版本支持SSO;如果未安装,将自动转为Oauth2.0进行认证");
		}
	}

	/**
	 * 微博认证授权回调类。 1. SSO登陆时,需要在{@link #onActivityResult}
	 * 中调用mSsoHandler.authorizeCallBack后, 该回调才会被执行。 2. 非SSO登陆时,当授权后,就会被执行。
	 * 当授权成功后,请保存该access_token、expires_in等信息到SharedPreferences中。
	 */
	class AuthDialogListener implements WeiboAuthListener {

		@Override
		public void onComplete(Bundle values) {

			String token = values.getString("access_token");
			String expires_in = values.getString("expires_in");
			mAccessToken = new Oauth2AccessToken(token, expires_in);
			if (mAccessToken.isSessionValid()) {
				String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
						.format(new java.util.Date(mAccessToken
								.getExpiresTime()));
				mText.setText("认证成功: \r\n access_token: " + token + "\r\n"
						+ "expires_in: " + expires_in + "\r\n有效期:" + date);

				AccessTokenKeeper.keepAccessToken(MainActivity.this,
						mAccessToken);
				Toast.makeText(MainActivity.this, "认证成功", Toast.LENGTH_SHORT)
						.show();
			}
		}

		@Override
		public void onError(WeiboDialogError e) {
			Toast.makeText(getApplicationContext(),
					"Auth error : " + e.getMessage(), Toast.LENGTH_LONG).show();
		}

		@Override
		public void onCancel() {
			Toast.makeText(getApplicationContext(), "Auth cancel",
					Toast.LENGTH_LONG).show();
		}

		@Override
		public void onWeiboException(WeiboException e) {
			Toast.makeText(getApplicationContext(),
					"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG)
					.show();
		}
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);

		// SSO 授权回调
		// 重要:发起 SSO 登陆的Activity必须重写onActivityResult
		if (mSsoHandler != null) {
			mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
		}
	}

}

【ShareActivity.java】

import android.app.Activity;
import android.content.Intent;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.sina.weibo.sdk.WeiboSDK;
import com.sina.weibo.sdk.api.BaseResponse;
import com.sina.weibo.sdk.api.IWeiboAPI;
import com.sina.weibo.sdk.api.IWeiboHandler;
import com.sina.weibo.sdk.api.ImageObject;
import com.sina.weibo.sdk.api.SendMessageToWeiboRequest;
import com.sina.weibo.sdk.api.SendMultiMessageToWeiboRequest;
import com.sina.weibo.sdk.api.TextObject;
import com.sina.weibo.sdk.api.WeiboMessage;
import com.sina.weibo.sdk.api.WeiboMultiMessage;

/**
 * 该Activity演示了第三方应用如何发送请求消息给微博客户端。发送的内容包括文字、图片、视频、音乐等。 执行流程: 从本应用->微博->本应用
 */
public class ShareActivity extends Activity implements OnClickListener,
		IWeiboHandler.Response {

	/** 微博OpenAPI访问入口 */
	IWeiboAPI mWeiboAPI = null;

	// UI元素列表
	/** 分享文本 */
	private TextView mTitle;

	/** 分享图片 */
	private ImageView mImage;

	/** 分享按钮 */
	private Button mSharedBtn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.share);
		initViews();

		// 创建微博对外接口实例
		mWeiboAPI = WeiboSDK.createWeiboAPI(this, ConstantS.APP_KEY);
		mWeiboAPI.responseListener(getIntent(), this);
	}

	@Override
	protected void onNewIntent(Intent intent) {
		super.onNewIntent(intent);
		mWeiboAPI.responseListener(intent, this);
	}

	/**
	 * 从本应用->微博->本应用 接收响应数据,该方法被调用。 注意:确保{@link #onCreate(Bundle)} 与
	 * {@link #onNewIntent(Intent)}中, 调用 mWeiboAPI.responseListener(intent,
	 * this)
	 */
	@Override
	public void onResponse(BaseResponse baseResp) {
		switch (baseResp.errCode) {
		case com.sina.weibo.sdk.constant.Constants.ErrorCode.ERR_OK:
			Toast.makeText(this, "成功!!", Toast.LENGTH_LONG).show();
			break;
		case com.sina.weibo.sdk.constant.Constants.ErrorCode.ERR_CANCEL:
			Toast.makeText(this, "用户取消!!", Toast.LENGTH_LONG).show();
			break;
		case com.sina.weibo.sdk.constant.Constants.ErrorCode.ERR_FAIL:
			Toast.makeText(this, baseResp.errMsg + ":失败!!", Toast.LENGTH_LONG)
					.show();
			break;
		}
	}

	/**
	 * 用户点击分享按钮,唤起微博客户端进行分享。
	 */
	@Override
	public void onClick(View v) {
		if (R.id.sharedBtn == v.getId()) {
			mWeiboAPI.registerApp();
			reqMsg(true, true, false, false, false, false);
		}
	}

	private void initViews() {

		mSharedBtn = (Button) findViewById(R.id.sharedBtn);
		mSharedBtn.setOnClickListener(this);

		mTitle = (TextView) findViewById(R.id.titleText);
		mImage = (ImageView) findViewById(R.id.image);

	}

	private void reqMsg(boolean hasText, boolean hasImage, boolean hasWebpage,
			boolean hasMusic, boolean hasVedio, boolean hasVoice) {

		if (mWeiboAPI.isWeiboAppSupportAPI()) {
			Toast.makeText(this, "当前微博版本支持SDK分享", Toast.LENGTH_SHORT).show();

			int supportApi = mWeiboAPI.getWeiboAppSupportAPI();
			if (supportApi >= 10351) {
				Toast.makeText(this, "当前微博版本支持多条消息,Voice消息分享",
						Toast.LENGTH_SHORT).show();
				reqMultiMsg(hasText, hasImage, hasWebpage, hasMusic, hasVedio,
						hasVoice);
			} else {
				Toast.makeText(this, "当前微博版本只支持单条消息分享", Toast.LENGTH_SHORT)
						.show();
				reqSingleMsg(hasText, hasImage, hasWebpage, hasMusic, hasVedio/*
																			 * ,
																			 * hasVoice
																			 */);
			}
		} else {
			Toast.makeText(this, "当前微博版本不支持SDK分享", Toast.LENGTH_SHORT).show();
		}
	}

	/**
	 * 第三方应用发送请求消息到微博,唤起微博分享界面。 注意:当isWeiboAppSupportAPI() >= 10351
	 * 时,支持同时分享多条消息, 同时可以分享文本、图片以及其它媒体资源(网页、音乐、视频、声音中的一种), 并且支持Voice消息。
	 * 
	 * @param hasText
	 *            分享的内容是否有文本
	 * @param hasImage
	 *            分享的内容是否有图片
	 * @param hasWebpage
	 *            分享的内容是否有网页
	 * @param hasMusic
	 *            分享的内容是否有音乐
	 * @param hasVideo
	 *            分享的内容是否有视频
	 * @param hasVoice
	 *            分享的内容是否有声音
	 */
	private void reqMultiMsg(boolean hasText, boolean hasImage,
			boolean hasWebpage, boolean hasMusic, boolean hasVideo,
			boolean hasVoice) {

		// 1. 初始化微博的分享消息
		WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
		if (hasText) {
			weiboMessage.textObject = getTextObj();
		}

		if (hasImage) {
			weiboMessage.imageObject = getImageObj();
		}

		// 2. 初始化从第三方到微博的消息请求
		SendMultiMessageToWeiboRequest req = new SendMultiMessageToWeiboRequest();
		// 用transaction唯一标识一个请求
		req.transaction = String.valueOf(System.currentTimeMillis());
		req.multiMessage = weiboMessage;

		// 3. 发送请求消息到微博,唤起微博分享界面
		mWeiboAPI.sendRequest(this, req);
	}

	/**
	 * 第三方应用发送请求消息到微博,唤起微博分享界面。 当isWeiboAppSupportAPI() < 10351 只支持分享单条消息,即
	 * 文本、图片、网页、音乐、视频中的一种,不支持Voice消息。
	 * 
	 * @param hasText
	 *            分享的内容是否有文本
	 * @param hasImage
	 *            分享的内容是否有图片
	 * @param hasWebpage
	 *            分享的内容是否有网页
	 * @param hasMusic
	 *            分享的内容是否有音乐
	 * @param hasVideo
	 *            分享的内容是否有视频
	 */
	private void reqSingleMsg(boolean hasText, boolean hasImage,
			boolean hasWebpage, boolean hasMusic, boolean hasVideo/*
																 * , boolean
																 * hasVoice
																 */) {

		// 1. 初始化微博的分享消息
		// 用户可以分享文本、图片、网页、音乐、视频中的一种
		WeiboMessage weiboMessage = new WeiboMessage();
		if (hasText) {
			weiboMessage.mediaObject = getTextObj();
		}
		if (hasImage) {
			weiboMessage.mediaObject = getImageObj();
		}

		// 2. 初始化从第三方到微博的消息请求
		SendMessageToWeiboRequest req = new SendMessageToWeiboRequest();
		// 用transaction唯一标识一个请求
		req.transaction = String.valueOf(System.currentTimeMillis());
		req.message = weiboMessage;

		// 3. 发送请求消息到微博,唤起微博分享界面
		mWeiboAPI.sendRequest(this, req);
	}

	/**
	 * 文本消息构造方法。
	 * 
	 * @return 文本消息对象。
	 */
	private TextObject getTextObj() {
		TextObject textObject = new TextObject();
		textObject.text = mTitle.getText().toString();
		return textObject;
	}

	/**
	 * 图片消息构造方法。
	 * 
	 * @return 图片消息对象。
	 */
	private ImageObject getImageObj() {
		ImageObject imageObject = new ImageObject();
		BitmapDrawable bitmapDrawable = (BitmapDrawable) mImage.getDrawable();
		imageObject.setImageObject(bitmapDrawable.getBitmap());
		return imageObject;
	}

}

完整代码下载===》》》

weibo.sdk.android.demo.zip


作者:Jerome_XX 发表于2013-9-25 21:52:58 原文链接
阅读:6 评论:0 查看评论

相关 [新浪微博 sso 授权] 推荐:

新浪微博开放平台SSO授权上线

- - 微博之博
作为一名普通微博用户,在手机上使用 新浪微博客户端,已经输入过自己的帐号及密码,是否期待手机上的第三方应用如360安全浏览器、唱吧等,可以识别当前的微博帐号,而不需要重新输入账号密码进行登陆. 近日,新浪微博开放平台 SSO授权的正式上线,帮助用户实现了这一愿望. SSO英文全称Single Sign On(单点登录),意指用户只需登录一次,就可以访问相互信任的其他应用系统.

新浪微博Android客户端SSO授权认证缺陷

- - BlogJava-首页技术区
转载请注明出处:  http://www.blogjava.net/zh-weir/archive/2013/09/08/403829.html. 新浪微博Android客户端SSO授权认证缺陷. 从最近几年开始,做平台的公司都流行起Open API. 这是一个非常好的理念,也受到广大开发者的欢迎.

新浪微博SSO授权以及分享(实战)

- - CSDN博客推荐文章
很多人不会使用第三方应用,特写此篇使用下第三方应用:代码具体如下:. // 应用的key 请到官方申请正式的appkey替换APP_KEY. // 替换为开发者REDIRECT_URL. // 新支持scope:支持传入多个scope权限,用逗号分隔. /** 显示认证后的信息,如AccessToken */.

小心授权你的新浪微博

- Ehaagwlke - 心弦 | blog
新浪微博上的“随手拍解救大龄女青年”出来有一段时间了,粉丝为数众多,也有了一定的社会影响力. 开始的时候我觉得这是挺好的一件事儿. 这个微博的主人不仅在微博上热心公益事业,还特意做了一个网站,把所有想要被“解救”的姑娘的信息汇总,让大家可以按照各种条件查找,然后查看她们的详细资料. 可是后来我无意中发现一个问题:这个网站在竭尽全力地获得其访问者的新浪微博账户的授权.

Growth Hacker 奇技淫巧一则:零授权,抓取新浪微博任何用户的微博内容

- - XDash Weblog 范冰
有时或基于以下凡此种种需求,我们会想要去抓取新浪微博的内容:. 产品冷启动,导入外部数据,而非从头积累;. 通过大数据+语义分析获取用户兴趣行为偏好,提供智能推荐;. 监控微博舆情,对特定关键词或是用户行为进行响应;etc. 想必新浪深知微博内容本身是最其有价值的资产,一旦被竞争对手大批量抓取导入,则辛苦建立起的门槛将瞬间化作他人之嫁衣,因此做了非常繁复的安全保护,包括强制登录跳转认证、跨域检测、cookie 植入、禁止账号密码登录而启用 OAuth2.0 等等.

基于jasig的sso

- - 企业架构 - ITeye博客
整体的结构就是cas+shiro实现单点登录和权限管理. 怎么安装就不说了网上一大堆,在这总结一些问题的处理方法. 未能够识别目标'ST-2-jEo1qANhs9HgZ7VKC5Hf-cas'票根. 原因:是由于客户端应用web.xml配置中的casServerLoginUrl和casServerUrlPrefix两个URL属性的域名与证书中定义的不一致,或者你的地址配置的不对,配置serverUrl就到cas配置serviceUrl就到端口号.

SSO单点登陆

- - 行业应用 - ITeye博客
单点登录(Single Sign On, SSO)是企业应用集成中最常见的需求. 异构系统间往往都有各自的用户管理和身份验证机制,为. 避免用户在进行系统切换时频繁输入用户名和密码,因此必须要实现单点登录. 说到SSO的原理,先得说一般Web应用的身份验证原理. Web身份验证之所以能成为问题主要在于HTTP协议的无状态性,这导.

围攻新浪微博

- Jos - 望月的博客
在国内的门户微博中,新浪微博无疑是目前用户数量最多、媒体属性最强的,但是,最近,却连续看到一些互联网的知名人士高调宣布退出或者关闭新浪微博的博文,使用和不使用某个产品本就是个人的自由,但如此高调的宣布,并进行口诛笔伐,就值得关注了. 本文试图通过分析谷奥事件,宋石男和贾葭两位老师离开新浪微博的事件分析新浪微博的是与非.

新浪微博连接 2.3

- leeking001 - 我爱水煮鱼
新浪微博连接是我使用新浪微博 API 接口开发的一个 WordPress 插件,它的主要功能是能让用户使用新浪微博账号登陆 WordPress 博客,并且可以直接使用新浪微博的头像,同步博客日志到 WordPress 博客. 经过几天的测试,新浪微博连接插件升级到 2.3,主要修正:同步博客到新浪微博的问题,并且同步内容更为丰富,规则改为:【日志标题】+ 日志内容摘要 + 日志链接.

新浪微博n大傻

- suki - broom&#39;s blog
看不到follow的人之间的交互这类产品本身的问题就不提了,就说说用户行为的傻. 其中有些行为也是产品本身纵容的. 三天两头换id的,搞个巨长的id既占字数又让别人压根没法手动@的,带个公司前缀的,用流行语的. 完全没有网络时代id就是个人身份的概念,意识还停留在QQ时代,以为随便改昵称呢. 某些专门发垃圾小段子的帐号尤甚.