zoukankan      html  css  js  c++  java
  • android开发学习——facebook第三方登录,看了你不会后悔

    给APP用原生android进行facebook第三方登录。

    我们做一件事情,首先得了解其原理,这样才不会迷茫,才知道自己做到什么程度了,心里才会有底。

    所以,第一步,了解第三方登录的原理:下面贴一些帮助我们理解的图,无论什么形式,自己理解了就好了

    http://blog.csdn.net/Yester_Sun/article/details/52353604    (可以参考)

    http://www.jikexueyuan.com/course/1742_1.html?ss=2   (教程视频)

    ● 获取code值:https://www.facebook.com/dialog/oauth?client_id=应用编号&redirect_uri=回调地址&code=,这时在地址栏上会出现一长串code
    ● 获取access_token:https://graph.facebook.com/oauth/access_token?client_id=应用编号&redirect_uri=回调地址&client_secret=应用密钥&code=刚才获取到的code
    ● 获取用户资料:https://graph.facebook.com/me?access_token=刚才获取到的access_token,得到用户的id和name

    第二步,第三方登录开发的流程:                       

    1.注册一个facebook平台账号,需要翻墙。这个用我们平时的登录账号就可以。

    2.申请成为开发者。

    3.创建应用。主要获取appId 和 appSecret

    4.设置回调的url。

     

    5.开发 & 测试

    快速启动 选择平台-android ,有我们需要的开发的步骤,大家自己进入官网进行操作。

    *******************************************************************************************
     

    其中有几点需要注意:(  这些是我在做的时候,花了好久才搞明白的问题。)

    • 添加keyhash:当你在用手机测试的时候如果手机装了FaceBook是登录出错的,测试的时候用的是debug.apk,注册应用时keyhash配置的release.apk,他们keyhash值不一样,测试只能网页登录。

                意思是  如果我们用debug.apk,keyhash也要用debug的,用release.apk,kehash也要用release的。

                添加keyhash---让facebook分辨你的app是不是当初设定的那个app,要符合才对facebook进行存取。

                release版本的keyhash: http://blog.csdn.net/u010838555/article/details/39851863  前提是安装openssl,此链接里面有安装步骤。

               C:Userslemon>keytool -exportcert -alias 'key' -keystore E: estas_key.jks |C:opensslinopenssl.exe sha1 -binary | C:opensslinopenssl.exe base64

               

                debug版本的keyhash

               C:Userslemon>keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%.androiddebug.keystore | C:opensslinopenssl.exe sha1 -binary |C:opensslinopenssl.exe base64

                注意:  -keystore 后边是自己的debug.keystore的路径;openssl.exe也是自己安装的路径,密码都是 android.

    **************************************************************************************************

    • 单点登录 SSO : 参考 http://wiki.mob.com/single-sign-on-sso/

      新浪微博、腾讯微博、QQ空间、人人网、Facebook和Dropbox已经提供了Single Sign-On(SSO)的授权方式。就是利用这些平台的手机客户端来完成授权。由于SSO的授权方式对于用户来说更加便捷,因此各大平台均建议开发者优先使用这一种授权方式。ShareSDK提供SSO的授权实现,并且默认情况下是使用的。但是如果您想关闭SSO功能,可以调用类似于下面的代码来关闭:

      Platform facebook = ShareSDK.getPlatform(Facebook.NAME);
      facebook.SSOSetting(true); // true表示不使用SSO方式授权
      facebook.setPlatformActionListener(paListener);
      facebook.authorize();

      为方法SSOSetting传递参数true,表示不使用SSO方式授权。

              keyhash 是开启SSO授权的时候才需要填的选项,facebook审核需要开启sso授权才可以通过。

    **********************************************************************************************************************

    1. LoginManager-初始化登陆进程并请求权限
    2. LoginButton-这个组件包装在LoginManager,当点击这个button的时候,登陆进程就会初始化(拥有了权限),同时,button会跟踪登陆状态,并根据用户的登录状态展示对应的文档信息。
    3. CallbackManager-用于回掉FaceBookSDK并注册你的回掉,你应该在你的初始化Activity或者fragment的OnActivityResult中回掉。
    4. Access Token-使用此类图形的API请求,它展示了 user id,以及拒绝和接收的权限
    5. Profile-这个类拥有登陆用户的基本信息

     **********************************************************************************************************************

                  在实际的项目开发中,  不会只是登录成功就完事了,还会将登陆成功之后,facebook返回给我们的唯一的id号注册到我们的后台,我是这样做的:

      在清单文件中:

    <meta-data android:name="com.facebook.sdk.ApplicationId"
                android:value="@string/facebook_app_id"/>
    <activity android:name="com.facebook.FacebookActivity"
                android:exported="true"
                android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
                android:label="@string/app_name" />

    在布局文件中:

    <!--faceook登录官网的按钮-->
     <com.facebook.login.widget.LoginButton
                        android:id="@+id/login_facebookbutton"
                        android:layout_width="match_parent"
                        android:layout_height="40dp"
                        android:layout_marginLeft="10dp"
                        android:layout_marginRight="10dp"
                        android:layout_marginTop="5dp"
                        android:textSize="@dimen/text_size_5" />
    有时候我们不需要官网提供给我们的按钮,需要自定义
    <!--faceook登录的自定义按钮-->
     <Button
                        android:id="@+id/login_facebookbutton"
                        android:layout_width="match_parent"
                        android:layout_height="40dp"
                        android:layout_marginTop="2dp"
                        android:text="facebook登录"
                        android:textColor="@color/white"
                        android:textStyle="bold"
                        />

    在activity中:

    private CallbackManager callbackManager;
    
     @Override
        protected void onCreate(Bundle savedInstanceState) {
            setContentView(R.layout.activity_login1);
            FacebookSdk.sdkInitialize(getApplicationContext(),10000);//10000-RequestCode
           //注册callback
            callbackManager = CallbackManager.Factory.create();
    //官网定义fb按钮的做法 LoginButton loginButton
    = (LoginButton) findViewById(R.id.login_facebookbutton); loginButton.setReadPermissions(Arrays.asList("public_profile", "email", "user_friends"));
    loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>
    () {

    //用户自定义fb按钮的做法
            LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
    //为了响应登录结果,您需要使用 LoginButton 注册回调.
                //如果登录成功,LoginResult 参数将拥有新的 AccessToken 及最新授予或拒绝的权限。
                @Override
                public void onSuccess(final LoginResult loginResult) {
                   
                    GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(),
                            new GraphRequest.GraphJSONObjectCallback() {
                                @Override
                                public void onCompleted(JSONObject object, GraphResponse response) {
                                    if (object != null) {
                                        email = object.optString("email");
                                        firstname = object.optString("first_name");
                                        lastname = object.optString("last_name");
                                        Log.e("log", "LoginActivity - email----" + email);
                                        Log.e("log", "LoginActivity - getLoginInfo::---" + object.toString());
    
                                        AccessToken accessToken = loginResult.getAccessToken();
                                        fbuserId = accessToken.getUserId();
                                        String token = accessToken.getToken();
                                        Log.e("log", "LoginActivity - accessToken:::" + accessToken);
                                        Log.e("log", "LoginActivity - userid:::" + fbuserId);
    
                                        if (accessToken != null) {
                                            //如果登录成功,跳转到登录成功界面,拿到facebook返回的email/userid等值,在我们后台进行操作
                                       
                                           // FbLogin();
                                        }
                                    }
                                }
                            });
    
                    Bundle parameters = new Bundle();
                    parameters.putString("fields", "id,name,link,gender,birthday,email,picture,locale," +
                            "updated_time,timezone,age_range,first_name,last_name");
                    request.setParameters(parameters);
                    request.executeAsync();
                }
    
                @Override
                public void onCancel() {
                    //  Toast.makeText(LoginActivity.this, "facebook_account_oauth_Cancel", Toast.LENGTH_SHORT).show();
                }
    
                @Override
                public void onError(FacebookException e) {
                    // Toast.makeText(LoginActivity.this, "facebook_account_oauth_Error", Toast.LENGTH_SHORT).show();
    
                }
            });
        }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {

    case 10000:
    if (callbackManager != null) {
    //在用户成功授权之后,回调onActivityResult(),需要重写 onActivityResult()
    callbackManager.onActivityResult(requestCode, resultCode, data);
    }
    break;
    }

    //自定义fb按钮,在你代码的正确地方
    btn_fb = (Button) findViewById(R.id.login_facebookbutton);
    btn_fb.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    LoginManager.getInstance()
    .logInWithReadPermissions(LoginActivity.this,
    Arrays.asList("public_profile", "user_friends","email"));
    }
    });
    }

     代码在项目已用,可用。

     
  • 相关阅读:
    CodeForces 219D Choosing Capital for Treeland (树形DP)
    POJ 3162 Walking Race (树的直径,单调队列)
    POJ 2152 Fire (树形DP,经典)
    POJ 1741 Tree (树的分治,树的重心)
    POJ 1655 Balancing Act (树的重心,常规)
    HDU 2196 Computer (树形DP)
    HDU 1520 Anniversary party (树形DP,入门)
    寒门子弟
    JQuery选择器(转)
    (四)Web应用开发---系统架构图
  • 原文地址:https://www.cnblogs.com/mengxiao/p/7612301.html
Copyright © 2011-2022 走看看