码迷,mamicode.com
首页 > 其他好文 > 详细

OAuth2认证介绍

时间:2015-04-19 19:31:03      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:oauth2

1.OAuth2认证简介
(1)OAuth2认证原理图:
技术分享

2)简介:OAuth2(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

(3)为什么使用OAuth2认证:防止第三方应用获得用户名和密码,在网页中完成认证。另外
使用https请求,防止抓包泄密。即使抓包获得了用户和密码,也是经过加密的,很难破解。
通过OAuth2认证最终可以获得token,然后通过token可以调用第三方平台提供的接口,实现需要的功能。
但若token保存在本地的话,需要加密,防止被窃取,泄露用户信息。

2.OAuth2认证的实际应用

获得新浪微博授权认证的流程:

(1)在新浪开放平台上创建应用,获得appkey、appsecret和回调地址
(2)在测试机上安装MD5签名生成工具 生成md5密钥 或在eclipse preference->build中查看当前keystore文件的md5值
并在开放平台的应用中填写
(3)如果应用未审核通过, 需要在开放平台测试信息里添加测试帐号, 只有测试帐号才能成功访问接口

新浪微博OAuth2认证 实现发微博功能代码:
主类:

public class MainActivity extends Activity {
    private int SEND_WEIBO=1;
    /** 注意:SsoHandler 仅当 SDK 支持 SSO 时有效 */
    private SsoHandler mSsoHandler;
    /** 微博 Web 授权类,提供登陆等功能 */
    private WeiboAuth mWeiboAuth;
    /** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */
    private Oauth2AccessToken mAccessToken;

    private HttpUtils httpUtils=new HttpUtils();


    private Handler handler=new Handler(){

        public void handleMessage(android.os.Message msg) {

            if(msg.what==SEND_WEIBO)
            {
                RequestCallBack<String> callBack=new RequestCallBack<String>() {

                    @Override
                    public void onSuccess(ResponseInfo<String> responseInfo) {
                        // TODO Auto-generated method stub
                        Toast.makeText(MainActivity.this, "发微博成功", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onFailure(HttpException error, String msg) {

                        Toast.makeText(MainActivity.this, "发微博失败", Toast.LENGTH_SHORT).show();

                    }
                };
                try {
                    InputStream is=getAssets().open("a.jpg");

                    File file=new File(Environment.getExternalStorageDirectory()+"/a.jpg");
                    if(!file.exists())
                    {
                        file.createNewFile();
                    }
                    FileOutputStream out=new FileOutputStream(file);
                    byte []buffer=new byte[1024];
                    int len=0;
                    while( (len=is.read(buffer)) !=-1)
                    {
                        out.write(buffer, 0, len);
                    }
                    out.close();
                    is.close();
                    if(file!=null && file.length()>0)
                    {

                        RequestParams params=new RequestParams();
                        params.addBodyParameter("status", "测试用例");
                        params.addBodyParameter("source", "3680529134");
                        params.addBodyParameter("access_token", mAccessToken.getToken());
                        params.addBodyParameter("pic", file);


                        httpUtils.configTimeout(3000);
                        httpUtils.send(HttpMethod.POST, "https://upload.api.weibo.com/2/statuses/upload.json", params, callBack);

                    }

                } catch (IOException e) {

                    e.printStackTrace();
                }
//              httpUtils.configTimeout(3000);
                //httpUtils.send(HttpMethod.POST, "https://upload.api.weibo.com/2/statuses/upload.json", params, callBack);

            }

        };

    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 创建微博实例
        mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY,
                Constants.REDIRECT_URL, Constants.SCOPE);
        Button btnLogin = (Button) findViewById(R.id.btn_sso);
        btnLogin.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mSsoHandler = new SsoHandler(MainActivity.this, mWeiboAuth);
                mSsoHandler.authorize(new AuthListener());
            }
        });
    }
    /**
     * 当 SSO 授权 Activity 退出时,该函数被调用。
     * 
     * @see {@link Activity#onActivityResult}
     */
    @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);
            Toast.makeText(this, "认证 成功"+mAccessToken.getToken(), Toast.LENGTH_SHORT).show();
            handler.sendEmptyMessage(SEND_WEIBO);


        }
    }
    /**
     * 微博认证授权回调类。 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
                Log.d("Test", "token=" + mAccessToken.getToken());
            }
        }
        @Override
        public void onCancel() {
            Toast.makeText(MainActivity.this, "认证取消", Toast.LENGTH_LONG).show();
        }
        @Override
        public void onWeiboException(WeiboException e) {
            Toast.makeText(MainActivity.this,
                    "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG)
                    .show();
        }
    }
}

项目下载地址:
http://download.csdn.net/detail/aehaojiu/8609659
需要用到xUtils开源项目:
http://download.csdn.net/detail/aehaojiu/8610323

OAuth2认证介绍

标签:oauth2

原文地址:http://blog.csdn.net/aehaojiu/article/details/45131379

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!