Android三方登录之新浪微博登录

移动端需要尽可能的去减少用户的操作,拿登录来说,使用第三方登录一键登录自然在一定程度上优于传统的短信验证码。

那么集成新浪微博的一键登录需要哪些步骤呢?


1.在新浪后台注册应用,拿到关键ID。


2.集成代码

public class WBAuthActivity extends Activity {

    private static final String TAG = "weibosdk";
    /**
     * 显示认证后的信息,如 AccessToken
     */
    private TextView mTokenText;
    /**
     * 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能
     */
    private Oauth2AccessToken mAccessToken;
    /**
     * 注意:SsoHandler 仅当 SDK 支持 SSO 时有效
     */
    private SsoHandler mSsoHandler;

    /**
     * @see {@link Activity#onCreate}
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_auth);

        // 获取 Token View,并让提示 View 的内容可滚动(小屏幕可能显示不全)
        mTokenText = (TextView) findViewById(R.id.token_text_view);
        TextView hintView = (TextView) findViewById(R.id.obtain_token_hint);
        hintView.setMovementMethod(new ScrollingMovementMethod());
        // 创建微博实例


        mSsoHandler = new SsoHandler(WBAuthActivity.this);


        // SSO 授权, 仅客户端
        findViewById(R.id.obtain_token_via_sso).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mSsoHandler.authorizeClientSso(new SelfWbAuthListener());
            }
        });

        // SSO 授权, 仅Web
        findViewById(R.id.obtain_token_via_web).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mSsoHandler.authorizeWeb(new SelfWbAuthListener());
            }
        });

        // SSO 授权, ALL IN ONE   如果手机安装了微博客户端则使用客户端授权,没有则进行网页授权
        findViewById(R.id.obtain_token_via_signature).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mSsoHandler.authorize(new SelfWbAuthListener());
            }
        });

        // 用户登出
        findViewById(R.id.logout).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                AccessTokenKeeper.clear(getApplicationContext());
                mAccessToken = new Oauth2AccessToken();
                updateTokenView(false);
            }
        });

        //更新token
        findViewById(R.id.refresh).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!TextUtils.isEmpty(mAccessToken.getRefreshToken())) {
                    AccessTokenKeeper.refreshToken(Constants.APP_KEY, WBAuthActivity.this, new RequestListener() {
                        @Override
                        public void onComplete(String response) {

                        }

                        @Override
                        public void onWeiboException(WeiboException e) {

                        }
                    });
                }
            }
        });

        // 从 SharedPreferences 中读取上次已保存好 AccessToken 等信息,
        // 第一次启动本应用,AccessToken 不可用
        mAccessToken = AccessTokenKeeper.readAccessToken(this);
        if (mAccessToken.isSessionValid()) {
            updateTokenView(true);
        }
    }

    /**
     * 当 SSO 授权 Activity 退出时,该函数被调用。
     *
     * @see {@link Activity#onActivityResult}
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

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

    }


    private class SelfWbAuthListener implements com.sina.weibo.sdk.auth.WbAuthListener {
        @Override
        public void onSuccess(final Oauth2AccessToken token) {
            WBAuthActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mAccessToken = token;
                    if (mAccessToken.isSessionValid()) {
                        // 显示 Token
                        updateTokenView(false);
                        // 保存 Token 到 SharedPreferences
                        AccessTokenKeeper.writeAccessToken(WBAuthActivity.this, mAccessToken);
                        Toast.makeText(WBAuthActivity.this,
                                R.string.weibosdk_demo_toast_auth_success, Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }

        @Override
        public void cancel() {
            Toast.makeText(WBAuthActivity.this,
                    R.string.weibosdk_demo_toast_auth_canceled, Toast.LENGTH_LONG).show();
        }

        @Override
        public void onFailure(WbConnectErrorMessage errorMessage) {
            Toast.makeText(WBAuthActivity.this, errorMessage.getErrorMessage(), Toast.LENGTH_LONG).show();
        }
    }

    /**
     * 显示当前 Token 信息。
     *
     * @param hasExisted 配置文件中是否已存在 token 信息并且合法
     */
    private void updateTokenView(boolean hasExisted) {
        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;
        }
        mTokenText.setText(message);
    }
}
这里引用的官方demo,讲的很详细,不要忘记在清单文件里的配置及jniLibs的添加。


3.可能遇到的问题

在集成过程中,可能遇到一个问题便是没有返回,点击只闪一下的情况,这个情况是签名校验的问题,需要在官方下载一个MD5签名生成器,然后把签过名的app装载之后,打开签名生成器,获取到的值填到新浪后台,就可以解决这个问题了,在这里注意debug和release签名不同的情况,怕麻烦可以让debug和release使用同样的签名。

可以使用第三方库requests和BeautifulSoup来实现微博三方登录。以下是一个简单的示例代码: ```python import requests from bs4 import BeautifulSoup # 登录页面的URL login_url = 'https://passport.weibo.com/visitor/visitor' # 构造请求头 headers = { 'User-Agent': 'Mozilla/5. (Windows NT 10.; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58..3029.110 Safari/537.3', 'Referer': 'https://weibo.com/' } # 构造请求参数 params = { 'entry': 'mweibo', 'r': '', 'returntype': 'TEXT', 'url': 'https://weibo.com/', 'prelt': '115', 'ticket': '', 'sudaref': '', 'su': '', 'service': 'miniblog', 'sp': '', 'sr': '192*108', 'encoding': 'UTF-8', 'cdult': '3', 'domain': 'weibo.com', 'pwencode': 'rsa2', 'gateway': '1', 'savestate': '7', 'qrcode_flag': 'false', 'useticket': '1' } # 发送GET请求,获取登录页面 response = requests.get(login_url, headers=headers, params=params) # 解析页面,获取登录所需的参数 soup = BeautifulSoup(response.text, 'html.parser') vk = soup.find('input', attrs={'name': 'vk'})['value'] password_rsa = soup.find('input', attrs={'name': 'password_'}).get('value', '') servertime = soup.find('input', attrs={'name': 'servertime'})['value'] nonce = soup.find('input', attrs={'name': 'nonce'})['value'] rsakv = soup.find('input', attrs={'name': 'rsakv'})['value'] # 构造POST请求参数 post_data = { 'entry': 'mweibo', 'gateway': '1', 'from': '', 'savestate': '7', 'qrcode_flag': 'false', 'useticket': '1', 'pagerefer': '', 'vsnf': '1', 'su': '', 'service': 'miniblog', 'servertime': '', 'nonce': '', 'pwencode': 'rsa2', 'rsakv': '', 'sp': '', 'sr': '192*108', 'encoding': 'UTF-8', 'prelt': '115', 'url': 'https://weibo.com/', 'returntype': 'TEXT' } # 输入微博账号和密码 username = input('请输入微博账号:') password = input('请输入微博密码:') # 对密码进行加密 import rsa import base64 pubkey = '-----BEGIN PUBLIC KEY-----\n' \ 'MIGfMAGCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzv+Zv8zZJzRZ1jJZp9X9vL8fN\n' \ '3yqfZvz8dJWR+1JZzgX9vz8J8WQ2Qz7yq3J2vH8hWJZgJrZJzTYsJ8eB9yJg5y\n' \ 'Mv8GwZg5JZzJZzJZzJZzJZzJZzJZzJZzJZzJZzJZzJZzJZzJZzJZzJZzJZzJZz\n' \ 'JZzJZzJZzJZzJZzJZzJZwIDAQAB\n' \ '-----END PUBLIC KEY-----' key = rsa.PublicKey.load_pkcs1_openssl_pem(pubkey.encode()) password = password.encode('utf-8') password = rsa.encrypt(password, key) password = base64.b64encode(password).decode('utf-8') # 更新POST请求参数 post_data.update({ 'su': base64.b64encode(username.encode('utf-8')).decode('utf-8'), 'sp': password, 'servertime': servertime, 'nonce': nonce, 'rsakv': rsakv }) # 发送POST请求,进行登录 response = requests.post(login_url, headers=headers, params=params, data=post_data) # 输出登录结果 if response.status_code == 200: if 'retcode=' in response.text: print('登录成功!') else: print('登录失败!') else: print('请求失败!') ``` 注意:以上代码仅供学习参考,实际使用中需要根据具体情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值