• 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"));
    }
    });
    }

     代码在项目已用,可用。

     
  • 相关阅读:
    ci中使用smarty
    php curl用法
    百万级访问网站前期的技术准备
    enctype="multipart/formdata" 文件上传
    【转】lnmp配置记录
    ActionScript实现两直线相交弧跨越算法
    Adobe Flex迷你教程 — ActionScript实现二维向量运算
    U盘启动安装Linux(转)
    Adobe Flex迷你教程 — 实现类似新浪微博评论消息容器
    Adobe Flex迷你教程 — 让Graphics的线响应事件。
  • 原文地址:https://www.cnblogs.com/mengxiao/p/7612301.html
Copyright © 2020-2023  润新知