第三方登入功能的實現
阿新 • • 發佈:2019-01-06
剛開始做的時候感覺高大上
為什麼要使用第三方登入:
一般稍微作為一個大點的專案,為了提高使用者的群體都會做第三方登入(如:QQ,微信,新浪等)
在往下看之前先註冊第三方網站的開發者賬號,建立應用完成稽核。
要實現第三方登入的功能首先要明白oauth2.0的認證原理,由於第三方登入的認證授權流程大致都是一樣的,在這裡我只講QQ的登入授權流程:
其授權驗證流程示意圖如下:
client先訪問:PC網站:https://graph.qq.com/oauth2.0/authorize?
引數有: response_type=code 固定
client_id 申請應用時分配的id
redirect_uri 回撥的url 你自己網站的一個地址通過第一步會返回 code碼(注意:此code會在10分鐘內過期)
通過Authorization Code獲取Access Token(通過地址:https://graph.qq.com/oauth2.0/token?)
此時引數有:
grant_type
client_id
client_secret: 申請QQ登入成功後,分配給網站的appkey。
code: 上一步返回的authorization code。
redirect_uri- 此刻你已經拿到了Access Token , 然後就是獲取使用者OpenID_OAuth2.0
- 根據第4步你會拿到(openid): callback( {“client_id”:”YOUR_APPID”,”openid”:”YOUR_OPENID”} );
返回結果:
{
“ret”:0,
“msg”:”“,
“nickname”:”YOUR_NICK_NAME”,
…
}
下面直接看程式碼(控制層):
/**
*
* 首頁
*
* @author Administrator
*
*/
@Controller
@RequestMapping ("/qqLogin")
public class HomePageController {
@RequestMapping("/login")
public String login(HttpServletRequest request, HttpServletResponse response, HttpSession session)
throws IOException {
try {
AccessToken accessTokenObj = (new Oauth())
.getAccessTokenByRequest(request);
String accessToken = null, openID = null;
if (accessTokenObj.getAccessToken().equals("")) {
System.out.print("沒有獲取到響應引數");
return "error";
} else {
accessToken = accessTokenObj.getAccessToken();
session.setAttribute("accessToken",
accessToken);
// 利用獲取到的accessToken 去獲取當前用的openid
OpenID openIDObj = new OpenID(accessToken);
openID = openIDObj.getUserOpenID();
session.setAttribute("openID", openID);
return "success";
}
} catch (QQConnectException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "error";
}
}
@RequestMapping("/homePage")
public String homePage(Model model) {
return "index";
}
@RequestMapping("/inQQ")
public void inQQ(Model model, HttpServletResponse response,
HttpServletRequest request) {
try {
response.sendRedirect(new Oauth().getAuthorizeURL(request));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (QQConnectException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
檢視層:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- <%@include file="/inc/taglib.jsp"%> --%>
<body>
<h2>Hello World!ss</h2>
<a href="${pageContext.request.contextPath} /qqLogin/inQQ">請使用你的QQ賬號登陸</a>
</body>
記得別忘了導包
解開來見證奇蹟的時刻到了:
至此結束!!!!!!!!
有需要原始碼的留下qq郵箱