社会化登录之豆瓣小结
1:登录豆瓣网,注册一个开发者账号,然后选择我的应用。
2:创建我的应用:
回调地址很重要,要和自己请求时的回调地址一致。QQ对于回调地址只是匹配域名,其他几个是直接匹配整个地址,然后加上参数code进行回调。
3: 查看和配置应用基本信息:
可以看到:
下面的要注意喽:
豆瓣测试自己的账号的时候必须把自己添加进去,其他社会化登录不要添加自己账号。
4:实现流程参考:http://douban-oauth2.wikispaces.com/
基本使用:
页面链接:<a href="https://www.douban.com/service/auth2/auth?client_id=0e3bfd6c9e1edf942ab3f845da5c9ebc&response_type=code&redirect_uri=${appContext}sociallogin/dologin?SocialLoginParams=DouBan"></a>
说明:通过该链接,返回code
调用实现:
------------------------------------基本调用----------------------------------------
String code = paramsMapx.getString("code");//code在回调方法中,是通过上面的页面回调链接返回
Map<String, String> token_name = DouBanOauthBL.grantAccessToken(code);
if(token_name==null){
return false;
}
System.out.println("成功获得accessToken:"+token_name.get("douban_user_id"));//f9d18d06e5ca9be1ed74a714b15fd3a3
//获取用户相关信息
String info = DouBanOauthBL.getUseInfo(token_name);
JSONObject currentUser = (JSONObject)JSONValue.parse(info);System.out.println(currentUser.toJSONString());
------------------------------------DouBanOauthBL.java----------------------------
/**
* 使用授权后的authorization_code换取Access Token
* 因为豆瓣api在应用没有通过审核之钱~me接口不开放,所以先用name顶着
* 封装普通的Post请求 返回服务端返回json
* {"access_token":"6dd3771561bf6255497a6540253e26ff",
* "douban_user_name":"XXX",
* "douban_user_id":"xxxx",
* "expires_in":604800,
* "refresh_token":"9e74a038d59bf308db5de0aa80d3d918"}
*/
public static Map<String,String> grantAccessToken(String code){
List<BasicNameValuePair> paramList = new ArrayList<BasicNameValuePair>();
paramList.add(new BasicNameValuePair("client_id", DouBanAppConfig.oauth_consumer_key));
paramList.add(new BasicNameValuePair("client_secret",DouBanAppConfig.oauth_token));
paramList.add(new BasicNameValuePair("redirect_uri", DouBanAppConfig.redirect_URI+"/sociallogin/dologin?SocialLoginParams=DouBan"));
paramList.add(new BasicNameValuePair("grant_type", "authorization_code"));
paramList.add(new BasicNameValuePair("code",code));
List<String> keys = new ArrayList<String>();//需要返回的信息
keys.add("access_token");
keys.add("douban_user_id");
Map<String,String> token_name = SocailUtil.HttpPost2SNS(paramList,DouBanAppConfig.apiPrefixURL+DouBanAppConfig.accessTokenURL,keys);
return token_name;
}
/**
* 获取当前授权用户信息
* 需要授权的Api,需要加access_token的Header,并且使用https协议,限制具体见OAuth2文档
* 这里告诉你当应用未通过审核是,GET /v2/user/~me这个接口不能使用,只能使用GET /v2/user/:name获取用户信息;
* :name 为用户uid或者数字id
*/
public static String getUseInfo(Map<String,String> token_name){
List<BasicNameValuePair> paramList = new ArrayList<BasicNameValuePair>();
Header header = new BasicHeader("access_token",token_name.get("access_token"));
String infoJSON = SocailUtil.HttpGet2SNS(paramList,DouBanAppConfig.OpenIdURL+token_name.get("douban_user_id"),header);
return infoJSON;
}
------------------------------------SocailUtil.java--------------------------
public static Map<String,String> HttpPost2SNS(List<BasicNameValuePair> paramList,String goURL,List<String> backKeys) {
Map<String,String> token_name = null;
try {
HttpPost httpPost = new HttpPost(goURL);
httpPost.setEntity(new UrlEncodedFormEntity(paramList, HTTP.UTF_8));// 添加请求参数到请求对象
HttpResponse httpResponse = new DefaultHttpClient().execute(httpPost);
if (httpResponse.getStatusLine().getStatusCode() == 200) { // 为200表示执行成功
System.out.println("执行成功");
String resultJson = EntityUtils.toString(httpResponse.getEntity()); // 得到返回数据(为JSON数据)
JSONObject currentUser = (JSONObject)JSONValue.parse(resultJson);
token_name = new HashMap<String,String>();
for(String key : backKeys ){
token_name.put(key,(String)currentUser.get(key));
}
}
System.out.println(EntityUtils.toString(httpResponse.getEntity()));
} catch (Exception e) {
System.out.println("执行失败:"+e.getMessage().toString());
}
return token_name;
}
public static String HttpGet2SNS(List<BasicNameValuePair> paramList,String goURL,Header header) {
String strResult = null;
try {
String queryURL = appendGetParams(paramList,goURL);
HttpGet httpget = new HttpGet(queryURL);
httpget.addHeader(header);
HttpResponse httpResponse = new DefaultHttpClient().execute(httpget);
if (httpResponse.getStatusLine().getStatusCode() == 200) { // 为200表示执行成功
System.out.println("执行成功");
strResult = EntityUtils.toString(httpResponse.getEntity()); // 得到返回数据(为JSON数据)
}
System.out.println(EntityUtils.toString(httpResponse.getEntity()));
} catch (Exception e) {
System.out.println("执行失败:"+e.getMessage().toString());
}
return strResult;
}
public static String appendGetParams(List<BasicNameValuePair> paramList,String url){
StringBuilder builder = new StringBuilder();
boolean flag = false;
for(BasicNameValuePair bnvp : paramList){
builder.append("&"+bnvp.getName().trim()+"="+bnvp.getValue().trim());
flag = true;
}
if(flag){
url += "?"+builder.toString().substring(1);
}
return url;
}
------------------------------------DouBanAppConfig.java--------------------------
public static final String ID = "DouBanAppConfig";
//App Key
public static final String oauth_consumer_key = "0e3bfd6c9e1edf942ab3f845da5c9ebc";//wjl
//App Secret
public static final String oauth_token = "89672e1e3be1f720";//wjl
//授权回调页
public static final String redirect_URI = AppContext.getValue().substring(0, AppContext.getValue().length()-1);
//api基础地址
public static final String apiPrefixURL = "https://www.douban.com/service/auth2/";
/**
* (1)获取authorization_code
*/
public static final String authorizeURL = "auth";
/**
* (2)获取access_token
*/
public static final String accessTokenURL = "token";
/**
* (3)根据access_token获得对应用户身份信息
* 这里告诉你当应用未通过审核是,GET /v2/user/~me这个接口不能使用,只能使用GET /v2/user/:name获取用户信息;
*/
//public static final String OpenIdURL = "https://api.douban.com/v2/user/~me";
public static final String OpenIdURL = "https://api.douban.com/v2/user/";
小结:
1:豆瓣对于未通过审核上线的应用,GET /v2/user/~me这个接口不能使用,只能使用GET /v2/user/:name获取用户信息
2:在请求的时候注意区分是Get还是Post方式
3:豆瓣在访问需要授权的API的时候需要在header中加入accesstoken
4:豆瓣在测试的时候注意添加测试账号
5:在创建应用的时候注意回调地址与我们应用中的链接调用中的回调地址保持一致
6:其他的社会化登录方式,QQ/Sina/BaiDu的都做的不错,人人的比较万恶,豆瓣的比较乱,不过总体的配置和使用都差不多,QQ对回调的设置验证比较严格,BaiDu的文档非常清晰明了。
7:一些OAuth2.0授权过程中需要验证用户的身份,支持Cookie验证。已经使用OAuth2.0登录的浏览器,不会再次出现登陆页面。 如果需要强制切换账号
人人:可以在请求https://graph.renren.com/oauth/authorize时传递“x_renew=true”。
新浪:授权页会默认读取当前用户的新浪微博登录状态,如果你想让用户重新登录,请在调用authorize接口时传入参数:forcelogin=true
豆瓣:自带
百度:confirm_login=1
腾讯:自带
8:QQ互联的创建应用需要网站验证,这个过程需要等待一段时间,不能使用localhost/127.0.0.1,所以建议方法:修改自己的hosts文件,添加域名
9:豆瓣比较特殊,在获取access_token的时候就会把授权的用户id直接返回。
10:百度对于URL访问另外需要配置: