第三方登录之接入百度
第三方登录admin 发布于:2019-01-08 21:48:19
阅读:loading
基本上所有的使用第三方账号登录都主要分为两个部分:
第一:在其开发者中心(或开放平台)创建工程,并配置工程相关信息;
第二:选择登录接入的方式(下载开发相关资源),并将登录代码集成至具体的开发应用中;
百度的登录接入网址并不在百度的开放平台里面而是在百度开发者中心,地址为:http://developer.baidu.com/console#app/project,我们从其后台(使用百度账号登录后的)管理可以去创建一些应用工程,它包含基本信息、应用信息、Oauth2.0、安全设置等信息,其中基本信息中包含有API Key 、Secret Key等参数,再就是安全设置里面的回调地址参数了,这三项参数与实际开发应用中紧密相关,参考如下图所示(当时我就楞了,我也不知道什么时候就创建了3个工程,历史悠久了):
由于本人选择使用Java-SDK进行接入,下载对应的开发相关资源(在上图的Oauth2.0页面中可以找到开发相关资源下载,但如果使用一些图片素材资源,则需要去另外的地址下载,这个页面地址的图片404了),我们可以将下载下来的项目给运行起来(包括一个war项目和源码及jar包和源码),我的建议是我们将war项目的源码导入至开发IDE中,将代码重新编译后部署运行(由于我们无法保证本地开发环境war包打包时的一致),同时别忘记将里面对应的参数给修改为自己新创建应用的Key信息,参考如下列代码实现:
#接入百度登录
baidu.connect.appId=Gpxx0t2XDqXXXXXXXXXX
baidu.connect.appSecretKey=rHG8brDcYF7Y41HM2LQl4Y6XXXXXXXXX
baidu.connect.callback=http://www.chendd.cn/baidu-login/XXXXXXXXX
baidu.connect.userImage.prefix=http://tb.himg.baidu.com/sys/portraitn/item/
<!— 超链接去登录 -->
<a href="/tencent-login/tencentConnect.a" title="使用qq账号登录">
<img align="absmiddle" src="/app/images/third/qq/qq.png" />
</a>
@Controller
@Scope("prototype")
@RequestMapping("/baidu-login")
public class BaiduLoginController extends ThirdLoginConnectController {
private String appId = connectProps.getProperty("baidu.connect.appId");
private String secretKey = connectProps.getProperty("baidu.connect.appSecretKey");
private String callback = connectProps.getProperty("baidu.connect.callback");
private String userImagePrefix = connectProps.getProperty("baidu.connect.userImage.prefix");
@RequestMapping("/baiduConnect")
public void baiduConnect() {
BaiduStore store = new BaiduCookieStore(appId, request, response);
Baidu baidu = null;
try {
baidu = new Baidu(appId, secretKey, callback, store, request);
String state = baidu.getState();
Map<String, String> params = new HashMap<String, String>();
params.put("state", state);
String authorizeUrl = baidu.getBaiduOAuth2Service().getAuthorizeUrl(params);
response.sendRedirect(authorizeUrl);
} catch (BaiduOAuthException e) {
LogUtil.errorLog("接入百度登录认证.BaiduOAuthException ", e);
} catch (BaiduApiException e) {
LogUtil.errorLog("接入百度登录Api.BaiduApiException ", e);
} catch (IOException e) {
LogUtil.errorLog("BaiduApiRedirectException ", e);
}
}
@RequestMapping("/baiduCallback")
public void baiduCallback() throws Exception {
BaiduStore store = new BaiduCookieStore(appId, request, response);
Baidu baidu = null;
User loggedInUser = null;
try {
baidu = new Baidu(appId, secretKey, callback, store, request);
loggedInUser = baidu.getLoggedInUser();
//store.removeAll();//删除cookie
} catch (BaiduApiException e) {
throw new Exception("接入百度登录Api出现错误");
} catch (BaiduOAuthException e) {
throw new Exception("接入百度登录认证出现错误");
}
if (loggedInUser != null) {
//绑定用户头像地址前缀
String userImage = userImagePrefix + loggedInUser.getPortrait();
Long uid = loggedInUser.getUid();
String uname = loggedInUser.getUname();
System.out.println(String.format("用户头像地址:%s,id:%s,uname:%s" , userImage , uid , uname));
//此处省略重定向
return;
}
throw new Exception("接入百度登录授权出现错误,没有用户信息");
}
}
勾选后下次授权就直接跳过本授权页面
(1)、由于接口交互时的AppId和SecreKey都是自行传输的,所以props中的key可自行定义,本例采用baidu.connect为前缀,主要为区分其他登录接入的参数实现;
(2)、百度提供的demo代码中提供的用户会话管理有三种:BaiduCookieStore、BaiduSessionStore、BaiduMemcachedStore,但经过分析后发现只有BaiduCookieStore可用(示例代码中也是使用的这种),另外的两种方式实现的构造函数均为protected,无法在外部初始化该类,我好像也试测试过,其它两种用不了;
(3)、接口返回的用户头像地址完整路径是需要自行补完整的,路径前缀地址为:http://tb.himg.baidu.com/sys/portraitn/item/
(4)、在本地开发时使用域名映射localhost地址来辅助验证,通过更改host文件来虚拟一个域名地址可便于测试,或者将百度开发者后台的授权地址修改为http://127.0.0.1....,同时访问应用时也得是对应的ip地址;
(5)、可使用百度demo中提供的jar文件,也可以在maven仓库中下载;
注意:自行修改AppId、SecreKey,由于这些示例代码较老,注意运行编译环境对应。
点赞