天天看點

#yyds幹貨盤點#GitLab 配置 OAuth2 實作第三方登入,簡直太友善了!

GitLab支援配置第三方登入, 修改配置檔案​

​gitlab.rb​

​:

vi /etc/gitlab/gitlab.rb

#OAuth2.0
gitlab_rails['omniauth_enabled'] = true
gitlab_rails['omniauth_allow_single_sign_on'] = ['OneID']
gitlab_rails['omniauth_block_auto_created_users'] = false
gitlab_rails['omniauth_providers'] = [
  {
    'name' => 'OneID',
    'app_id' => '123',
    'app_secret' => '1111',
    'args' => {
      client_options: {
        'site' => 'http://10.30.75.85:31900',
        'authorize_url' => '/auth',
        'user_info_url' => '/userInfo'
      },
      user_response_structure: {
        root_path: [],
        id_path: 'userAccountID',
        attributes: {
          name: 'realName',
          nickname: 'nickname',
          email: 'email',
         username:'username'
        }
      },
      name: 'OneID',
      strategy_class: "OmniAuth::Strategies::OAuth2Generic"
    }
  }
]      

​http://10.30.75.85:31900​

​ :本人服務的位址

以上資料僅供參考,請根據實際情況修改,不清楚配置請百度,有詳細案例

我服務實作方式為java web項目(Spring boot),配置:

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.11.3</version>
</dependency>

<dependency>
    <groupId>com.konghq</groupId>
    <artifactId>unirest-java</artifactId>
    <version>3.5.00</version>
</dependency>

<!-- 需要作為獨立jar檔案引用時(包含隐式依賴) -->
<dependency>
    <groupId>com.konghq</groupId>
    <artifactId>unirest-java</artifactId>
    <version>3.5.00</version>
    <classifier>standalone</classifier>
</dependency>      

定義OAuthController.java

@Controller
@RefreshScope
public class OAuthController extends BaseController {
    
    @Value("${dossen.gitlab.url}")
    private String gitLabUrl;
   
    /**
     * 獲得通過oneid登入得重定向位址
     * @return
     */
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String getGitLabStateVal(HttpServletRequest request, HttpServletResponse response){
        //所有cookie-我就看看,沒什麼用
        Cookie[] cookies = request.getCookies();
        //獲得通過oneid登入得重定向位址
        String location = ImitativeLoginGitLabUtil.getLocation(gitLabUrl);
        String[] urlAndCookie = location.split("&&");
        //設定cookie
        Cookie cookie = new Cookie("_gitlab_session",urlAndCookie[1].replaceAll("_gitlab_session=",""));
        cookie.setPath("/");
        response.addCookie(cookie);

        return "redirect:"+urlAndCookie[0];
    }

    @RequestMapping(value = "/auth", method = RequestMethod.GET)
    public String auth(OAuthRequest request) {
        //需要自己寫實作邏輯鑒權傳回給gitlab
        return "redirect:"";
    }

    /**
     * 擷取使用者資訊
     *
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "/userInfo")
    public Object userInfo(HttpServletRequest request) {
        //gitlab請求參數查詢使用者資訊,傳回給gitlab

        UserGetResponse userGetResponse = null;

        Map<String, Object> resultMap = new HashMap<String, Object>();
        resultMap.put("userAccountID", userGetResponse.getUserAccountID());
        resultMap.put("realName", userGetResponse.getRealName());
        resultMap.put("nickname", userGetResponse.getRealName());
        resultMap.put("username", userGetResponse.getEmail().split("@")[0]);
        resultMap.put("email", userGetResponse.getEmail());
        ResponseEntity<Object> responseEntity = new ResponseEntity<Object>(resultMap, 
        HttpStatus.valueOf(200));
        return responseEntity;
    }

}      

定義ImitativeLoginGitLabUtil.java

package com.dossen.gitlab.adapter.util;

import kong.unirest.HttpResponse;
import kong.unirest.Unirest;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.springframework.beans.factory.annotation.Value;

/**
 * 模拟登入gitlab請求擷取重定向值
 * @Author wenfl
 * @Date 2021-10-14
 */
public class ImitativeLoginGitLabUtil {
    public static String getLocation(String gitLabUrl){
        HttpResponse<String> response = null;
        try {
            //打開登入頁面
            response =Unirest.get(gitLabUrl).asString();
            //得到document對象
            Document doc = Jsoup.parse(response.getBody());
            String authenticity_token = doc.select("meta[name=csrf-token]").get(0).attr("content");
            String cookeiValue = response.getHeaders().getFirst("Set-Cookie");
            response = Unirest.post(gitLabUrl+"/users/auth/OneID")
                    .header("Cookie", cookeiValue)
                    .header("Content-Type", "application/x-www-form-urlencoded")
                    .field("authenticity_token", authenticity_token)
                    .asString();
            //獲得重定向位址
            String location = response.getHeaders().getFirst("Location")+"&&"+cookeiValue.split(";")[0];
            return location;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
}