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çæææ¹å¼ï¼æ ¢æ ¢çè¾å ¥è´¦æ·åå¯ç æ¥è·åææã