利用FaceBook实现第三方登陆(自定义登陆按钮,非官方按钮)并获取用户数据

最近公司要写集成登陆SDK,具体集成那些我就不说了,其中就包含需要使用facebook登陆自己的app,于是我苦心研究facebook,写完后发现各种问题,对于问题我当然去查阅官方文档看怎么解决,结果一查,我的天,SDK更新了,以前是两种方式loginButton和UserSettingsFragment,而对于两种方式来说都不适合我,因为我要写sdk供别人使用,所以别人要用那种登陆按钮需要用户自己定义,而不是用facebook自己的。对于两种方式来说,由于第二种不需要开发者参与,布局按钮都是facebook提供的,所以我采用参考第一种。现在facebook更新了,第一种还是loginbutton,但是调用方法步骤上不同了,而第二种变为loginManager了,今天我还是采用第一种详细介绍如何使用facebook实现第三方登陆。

1,我们先看看使用前需要做什么:具体步骤可以参考官方文档:https://developers.facebook.com/docs/androidlocale=zh_CN,(下载SDK)

https://developers.facebook.com/docs/android?locale=zh_CN#!/docs/android/getting-started/

1点击页面的quick start for android 然后输入框输入你要创建的应用名称  然后下载sdk

2安装facebook应用(装不装其实取决于自己,装上登陆的时候会跳到应用的登陆界面,不装会跳转到webview的登陆界面)

3.引入sdk.官方用的是android studio.我用的是eclipse.导入sdk,作为引用库引入。不会的可以自己百度

4填写你应用的包名和默认启动的activity

5添加Key Hashes,Key
Hashes分为开发和发布两种。具体生成方法请看下面

首先你需要安装openssl,不然你是无法生成的,装了cygwin的也可以

windows执行下面的命令:先要进入ssl的安装目录

keytool
-exportcert -alias androiddebugkey -keystore debugkey的路径 | openssl sha1 -binary | openssl

base64

mac执行下面的命令:

keytool
-exportcert -alias androiddebugkey -keystore
debugkey的路径 | openssl sha1 -binary | openssl base64

发布版的替换为自己的证书路径,如果不会可以百度搜索,因为重点不是将这个,所以需要的可以自行百度

6跟踪app打开和安装,直接可以过,如果需要做用户行为记录的可以阅读一下。

7完成。

做完上面的准备,我们就可以开始了,至于appid,可以登陆facebook账号在刚才建立的应用名字哪里就可以看到

如果需要验证是否成功,可以在刚才设置的那个activiy里加上这段代码,运行后可以打印出你设置的key hashes

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Add code to print out the key hash
    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                "com.facebook.samples.hellofacebook",
                PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
    } catch (NameNotFoundException e) {

    } catch (NoSuchAlgorithmException e) {

    }

    ...

接下来我们看官方的指引

Facebook Login for Android

The Facebook SDK for Android enables people to sign into your app with Facebook Login. When people log into your app with Facebook they can grant permissions to your app so you can retrieve information or perform actions on Facebook on their behalf.

To read more Facebook login and why use it, see Login Portal.

There are two ways to implement Facebook login on Android:

  • LoginButton class - Which provides a button you can add to your UI. It follows the current access token and can log people in
    and out.
  • LoginManager class - To initiate login without using a UI element.

For information on permissions, see Managing Permissions, Android.

大概意思是说实现使用facebook登陆的两种实现方式

Prerequisites

Before you implement Facebook Login you need:

意思是说要实现功能,上面列出的是必要条件

Add Facebook Login

The simplest way to add Facebook Login to your app is to add LoginButton from the SDK. This is a custom view implementation of a Button.
You can use this button in your app to implement Facebook Login.

There are other classes you use to add login to your app. The SDK includes:

  • LoginManager - Initiates the login process with the requested read or publish permissions.
  • LoginButton: - This UI element wraps functionality available in the LoginManager. So when someone clicks on
    the button, the login is initiated with the set permissions. The button follows the login state, and displays the correct text based on someone‘s authentication state.
  • CallbackManager - Use to route calls back to the Facebook SDK and your registered callbacks. You should call it from the initiating activity or fragments onActivityResult call.
  • AccessToken: - Use this class Graph API requests. It shows the user id, and the accepted and denied permissions.
  • Profile - This class has basic information about person logged in.

https://developers.facebook.com/docs/facebook-login/android/v2.3

package com.tibco.integration.login.facebook;

import java.util.Arrays;
import java.util.List;

import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.view.View;

import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.ProfileTracker;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.tibco.integeration.login.listener.LogInStateListener;
import com.tibco.integeration.login.listener.LogOutStateListener;
import com.tibco.integration.login.model.User;

public class FaceBookLoginUtil{
	private  static FaceBookLoginUtil mFaceBookLoginUtil=null;
	private static Activity loginActivity=null;
	private View loginClickView=null;
	private View logOutView=null;
	private  List<String> permissions;
	private  LogInStateListener mBookLoginStateChanged;
	private LogOutStateListener mBookLogOutStateListener;
	private CallbackManager callbackManager;
	private FaceBookCallBackListener callback=new FaceBookCallBackListener();
	private  OnFaceBookLoginClickListener onFaceBookLoginClickListener=new OnFaceBookLoginClickListener();
	private boolean isLogOut=false;
	public static FaceBookLoginUtil getInstance() {
		if(mFaceBookLoginUtil==null){
			mFaceBookLoginUtil=new FaceBookLoginUtil();
		}
		return mFaceBookLoginUtil;
	}
	public  void SetFaceBookLoginActivity(Activity activity){
		if(activity==null){
			throw new  NullPointerException("login activity is null");
		}else{
			loginActivity=activity;
		}
	}

	public  void SetFaceBookLoginButton(View view){
			loginClickView=view;
	}

	public void SetFaceBookLogOutButton(View view){
			logOutView=view;
	}

	public  void SetFaceBookReadPermission(String  array){
		if(array==null){
			permissions=Arrays.asList("public_profile");
		}else{
			permissions=Arrays.asList(array);
		}
	}

	public  void SetOnFaceBookLoginStateListener(LogInStateListener LoginStateChanged){
		if(LoginStateChanged==null){
			throw new NullPointerException("LoginStateListener is null");
		}else{
			mBookLoginStateChanged=LoginStateChanged;
		}
	}

	public void SetOnFaceBookLogOutListener(LogOutStateListener logoutListener){
		mBookLogOutStateListener=logoutListener;
	}

    public void open() {
    	FacebookSdk.sdkInitialize(loginActivity);
		callbackManager = CallbackManager.Factory.create();
		LoginManager.getInstance().registerCallback(callbackManager, callback);
        if(loginClickView!=null){
        	loginClickView.setOnClickListener(onFaceBookLoginClickListener);
        }
        if(logOutView!=null){
        	logOutView.setOnClickListener(new View.OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				LoginManager.getInstance().logOut();
    				isLogOut=true;
    				mBookLogOutStateListener.OnLogOutListener(isLogOut,"facebook");
    			}
    		});
        }
    }
	 public void onActivityResult(int requestCode, int resultCode, Intent data) {
		 callbackManager.onActivityResult(requestCode, resultCode, data);
	 }
	 public void OnDestory(){
		 profileTracker.stopTracking();
	 }

	private class FaceBookCallBackListener implements FacebookCallback<LoginResult>{
			@Override
			public void onSuccess(LoginResult result) {
				fetchUserInfo(result.getAccessToken());
			}
			@Override
			public void onCancel() {
				mBookLoginStateChanged.OnLoginError("user cancle log in facebook!");
			}
			@Override
			public void onError(FacebookException error) {
				mBookLoginStateChanged.OnLoginError(error.getMessage());
			}

		}
    private  class OnFaceBookLoginClickListener implements View.OnClickListener{
		@Override
		public void onClick(View v) {
	    	LoginManager.getInstance().logInWithReadPermissions(loginActivity,permissions);
		}
    }
    private void fetchUserInfo(AccessToken accessToken){
    	GraphRequest request = GraphRequest.newMeRequest(
    	        accessToken,
    	        new GraphRequest.GraphJSONObjectCallback() {
					@Override
					public void onCompleted(JSONObject object,
							GraphResponse response) {
						try{
							if(response.getError()!=null){
								mBookLoginStateChanged.OnLoginError(<span style="font-family: Arial, Helvetica, sans-serif;">response.getError()..getErrorMessage()</span>);
							}else if(response.getConnection().getResponseCode()==200){
								User user=new User();
								user.setEmail(object.getString("email"));
								user.setGender(object.getString("gender"));
								user.setLink(object.getString("link"));
								user.setFirstname(object.getString("first_name"));
								user.setLastname(object.getString("last_name"));
								user.setLocale(object.getString("locale"));
								user.setTimezone(object.getString("timezone"));
								user.setUserId(object.getString("id"));
								user.setUserName(object.getString("name"));
								mBookLoginStateChanged.OnLoginSuccess(user, "facebook");
							}
						}catch(Exception e){
							mBookLoginStateChanged.OnLoginError(e.getMessage());
						}
					}
    	        });
    	request.executeAsync();
    }
}
package com.tibco.integration.login.model;

import java.io.Serializable;

import android.net.Uri;

public class User implements Serializable{

	/**
	 *
	 */
	private static final long serialVersionUID = 1L;
	private  String status;
	private String error_message;
	private String email;
	private String token;
	private String firstname;
	private String lastname;
	private String userId;
	private String tibbrUserId;
	private String userName;
	private String middleName;
	private String link;
	private String birthday;
	private String ProfilePictureUri;
	private String gender;
	private String locale;
	private String timezone;
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	public String getError_message() {
		return error_message;
	}
	public void setError_message(String error_message) {
		this.error_message = error_message;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getToken() {
		return token;
	}
	public void setToken(String token) {
		this.token = token;
	}
	public String getFirstname() {
		return firstname;
	}
	public void setFirstname(String firstname) {
		this.firstname = firstname;
	}
	public String getLastname() {
		return lastname;
	}
	public void setLastname(String lastname) {
		this.lastname = lastname;
	}
	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getTibbrUserId() {
		return tibbrUserId;
	}
	public void setTibbrUserId(String tibbrUserId) {
		this.tibbrUserId = tibbrUserId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getMiddleName() {
		return middleName;
	}
	public void setMiddleName(String middleName) {
		this.middleName = middleName;
	}
	public String getLink() {
		return link;
	}
	public void setLink(String link) {
		this.link = link;
	}
	public String getBirthday() {
		return birthday;
	}
	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}
	public String getProfilePictureUri() {
		return ProfilePictureUri;
	}
	public void setProfilePictureUri(String profilePictureUri) {
		ProfilePictureUri = profilePictureUri;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public String getLocale() {
		return locale;
	}
	public void setLocale(String locale) {
		this.locale = locale;
	}
	public String getTimezone() {
		return timezone;
	}
	public void setTimezone(String timezone) {
		this.timezone = timezone;
	}

}
有了登陆工具类和用户类,接下来就是再次封装了
<pre name="code" class="java">package com.tibco.integration.login.utils;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.view.View;

import com.tibco.integeration.login.listener.LogInStateListener;
import com.tibco.integeration.login.listener.LogOutStateListener;
import com.tibco.integration.login.facebook.FaceBookLoginUtil;
import com.tibco.integration.login.tibbr.TibbrLoginUtil;

public  class LoginManager {
	private static FaceBookLoginUtil fbUtil=null;
	private static TibbrLoginUtil tbutils=null;
	/**
	 * 登陆工具类,
	 *
	 */
	public static void initialize(Context context){
			fbUtil=FaceBookLoginUtil.getInstance();
			tbutils=TibbrLoginUtil.getInstance();
	}
	/**
	 * 1 if you use facebook account login,you must call this method and set params.
	 * @param activity
	 * @param loginButton
	 * @param arrarPermission
	 * @param savedInstanceState
	 * @param loginstateListener
	 */
	public  static void setFaceBookLoginParams(Activity activity,View loginButton,String arrarPermission,LogInStateListener loginstateListener){
			fbUtil.SetFaceBookLoginActivity(activity);
			fbUtil.SetFaceBookLoginButton(loginButton);
			fbUtil.SetFaceBookReadPermission(arrarPermission);
			fbUtil.SetOnFaceBookLoginStateListener(loginstateListener);
			fbUtil.open();
	}
	/**
	 * if you use facebook logout,you must call this method and set params
	 * @param activity
	 * @param logoutButton
	 * @param logOutStateListener
	 */
	public static void setFaceBookLogOutParams(View logoutButton,LogOutStateListener logOutStateListener){
		//fbUtil.SetFaceBookLoginActivity(activity);
		fbUtil.SetFaceBookLogOutButton(logoutButton);
		fbUtil.SetOnFaceBookLogOutListener(logOutStateListener);
		fbUtil.open();
	};
	public static void onActivityResult(int requestCode, int resultCode, Intent data) {
		if(fbUtil!=null){
			fbUtil.onActivityResult(requestCode, resultCode, data);
		}else if(tbutils!=null){
			tbutils.onActivityResult(requestCode, resultCode, data);
			}
	}
	public static void OnDestory(){
		if(fbUtil!=null){
			fbUtil.OnDestory();
		}else if(tbutils!=null){
			tbutils.onDestroy();
			}
	}
}

这个是登陆成功的回调函数

public interface LogInStateListener {

public  void OnLoginSuccess(User user,String logType);

public  void OnLoginError(String error);

}

这个是退出的回调

public interface LogOutStateListener {

public void OnLogOutListener(boolean isSuccess,String logOutType);

}

完了在你的登陆的页面调用,可以参考下面的MainActivity

public class MainActivity extends FragmentActivity implements LogInStateListener{

Button facebookbutton;

Button tibbrButton;

Button tibbrforgotButton;

Button tibbrregButton;

FaceBookLoginUtil facebookutil;

TibbrLoginUtil tibbrUtil;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

facebookbutton=(Button)findViewById(R.id.facebook_button);

tibbrButton=(Button)findViewById(R.id.tibbr_button);

tibbrforgotButton=(Button)findViewById(R.id.tibbr_forget_button);

tibbrregButton=(Button)findViewById(R.id.tibbr_reg_button);

login();

}

@Override

protected void onResume() {

// TODO Auto-generated method stub

super.onResume();

}

@Override

protected void onPause() {

// TODO Auto-generated method stub

super.onPause();

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

// TODO Auto-generated method stub

super.onActivityResult(requestCode, resultCode, data);

LoginManager.onActivityResult(requestCode, resultCode, data);

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

LoginManager.OnDestory();

}

@Override

public void OnLoginSuccess(User user,String logType) {

Intent intent=new Intent(MainActivity.this,Result.class);

intent.putExtra("user",(Serializable)user);

intent.putExtra("logtype", logType);

startActivity(intent);

}

@Override

public void OnLoginError(String error) {

System.out.println(error);

}

private void login(){

LoginManager.initialize(MainActivity.this);

LoginManager.setFaceBookLoginParams(MainActivity.this, facebookbutton, null,this);

);

}

然后在登陆成功跳转的页面参考下面

package com.tibco.integration.login;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

import com.tibco.integeration.login.listener.LogOutStateListener;
import com.tibco.integration.login.model.User;
import com.tibco.integration.login.utils.Constant;
import com.tibco.integration.login.utils.LoginManager;

public class Result extends Activity implements LogOutStateListener{
	String logType;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.resutl);
		User user=(User) getIntent().getSerializableExtra("user");
		String logType=getIntent().getStringExtra("logtype");

		TextView text=(TextView)findViewById(R.id.user);
		text.setText(user==null?"":user.getFirstname()+user.getLastname()+"\n logtype:"+logType);
		Button button=(Button)findViewById(R.id.logout_button);
		if(!logType.equals("") && logType.equals("facebook")){
			LoginManager.initialize(Result.this);
			LoginManager.setFaceBookLogOutParams(button,this);
		}else if(!logType.equals("") && logType.equals("tibbr")){
			LoginManager.initialize(Result.this);
			LoginManager.setTibbrLogOutParams( button, this);
		}
	}
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		// TODO Auto-generated method stub
		super.onSaveInstanceState(outState);
	}
	@Override
	public void OnLogOutListener(boolean isSuccess,String logOutType) {
		Constant.showErrorDialog(Result.this, logOutType+" log out success!");
		finish();
	}
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();

	}
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();

	}
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		LoginManager.onActivityResult(requestCode, resultCode, data);
	}
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
	}
}

然后上配置文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tibco.integration.login"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name">
        <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>//自己的appid
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Result"></activity>
<activity android:name="com.facebook.FacebookActivity"
          android:configChanges=
                 "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
          android:theme="@android:style/Theme.Translucent.NoTitleBar"
          android:label="@string/app_name" />
<!-- <provider android:authorities="com.facebook.app.FacebookContentProvider1234"
          android:name="com.facebook.FacebookContentProvider"
          android:exported="true" /> -->
    </application>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
</manifest>

运行图:

看不懂的或者有问题的留言一起讨论,谢谢

时间: 2024-10-08 00:26:14

利用FaceBook实现第三方登陆(自定义登陆按钮,非官方按钮)并获取用户数据的相关文章

利用Session实现三天免登陆

什么是Session Session:在计算机中,尤其是在网络应用中,称为“会话控制”.(百度百科) Session:服务器端的数据存储技术. Session要解决什么问题 一个用户的不同请求(重定位到一个Servlet,这个Servlet需要用到上一个Servlet的request对象)的处理需要使用相同的数据怎么办呢? 解决:session技术 Session生命周期 当用户使用浏览器第一次向服务器发送请求的时候,服务器会调用相应的Servlet同时创建一个Session对象用于存储用户的某

bos项目第二天(msyql操作、ssh配置集成、PowerDesinger、自定义登陆拦截器)

项目第二天(完整流程) 1.  第二天 重点内容 搭建SSH 完成框架 以用户管理为例 用户登录 用户退出 修改密码 2.  开发流程 2.1.  业务分析 2.2.  数据库设计 MySQL : 新建 DataBase . 新建用户 User .进行授权 Oracle : 新建用户 User . 创建表空间 . 在表空间进行操作 MySQL 操作步骤 : 步骤: 新建数据库 查看字符集 show variables like '%char%'; client.connection.result

微信第三方登陆,无需注册一键登录,获取用户信息,PHP实现方法.

今天讲讲利用微信oauth2实现第三方登陆的实现方法. 先说说前提吧! 首先你得是服务号,并且是经过认证的.这样微信会给你很多第三方接口的权限,如果是订阅号或者没有认证的服务号那就不用想了! 一开始你需要进入微信公众平台开启开发模式,并且填写oauth2的回调地址,地址填写你项目的域名就可以了.比如:www.baidu.com或zhidao.baidu.com.如果你的项目在二级域名就写二级域名 前端url授权地址,在url中填写appid与你项目中方法中的oauth的地址,具体在下面的代码中可

讲诉从酒店服务业到IT行业的心酸取经路,另附拙作 ASP.net(C#)利用SQL Server实现注册和登陆功能

楼主本人姓周,名XX,老家是曾国藩故居的,说起来和古人也算是邻里邻居. 92年出生,去年大专毕业,到现在毕业快要一年了,大学里学的专业是酒店管理,我们对外宣称为"第三产业"呵呵.到这里你们可能会心生疑问,咦,大学里怎么会有"酒店专业",你怎么会选它?说到这,楼主不得不提起一个人,那就是我的堂姐,楼主填志愿那年,人小不懂事,根本不知道如何去选择自己的专业,家里人就更不懂了,所以填志愿的事都在我这个堂姐手里做的主,填的那个学校是湖南长沙的,三年大专制,因为我这个表姐本人

android QQ第三方登陆 错误 登陆授权失败(错误码:110406)

错误提示: 原因分析:自己的应用没有上线,自己QQ也米有设置为开发调试账号,所有就授权失败 android QQ第三方登陆 错误 登陆授权失败(错误码:110406)

Wordpress在自定义登陆页面并且禁用自带的登陆页面

在使用Wordpress制作主题之后,不想要他自带的登陆页面以及地址. 1.新建一个用户页面来接管与登陆相关的动作 //在主题根目录下新建page-login.php,通过action获取用户动作,然后进行不同的处理. //当然也可以只把login动作的代码放里面,其余再新建page-register.php等页面. $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'login'; global $wpdb, $user_

【转】自定义iOS的Back按钮(backBarButtonItem)和pop交互手势(interactivepopgesturerecognizer) --- 不错

原文网址:http://blog.csdn.net/joonsheng/article/details/41362499 序 说到自定义UINavigetionController的返回按钮,iOS7以后,多了一个“<” 这样的返回图标,而目前主流的应用,都是只保留了“<”,而去掉了文字,那么怎么样自定义一个自己的“<"按钮,或者用系统的“<”,但不要文字呢? 1.设置中的返回按钮(带文字) 2.音乐中播放时(不带文字) 1.直接上答案 [objc] view plain

分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业不是百度来的,我只是百度了一些示例代码的意思,怎么用!算了,越解释万一越黑呢!哈哈O(∩_∩)O哈哈~) ----------------------------------------------------------------分界线------------------------------

OAuth2.0 微博登陆网站功能的实现(一)获取用户授权及令牌 Access Token

在登陆一些网站的时候,可以选择登陆方式为第三方登陆,例如微博登陆,以爱奇艺为例,进入首页,点击 ”登陆“,会弹出登录框: 除了本站登陆外,还可以选择其他第三方登陆,比如微博登陆.QQ 登陆.微信登陆等. 选择微博登陆后,爱奇艺会向用户申请授权用于微博登陆(当用户已经登陆了微博时会直接申请授权,当用户没有登陆时会提示用户登陆微博): 此时提示窗口的 url 为:https://api.weibo.com/oauth2/authorize?scope=&redirect_uri=http%3A%2F