Я создаю веб-приложение, в котором у меня есть внешний интерфейс в React JS и внутренний интерфейс в Java Spring Boot. Во внешнем интерфейсе у меня есть кнопка с событием onClick, которое получает / подписывает в бэкэнде. Там (в бэкэнде) у меня есть два метода @GetMapping. Первый - http://localhost:8080/signin, а второй http://localhost:8080/callback. Когда я отлаживаю метод / signin, response.sendRedirect (url) не перенаправляет меня на функцию обратного вызова - / callback. В аккаунте разработчика в твиттере у меня есть хороший набор обратных ссылок, который составляет http://localhost:8080/callback. Кроме того, когда я отлаживаю метод с отображением / входом в систему, я не получаю логин через твиттер. Я не знаю почему. Кто-нибудь может мне помочь?
Вот мой код
Backend
TwitterController
@RestController
public class TwitterController {
@GetMapping("/signin")
public void loginWithTwitter(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey("xxxx")
.setOAuthConsumerSecret("xxx");
TwitterFactory tf = new TwitterFactory(cb.build());
Twitter twitter = tf.getInstance();
request.getSession().setAttribute("twitter", twitter);
try {
StringBuffer callbackURL = request.getRequestURL();
int index = callbackURL.lastIndexOf("/");
callbackURL.replace(index, callbackURL.length(), "").append("/callback");
RequestToken requestToken = twitter.getOAuthRequestToken(callbackURL.toString());
request.getSession().setAttribute("requestToken", requestToken);
response.sendRedirect(requestToken.getAuthenticationURL());
} catch (TwitterException e) {
throw new ServletException(e);
}
}
@GetMapping("/callback")
public void loginWithTwitterCallback(HttpServletRequest request, HttpServletResponse response) throws TwitterException, ServletException, IOException {
Twitter twitter = (Twitter) request.getSession().getAttribute("twitter");
RequestToken requestToken = (RequestToken) request.getSession().getAttribute("requestToken");
String verifier = request.getParameter("oauth_verifier");
AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, verifier);
request.getSession().removeAttribute("requestToken");
}
}
Frontend
LogIn.js
class LogIn extends React.Component {
constructor(props) {
super(props);
this.onTwitterClick = this.onTwitterClick.bind(this);
}
onTwitterClick() {
fetch("/signin", {
method: 'GET'
}).then(response => response.json())
.then(jsonData => {
console.log(jsonData);
});
}
render() {
return(
<div className="login-container">
<div className="login-form-container form-container-shadow form-size">
<div>
<button className="btn btn-primary" onClick={this.onTwitterClick}>
LOGIN WITH TWITTER
</button>
</div>
</div>
</div>
);
}
}
export default withTranslation('common')(LogIn);