| /** |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.pulsar.manager.controller; |
| |
| import com.google.common.collect.Maps; |
| import io.swagger.annotations.Api; |
| import io.swagger.annotations.ApiOperation; |
| import io.swagger.annotations.ApiResponse; |
| import io.swagger.annotations.ApiResponses; |
| import lombok.extern.slf4j.Slf4j; |
| import org.apache.pulsar.manager.entity.UserInfoEntity; |
| import org.apache.pulsar.manager.service.ThirdPartyLoginService; |
| import org.springframework.beans.factory.annotation.Autowired; |
| import org.springframework.beans.factory.annotation.Value; |
| import org.springframework.http.ResponseEntity; |
| import org.springframework.stereotype.Controller; |
| import org.springframework.ui.Model; |
| import org.springframework.validation.annotation.Validated; |
| import org.springframework.web.bind.annotation.RequestMapping; |
| import org.springframework.web.bind.annotation.RequestMethod; |
| import org.springframework.web.bind.annotation.RequestParam; |
| import org.springframework.web.bind.annotation.ResponseBody; |
| |
| import java.io.UnsupportedEncodingException; |
| import java.net.URLEncoder; |
| import java.nio.charset.StandardCharsets; |
| import java.util.Map; |
| |
| /** |
| * Callback function of third party platform login. |
| */ |
| @Slf4j |
| @Controller |
| @RequestMapping(value = "/pulsar-manager/third-party-login") |
| @Api(description = "Calling the request below this class does not require authentication because " + |
| "the user has not logged in yet.") |
| @Validated |
| public class ThirdPartyLoginCallbackController { |
| |
| @Value("${github.client.id}") |
| private String githubClientId; |
| |
| @Value("${github.login.host}") |
| private String githubLoginHost; |
| |
| @Value("${github.redirect.host}") |
| private String githubRedirectHost; |
| |
| @Autowired |
| private ThirdPartyLoginService thirdPartyLoginService; |
| |
| @ApiOperation(value = "When use pass github authentication, Github platform will carry code parameter to call " + |
| "back this address actively. At this time, we can request token and get user information through " + |
| "this code." + |
| "Reference document: https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/") |
| @ApiResponses({ |
| @ApiResponse(code = 200, message = "ok"), |
| @ApiResponse(code = 404, message = "Not found"), |
| @ApiResponse(code = 500, message = "Internal server error") |
| }) |
| @RequestMapping(value = "/callback/github") |
| public String githubCallbackIndex(Model model, @RequestParam() String code) { |
| Map<String, String> parameters = Maps.newHashMap(); |
| parameters.put("code", code); |
| String accessToken = thirdPartyLoginService.getAuthToken(parameters); |
| Map<String, String> authenticationMap = Maps.newHashMap(); |
| authenticationMap.put("access_token", accessToken); |
| UserInfoEntity userInfoEntity = thirdPartyLoginService.getUserInfo(authenticationMap); |
| if (userInfoEntity == null) { |
| model.addAttribute("messages", "Authentication failed, please check carefully"); |
| model.addAttribute("flag", false); |
| return "index"; |
| } |
| model.addAttribute("message", "Authentication successful, logging in"); |
| model.addAttribute("flag", true); |
| model.addAttribute("userInfo", userInfoEntity); |
| return "index"; |
| } |
| |
| @ApiOperation(value = "Github's third-party authorized login address, HTTP GET request, needs to carry " + |
| "client_id and redirect_host parameters. Parameter client_id and redirect_host needs to be applied " + |
| "from github platform https://developer.github.com/apps/building-oauth-apps/creating-an-oauth-app/.") |
| @ApiResponses({ |
| @ApiResponse(code = 200, message = "ok"), |
| @ApiResponse(code = 404, message = "Not found"), |
| @ApiResponse(code = 500, message = "Internal server error") |
| }) |
| @RequestMapping(value = "/github/login", method = RequestMethod.GET) |
| public @ResponseBody ResponseEntity<Map<String, Object>> getGithubLoginUrl() { |
| Map<String, Object> result = Maps.newHashMap(); |
| String url = githubLoginHost + "?client_id=" + githubClientId + |
| "&redirect_host=" + githubRedirectHost + "/pulsar-manager/third-party-login/callback/github"; |
| try { |
| result.put("url", URLEncoder.encode(url, StandardCharsets.UTF_8.toString())); |
| result.put("message", "success"); |
| } catch (UnsupportedEncodingException e) { |
| log.error("Url encoding failed, please check: [{}]", url); |
| result.put("message", "Url encoding failed, please check:: " + url); |
| } |
| return ResponseEntity.ok(result); |
| } |
| } |