如何使新浪微博支持SSO授权

如题所述

    sso授权,指的是通过一键点击的简单方式唤起微博客户端行为的授权的方式,因为操作简单,所以作为很多应用的第三方登录的选择。

    新浪微博

    下载官方的SDK,在里面有实例和MD5的签名工具。
    官方SDK
    在里面的签名工具,根据你输入的包名来得到MD5值,你需要这个值来正确的创建应用。
    在里面的还有weiboSDK,你需要把它加入你的应用中,引用其中的方法。

    在清单中加入访问网络的权限

    需要在新浪的开放平台创建应用。

创建应用吧!

定义授权参数的接口:
(老实说,我是直接copy的demo,改为自己的授权信息就可以了)。

[html] view plaincopyprint?
public interface Constants { 

/** 当前 DEMO 应用的 APP_KEY,第三方应用应该使用自己的 APP_KEY 替换该 APP_KEY */ 
public static final String APP_KEY = "1608434710"; 

public static final String REDIRECT_URL = "http://www.sina.com"; 

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"; 


缓存授权信息:

[html] view plaincopyprint?
/** 
* 该类定义了微博授权时所需要的参数。 
*/ 
public class AccessTokenKeeper { 
private static final String PREFERENCES_NAME = "com_weibo_sdk_android"; 
private static final String KEY_UID = "uid"; 
private static final String KEY_ACCESS_TOKEN = "access_token"; 
private static final String KEY_EXPIRES_IN = "expires_in"; 

/** 
* 保存 Token 对象到 SharedPreferences。 

* @param context 应用程序上下文环境 
* @param token Token 对象 
*/ 
public static void writeAccessToken(Context context, Oauth2AccessToken token) { 
if (null == context || null == token) { 
return; 


SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND); 
Editor editor = pref.edit(); 
editor.putString(KEY_UID, token.getUid()); 
editor.putString(KEY_ACCESS_TOKEN, token.getToken()); 
editor.putLong(KEY_EXPIRES_IN, token.getExpiresTime()); 
editor.commit(); 


/** 
* 从 SharedPreferences 读取 Token 信息。 

* @param context 应用程序上下文环境 

* @return 返回 Token 对象 
*/ 
public static Oauth2AccessToken readAccessToken(Context context) { 
if (null == context) { 
return null; 


Oauth2AccessToken token = new Oauth2AccessToken(); 
SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND); 
token.setUid(pref.getString(KEY_UID, "")); 
token.setToken(pref.getString(KEY_ACCESS_TOKEN, "")); 
token.setExpiresTime(pref.getLong(KEY_EXPIRES_IN, 0)); 
return token; 


/** 
* 清空 SharedPreferences 中 Token信息。 

* @param context 应用程序上下文环境 
*/ 
public static void clear(Context context) { 
if (null == context) { 
return; 


SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND); 
Editor editor = pref.edit(); 
editor.clear(); 
editor.commit(); 



集成的sso授权 +获取用户名:

[html] view plaincopyprint?
/** 
* 该类主要演示如何进行授权、SSO登陆。 
*/ 
public class WBAuthActivity extends Activity implements OnClickListener { 
/** 显示认证后的信息,如 AccessToken */ 
private TextView mTokenText; 
/** 微博 Web 授权类,提供登陆等功能 */ 
private WeiboAuth mWeiboAuth; 
/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */ 
private Oauth2AccessToken mAccessToken; 
/** 注意:SsoHandler 仅当 SDK 支持 SSO 时有效 */ 
private SsoHandler mSsoHandler; 
/** 用户信息接口 */ 
private UsersAPI mUsersAPI; 
private Button ssoBtn; 

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


public void initView() { 
mTokenText = (TextView) findViewById(R.id.tv_txt); 
// SSO 授权 
ssoBtn = (Button) findViewById(R.id.btn_sso); 

// 创建微博实例 
mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY, 
Constants.REDIRECT_URL, Constants.SCOPE); 
// 从 SharedPreferences 中读取上次已保存好 AccessToken 等信息, 
// 第一次启动本应用,AccessToken 不可用 
mAccessToken = AccessTokenKeeper.readAccessToken(this); 

if (mAccessToken.isSessionValid()) { 
updateTokenView(true); 

ssoBtn.setOnClickListener(this); 


/** 
* 当 SSO 授权 Activity 退出时,该函数被调用。 
*/ 
@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); 



/** 
* 微博认证授权回调类。 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用 
* {@link SsoHandler#authorizeCallBack} 后, 该回调才会被执行。 2. 非 SSO 
* 授权时,当授权结束后,该回调就会被执行。 当授权成功后,请保存该 access_token、expires_in、uid 等信息到 
* SharedPreferences 中。 
*/ 
class AuthListener implements WeiboAuthListener { 
// 授权完成 
@Override 
public void onComplete(Bundle values) { 
// 从 Bundle 中解析 Token 
mAccessToken = Oauth2AccessToken.parseAccessToken(values); 
if (mAccessToken.isSessionValid()) { 
// 显示 Token 
updateTokenView(false); 

// 保存 Token 到 SharedPreferences 
AccessTokenKeeper.writeAccessToken(WBAuthActivity.this, 
mAccessToken); 
Toast.makeText(WBAuthActivity.this, "success!!", 
Toast.LENGTH_SHORT).show(); 

// 根据uid 获取用户的昵称,因为uid是在回调方法从服务器传递过来的数据中。 
long uid = Long.parseLong(mAccessToken.getUid()); 
mUsersAPI.show(uid, mListener); 
} else { 
// 以下几种情况,您会收到 Code: 
// 1. 当您未在平台上注册的应用程序的包名与签名时; 
// 2. 当您注册的应用程序包名与签名不正确时; 
// 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。 
Toast.makeText(WBAuthActivity.this, "fail", Toast.LENGTH_LONG) 
.show(); 



// 取消授权 
@Override 
public void onCancel() { 
Toast.makeText(WBAuthActivity.this, "cancel", Toast.LENGTH_LONG) 
.show(); 


// 授权异常 
@Override 
public void onWeiboException(WeiboException e) { 
Toast.makeText(WBAuthActivity.this, 
"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG) 
.show(); 



/** 
* 显示当前 Token 信息。 配置文件中是否已存在 token 信息并且合法 
*/ 
public void updateTokenView(boolean hasExisted) { 
// 获取用户信息接口 
mUsersAPI = new UsersAPI(mAccessToken); 

String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss") 
.format(new java.util.Date(mAccessToken.getExpiresTime())); 
String format = getString(R.string.weibosdk_demo_token_to_string_format_1); 
mTokenText 
.setText(String.format(format, mAccessToken.getToken(), date)); 
String message = String.format(format, mAccessToken.getToken(), date); 
if (hasExisted) { 
message = getString(R.string.weibosdk_demo_token_has_existed) 
+ "\n" + message; 
// 根据uid 获取用户的昵称,因为uid是在回调方法从服务器传递过来的数据中。 
long uid = Long.parseLong(mAccessToken.getUid()); 
mUsersAPI.show(uid, mListener); 

mTokenText.setText(message); 


/** 
* 微博 OpenAPI 回调接口。 
*/ 
private RequestListener mListener = new RequestListener() { 
@Override 
public void onComplete(String response) { 
if (!TextUtils.isEmpty(response)) { 
// 调用 User#parse 将JSON串解析成User对象 
User user = User.parse(response); 
if (user != null) { 
Toast.makeText(WBAuthActivity.this, 
"获取User信息成功,用户昵称:" + user.screen_name, 
Toast.LENGTH_LONG).show(); 
mTokenText.setText(user.screen_name); 
} else { 
Toast.makeText(WBAuthActivity.this, response, 
Toast.LENGTH_LONG).show(); 




@Override 
public void onWeiboException(WeiboException e) { 
ErrorInfo info = ErrorInfo.parse(e.getMessage()); 
Toast.makeText(WBAuthActivity.this, info.toString(), 
Toast.LENGTH_LONG).show(); 

}; 

@Override 
public void onClick(View v) { 
// TODO Auto-generated method stub 
if (v == ssoBtn) { 
mSsoHandler = new SsoHandler(WBAuthActivity.this, mWeiboAuth); 
mSsoHandler.authorize(new AuthListener()); 




布局:

[html] view plaincopyprint?
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<com.sina.weibo.sdk.widget.LoginButton 
android:id="@+id/btn_sso" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_marginLeft="10dp" /> 

<TextView 
android:id="@+id/tv_txt" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="info" /> 

</LinearLayout>

4.当然,想使用这个功能,首先得有本地客户端,否则的话,会使用web的授权方式,慢慢的输入账户和密码来获取授权。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-02-20
添加URL scheme,在你的工程设置项,targets 一栏下,选中自己的 target,在 Info->URL Types 中添加 URL Schemes,此值是 sso 登录时回调时所用。如果使用的是Xcode3或更低版本,则需要在plist文件中添加。如果你使用我们默认的新浪微博账号的话,将url scheme修改为“sinaweibosso.126663232”,否则是“sinaweibosso.你的新浪微博appkey”
在你的`AppDelegate`文件里面`#import "UMSocialSnsService.h"`并实现下面的方法:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
{
// 如果你除了使用我们sdk之外还要处理另外的url,你可以把`handleOpenURL:wxApiDelegate:`的实现复制到你的代码里面,再添加你要处理的url。
return [UMSocialSnsService handleOpenURL:url wxApiDelegate:nil];
}本回答被提问者采纳
相似回答