最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

手把手教你實現(xiàn)Java第三方應(yīng)用登錄

 更新時間:2021年08月04日 08:36:46   作者:~wangweijun  
本文主要介紹了手把手教你實現(xiàn)Java第三方應(yīng)用登錄,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

大家在自己做項目的時候有沒有想過實現(xiàn)一個第三方應(yīng)用登錄呢?類似這種:

image.png

本篇文章就來聊一聊該如何實現(xiàn)第三方應(yīng)用登錄。

什么是OAuth2.0

OAuth是一項協(xié)議,它為用戶資源的授權(quán)提供了一個安全、開放而簡易的標(biāo)準(zhǔn),OAuth的授權(quán)不會使第三方觸及到用戶的賬號信息(比如密碼),因此OAuth是相對安全的。而OAuth2.0就是OAuth的延續(xù),不過2.0更加關(guān)注客戶端開發(fā)者的簡易性。

申請網(wǎng)站接入

常見的第三方應(yīng)用都支持第三方登錄,比如:QQ、微信、微博、GitHub、Gitee等,要想申請第三方登錄權(quán)限,就需要去到對應(yīng)的平臺,比如QQ,搜索QQ開放平臺:

image.png

進(jìn)入應(yīng)用管理,并創(chuàng)建應(yīng)用即可:

在這里插入圖片描述

不過對于QQ、微信、微博等的網(wǎng)站接入都需要身份認(rèn)證,過程比較繁瑣,所以我們使用Gitee作為第三方應(yīng)用進(jìn)行接入。

首先打開Gitee,選擇設(shè)置:

image.png

在設(shè)置中選擇第三方應(yīng)用:

image.png

點擊創(chuàng)建應(yīng)用并填寫相關(guān)信息:

image.png

應(yīng)用名稱可以隨意填寫,但是下面的兩個地址就有用途了,對于應(yīng)用主頁,它需要填寫的是當(dāng)前應(yīng)用的主頁,而應(yīng)用回調(diào)接口填寫的是當(dāng)?shù)卿洺晒笮枰D(zhuǎn)的頁面。

創(chuàng)建SpringBoot應(yīng)用

申請完成后,就可以來創(chuàng)建SpringBoot應(yīng)用,并新建一個index.html頁面:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  <body>
    <form>
      用戶名:<input type="text"/><br/>
      密碼:<input type="password"/><br/>
      <a href="">Gitee登錄</a>
      <input type="submit" value="登錄"/><br/>
    </form>
  </body>
</html>

效果如下:

image.png

頁面很丑,但不重要,實現(xiàn)功能即可。

現(xiàn)在我們的需求是點擊Gitee登錄鏈接,會跳轉(zhuǎn)至一個第三方的登錄頁面,就像這樣:

image.png

那么該如何實現(xiàn)呢?

回到Gitee中,在創(chuàng)建完應(yīng)用后,將頁面拖動到下方,會看到模擬請求按鈕:

image.png

點擊一下該按鈕,會進(jìn)行一個模擬登錄:

image.png

地址欄中的地址就是我們需要跳轉(zhuǎn)的頁面,將地址復(fù)制下來:

https://gitee.com/oauth/authorize?client_id=52908197466cd3008db76a6018de66c8d222656056fa78b26dd58d1f4fa0a606&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fsuccess&response_type=code

里面總共有3個參數(shù),分別是:

  • client_id
  • redirect_uri
  • response_type

其中client_id在創(chuàng)建完應(yīng)用之后便會提供給我們:

image.png

也就是地址上的內(nèi)容,而redirect_uri是在點擊了同意授權(quán)按鈕之后需要跳轉(zhuǎn)的頁面,即:登錄成功之后,需要跳轉(zhuǎn)至成功后的頁面,最后是response_type,它表示響應(yīng)類型為一個授權(quán)碼。

來了解一下授權(quán)碼的作用,當(dāng)用戶點擊了同意授權(quán)按鈕之后,Gitee服務(wù)器會給redirect_uri指向的頁面?zhèn)鬟f一個授權(quán)碼,此時就可以接收到這個授權(quán)碼,再去換取AccessToken,只有獲取到了AccessToken,才能夠獲取到Gitee中當(dāng)前用戶的某些信息。

點擊了同意授權(quán)按鈕后:

image.png

得到了授權(quán)碼后,通過該地址能夠換取AccessToken:

https://gitee.com/oauth/token?grant_type=authorization_code&code={code}&client_id={client_id}&redirect_uri={redirect_uri}&client_secret={client_secret}

該地址要求以Post形式請求,使用PostMan測試一下,將參數(shù)按要求設(shè)置好:

image.png

得到相應(yīng)結(jié)果:

{
  "access_token": "cd2c33c3fe548a23188159f87da70110",
  "token_type": "bearer",
  "expires_in": 86400,
  "refresh_token": "c95a38ab2357638ffc4dc6f09c623f2333e0930a37dec8e2f191a40d7afd3514",
  "scope": "user_info",
  "created_at": 1627974370
}

得到了AccessToken之后,就可以獲取到用戶在Gitee中已經(jīng)授權(quán)的任何信息了。

整個授權(quán)認(rèn)證的過程如下圖所示:

image.png

實現(xiàn)登錄流程

熟悉了整合流程之后,我們用代碼來實現(xiàn)一下,首先修改頁面:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  <body>
    <form>
      用戶名:<input type="text"/><br/>
      密碼:<input type="password"/><br/>
      <a >Gitee登錄</a>
      <input type="submit" value="登錄"/><br/>
    </form>
  </body>
</html>

現(xiàn)在超鏈接的地址經(jīng)過修改后就能成功跳轉(zhuǎn)至Gitee授權(quán)頁面了,因為授權(quán)成功后跳轉(zhuǎn)的地址為 http://localhost:8080/success ,所以需要來處理一下這個請求,創(chuàng)建一個控制器:

@Controller
public class LoginController {

    @GetMapping("/success")
    public String login(@RequestParam("code") String code){
        System.out.println(code);
        return "success";
    }
    
    @GetMapping("/")
    public String index(){
        return "index";
    }
}

當(dāng)授權(quán)成功后我們讓其跳轉(zhuǎn)至success.html頁面,并接收Gitee傳遞過來的授權(quán)碼,所以創(chuàng)建success.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  <body>
    <h1>登錄成功!</h1>
  </body>
</html>

啟動項目測試一下:

image.png

點擊同意授權(quán)后確實登錄成功了,控制臺也輸出了授權(quán)碼:

e907fd92d8392ebcd72dff321da45115ff0fba2dec0e6918b233ec7d03b76e5d

其實到這里登錄流程還沒有結(jié)束,因為如果使用第三方應(yīng)用登錄的話,平臺會使用第三方應(yīng)用的一些信息,比如賬號、頭像等直接作為當(dāng)前平臺的登錄名和頭像,所以我們還需要獲取用戶在Gitee中的一些信息。

此處參考Gitee的API文檔:

image.png

比如獲取授權(quán)用戶的資料信息:

image.png

它需要傳遞一個access_token作為參數(shù),那我們要做的就是使用授權(quán)碼去得到access_key:

@Controller
public class LoginController {

    @GetMapping("/success")
    public String login(@RequestParam("code") String code, Map<String,String> map) {
        // 獲取accesskey
        String accessKey = getAccessKey(code);
        System.out.println(accessKey);
        // 通過accessKey獲取用戶信息
        String userInfo = getUserInfo(accessKey);
        // 取出用戶名
        String name = (String) JSONObject.parseObject(userInfo).get("name");
        // 取出頭像
        String avatar_url = (String) JSONObject.parseObject(userInfo).get("avatar_url");
        // 放入請求域
        map.put("name",name);
        map.put("avatar_url",avatar_url);
        return "success";
    }

    /**
     * 獲取用戶信息
     */
    private String getUserInfo(String accessKey) {
        String json = "";
        OkHttpClient client = new OkHttpClient();
        // 通過該地址能夠獲取到用戶信息
        String url = "https://gitee.com/api/v5/user?access_token=" + accessKey;
        Request request = new Request.Builder()
                .get()
                .url(url).build();
        try {
            Response response = client.newCall(request).execute();
            json = response.body().string();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return json;
    }

    /**
     * 獲取AccessKey
     */
    private String getAccessKey(String code) {
        OkHttpClient client = new OkHttpClient();
        // 通過該地址能夠獲取到access_token
        String url = "https://gitee.com/oauth/token";
        // 封裝請求參數(shù)
        RequestBody requestBody = new FormBody.Builder()
                .add("grant_type", "authorization_code")
                .add("code", code)
                .add("client_id", "52908197466cd3008db76a6018de66c8d222656056fa78b26dd58d1f4fa0a606")
                .add("redirect_uri", "http://localhost:8080/success")
                .add("client_secret", "7e84401a9752e88d22d5450c1687ca6a19bc34f45fe3452cefd33312d8153978")
                .build();

        Request request = new Request.Builder()
                .post(requestBody)
                .url(url).build();
        String accessKey = "";
        try {
            Response response = client.newCall(request).execute();
            String json = response.body().string();
            // 獲取json串中的access_token屬性
            accessKey = (String) JSONObject.parseObject(json).get("access_token");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return accessKey;
    }

    @GetMapping("/")
    public String index() {
        return "index";
    }
}

success.html頁面需要顯示用戶信息:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  <body>
    <h1>登錄成功!</h1>
    <h1>用戶名:<span th:text="${#request.getAttribute('name')}"></span></h1>
    <img th:src="${#request.getAttribute('avatar_url')}">
  </body>
</html>

效果如下:

image.png

事實上,登錄流程遠(yuǎn)沒有這么簡單,當(dāng)用戶取消授權(quán)時就不能讓其登錄,程序里還沒有加上這類判斷,對于從未注冊過的用戶來說,這次登錄就相當(dāng)于一次注冊,所以還需要以Gitee中用戶的某些信息作為注冊信息進(jìn)行登錄,當(dāng)已經(jīng)注冊過的用戶使用第三方登錄時,要讓其正常登錄。

到此這篇關(guān)于手把手教你實現(xiàn)Java第三方應(yīng)用登錄的文章就介紹到這了,更多相關(guān)Java第三方應(yīng)用登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis下動態(tài)sql中##和$$的區(qū)別講解

    Mybatis下動態(tài)sql中##和$$的區(qū)別講解

    今天小編就為大家分享一篇關(guān)于Mybatis下動態(tài)sql中##和$$的區(qū)別講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • springboot實現(xiàn)極驗校驗的項目實踐

    springboot實現(xiàn)極驗校驗的項目實踐

    在系統(tǒng)業(yè)務(wù)中,需要想客戶發(fā)送手機(jī)驗證碼,進(jìn)行驗證后,才能提交,本文主要介紹了springboot實現(xiàn)極驗校驗的項目實踐,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • JAVA基于數(shù)組實現(xiàn)的商品信息查詢功能示例

    JAVA基于數(shù)組實現(xiàn)的商品信息查詢功能示例

    這篇文章主要介紹了JAVA基于數(shù)組實現(xiàn)的商品信息查詢功能,結(jié)合實例形式詳細(xì)分析了java使用數(shù)組存儲數(shù)據(jù)實現(xiàn)的商品信息查詢功能相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • Spring Cloud Config分布式配置中心使用介紹詳解

    Spring Cloud Config分布式配置中心使用介紹詳解

    分布式配置中心應(yīng)用場景 往往,我們使用配置文件管理?些配置信息,比如application.yml 單體應(yīng)用架構(gòu):配置信息的管理、維護(hù)并不會顯得特別麻煩,手動操作就可以,因為就一個工程
    2022-09-09
  • 解析如何開發(fā)FineReport的自定義控件

    解析如何開發(fā)FineReport的自定義控件

    FineReport作為插件化開發(fā)的報表軟件,有些特殊需求的功能需要自己開發(fā),開發(fā)的插件包帆軟官方有提提供,可以去帆軟論壇上找,本文將主要介紹如何開發(fā)一個自定義控件,這里講講方法論。需要的朋友一起來看下吧
    2016-12-12
  • Java裝飾器設(shè)計模式_動力節(jié)點Java學(xué)院整理

    Java裝飾器設(shè)計模式_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了Java裝飾器設(shè)計模式的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-05-05
  • Springboot集成JSR303參數(shù)校驗的方法實現(xiàn)

    Springboot集成JSR303參數(shù)校驗的方法實現(xiàn)

    這篇文章主要介紹了Springboot集成JSR303參數(shù)校驗的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java中extends與implements的區(qū)別淺談

    java中extends與implements的區(qū)別淺談

    java中extends與implements的區(qū)別淺談,需要的朋友可以參考一下
    2013-03-03
  • Nacos源碼之注冊中心的實現(xiàn)詳解

    Nacos源碼之注冊中心的實現(xiàn)詳解

    這篇文章主要為大家介紹了Nacos源碼之注冊中心的實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 解決idea不支持SpringBoot yml文件的圖文教程

    解決idea不支持SpringBoot yml文件的圖文教程

    這篇文章主要介紹了解決idea不支持SpringBoot yml文件,需要的朋友可以參考下
    2018-06-06

最新評論

广宁县| 桐梓县| 肇州县| 惠州市| 土默特右旗| 布拖县| 翁牛特旗| 巩义市| 类乌齐县| 大同县| 仪征市| 墨玉县| 瑞安市| 民丰县| 天柱县| 阿克陶县| 南宫市| 中西区| 丽江市| 外汇| 横山县| 高台县| 和政县| 焉耆| 田阳县| 富顺县| 永福县| 冷水江市| 南丰县| 吉水县| 辽中县| 二手房| 宝鸡市| 宁明县| 长垣县| 喀喇沁旗| 丹江口市| 赤水市| 张掖市| 普兰店市| 于田县|