justauth / JustAuth

🏆Gitee 最有价值开源项目 🚀:100: 小而全而美的第三方登录开源组件。目前已支持Github、Gitee、微博、钉钉、百度、Coding、腾讯云开发者平台、OSChina、支付宝、QQ、微信、淘宝、Google、Facebook、抖音、领英、小米、微软、今日头条、Teambition、StackOverflow、Pinterest、人人、华为、企业微信、酷家乐、Gitlab、美团、饿了么、推特、飞书、京东、阿里云、喜马拉雅、Amazon、Slack和 Line 等第三方平台的授权登录。 Login, so easy!
https://www.justauth.cn
MIT License
16.49k stars 2.77k forks source link

回调时返回400状态码并报错NoSuchMethodError,官方demo返回5000状态码并报错ConnectException #106

Closed pig-who-like-bacon closed 3 years ago

pig-who-like-bacon commented 3 years ago

Issue description

访问

http://192.168.123.211:8000/oauth/render/github

返回

{"status":400,"timestamp":"2020-12-17 09:38:17","message":"Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: okhttp3.RequestBody.create(Ljava/lang/String;Lokhttp3/MediaType;)Lokhttp3/RequestBody;"}

Environment

pom

<dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.3.4</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>me.zhengjie</groupId>
            <artifactId>eladmin-logging</artifactId>
            <version>2.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>me.zhengjie</groupId>
            <artifactId>eladmin-logging</artifactId>
            <version>2.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>me.zhyd.oauth</groupId>
            <artifactId>JustAuth</artifactId>
            <version>1.15.7</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.2.2</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

控制器

package me.zhengjie.rest;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

import cn.hutool.core.collection.CollectionUtil;
import com.xkcoding.http.config.HttpConfig;
import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;
import me.zhengjie.annotation.AnonymousAccess;
import me.zhengjie.annotation.Log;
import me.zhyd.oauth.config.AuthConfig;
import me.zhyd.oauth.enums.scope.*;
import me.zhyd.oauth.exception.AuthException;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.request.*;
import me.zhyd.oauth.utils.AuthScopeUtils;
import me.zhyd.oauth.utils.AuthStateUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;

@RestController
@RequiredArgsConstructor
@Api(tags = "test")
@RequestMapping("/oauth")
public class TestController {

    @Log("test1")
    @RequestMapping("/render/{source}")
    @ResponseBody
    @AnonymousAccess
    public void renderAuth(@PathVariable("source") String source, HttpServletResponse response) throws IOException {
        AuthRequest authRequest = getAuthRequest(source);
        response.sendRedirect(authRequest.authorize(AuthStateUtils.createState()));
    }

    @Log("test2")
    @RequestMapping("/callback/{source}")
    @ResponseBody
    @AnonymousAccess
    public Object login(@PathVariable("source") String source, AuthCallback callback, HttpServletRequest request) {
        AuthRequest authRequest = getAuthRequest(source);
        return authRequest.login(callback);
    }

    /**
     * 根据具体的授权来源,获取授权请求工具类
     *
     * @param source
     * @return
     */
    private AuthRequest getAuthRequest(String source) {
        AuthRequest authRequest = null;
        System.out.println(source.toLowerCase());
        switch (source.toLowerCase()) {
            case "github":
                authRequest = new AuthGithubRequest(AuthConfig.builder()
                        .clientId("2ef9e8961eaca3d86802")
                        .clientSecret("4f52aebde01730c64d1f1ade55eb8fd55993b929")
                        .redirectUri("http://192.168.123.211:8000/oauth/callback/github")
                        .scopes(AuthScopeUtils.getScopes(AuthGithubScope.values()))
                        // 针对国外平台配置代理
                        .httpConfig(HttpConfig.builder()
                                .timeout(15000)
                                .proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 10080)))
                                .build())
                        .build());
                break;
            default:
                break;
        }
        if (null == authRequest) {
            throw new AuthException("未获取到有效的Auth配置");
        }
        return authRequest;
    }
}

error

at me.zhyd.oauth.utils.HttpUtils.post(HttpUtils.java:55)
    at me.zhyd.oauth.request.AuthDefaultRequest.doPostAuthorizationCode(AuthDefaultRequest.java:214)
    at me.zhyd.oauth.request.AuthGithubRequest.getAccessToken(AuthGithubRequest.java:39)
    at me.zhyd.oauth.request.AuthDefaultRequest.login(AuthDefaultRequest.java:80)
    at me.zhengjie.rest.TestController.login(TestController.java:60)

调试过很多次了,也尝试过hutool-all以及官网上的三种依赖都尝试过了,但回调时始终返回这个错误。 有一次还返回 illegal code,清理了一下缓存就恢复原状了。 我是已eladmin作为手脚架进行开发的。

pig-who-like-bacon commented 3 years ago

屏幕截图(66)

在尝试官方dome后报错

已启动: http://localhost:8443
2020-12-18 00:41:01 [org.apache.juli.logging.DirectJDKLog:173] INFO  - Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-12-18 00:41:01 [org.springframework.web.servlet.FrameworkServlet:524] INFO  - Initializing Servlet 'dispatcherServlet'
2020-12-18 00:41:01 [org.springframework.web.servlet.FrameworkServlet:546] INFO  - Completed initialization in 11 ms
2020-12-18 00:41:04 [me.zhyd.justauth.RestAuthController:56] INFO  - 进入render:github
2020-12-18 00:41:05 [io.lettuce.core.EpollProvider:68] INFO  - Starting without optional epoll library
2020-12-18 00:41:05 [io.lettuce.core.KqueueProvider:70] INFO  - Starting without optional kqueue library
2020-12-18 00:41:05 [me.zhyd.justauth.RestAuthController:59] INFO  - https://github.com/login/oauth/authorize?response_type=code&client_id=2ef9e8961eaca3d86802&redirect_uri=http://192.168.123.211:8443/oauth/callback/github&state=4b0adf353f8ef0fb69ce1f63a35b5e26&scope=repo%3Astatus%20repo_deployment%20public_repo%20repo%3Ainvite%20security_events%20write%3Arepo_hook%20read%3Arepo_hook%20admin%3Aorg%20write%3Aorg%20read%3Aorg%20admin%3Apublic_key%20write%3Apublic_key%20read%3Apublic_key%20gist%20notifications%20user%20read%3Auser%20user%3Aemail%20user%3Afollow%20delete_repo%20write%3Adiscussion%20read%3Adiscussion%20write%3Apackages%20read%3Apackages%20delete%3Apackages%20admin%3Agpg_key%20write%3Agpg_key%20read%3Agpg_key%20workflow
2020-12-18 00:41:08 [me.zhyd.justauth.RestAuthController:68] INFO  - 进入callback:github callback params:{"code":"926928c96d98a7ae58c2","state":"4b0adf353f8ef0fb69ce1f63a35b5e26"}
2020-12-18 00:41:08 http-nio-8443-exec-5 me.zhyd.oauth.log.Log(error:45) [ERROR] - Failed to login with oauth authorization.
cn.hutool.core.io.IORuntimeException: ConnectException: Connection refused (Connection refused)
    at cn.hutool.http.HttpRequest.send(HttpRequest.java:1072)
    at cn.hutool.http.HttpRequest.execute(HttpRequest.java:936)
    at cn.hutool.http.HttpRequest.execute(HttpRequest.java:902)
    at com.xkcoding.http.support.hutool.HutoolImpl.exec(HutoolImpl.java:56)
    at com.xkcoding.http.support.hutool.HutoolImpl.post(HutoolImpl.java:121)
    at com.xkcoding.http.HttpUtil.post(HttpUtil.java:141)
    at me.zhyd.oauth.utils.HttpUtils.post(HttpUtils.java:55)
    at me.zhyd.oauth.request.AuthDefaultRequest.doPostAuthorizationCode(AuthDefaultRequest.java:214)
    at me.zhyd.oauth.request.AuthGithubRequest.getAccessToken(AuthGithubRequest.java:39)
    at me.zhyd.oauth.request.AuthDefaultRequest.login(AuthDefaultRequest.java:80)
    at me.zhyd.justauth.RestAuthController.login(RestAuthController.java:70)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.ConnectException: Connection refused (Connection refused)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.Socket.connect(Socket.java:607)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient$1.run(HttpClient.java:515)
    at sun.net.www.http.HttpClient$1.run(HttpClient.java:513)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.net.www.http.HttpClient.privilegedOpenServer(HttpClient.java:512)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:553)
    at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264)
    at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1205)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1340)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1315)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:264)
    at cn.hutool.http.HttpConnection.getOutputStream(HttpConnection.java:454)
    at cn.hutool.http.HttpRequest.sendFormUrlEncoded(HttpRequest.java:1093)
    at cn.hutool.http.HttpRequest.send(HttpRequest.java:1062)
    ... 64 more
2020-12-18 00:41:08 [me.zhyd.justauth.RestAuthController:71] INFO  - {"code":5000,"msg":"ConnectException: Connection refused (Connection refused)"}

同样是回调时 AuthResponse<AuthUser> response = authRequest.login(callback); 报的错。

zhangyd-c commented 3 years ago
  1. github 调试的时候尝试开一下V皮嗯。
  2. 如果你开启了 V 皮 嗯, 要检查你的 V 皮 en 工具的代理端口是否为 10080(每个代理工具的端口都不一样)
  3. 项目中用到了 https://github.com/xkcoding/simple-http 依赖,默认会按照下面的优先级自行寻找底层实现,java 11 HttpClient -> OkHttp3 -> apache HttpClient -> hutool-http。所以要确保你项目中的 okhttp(如果用到) 版本是否有冲突或者版本较低,建议将 okhttp 升级到最新版
zhangyd-c commented 3 years ago

已经测试完成,三种依赖都已试过,没有问题。 请按照上面的步骤检查一下你本地配置

tygithub1 commented 3 years ago

我也遇到同样的问题,找了好久,反正就是把自己项目的依赖理一下,我自己的项目是:minio,qiniuyun里面有okhttp的引用,但是他们的版本比较低,我把它做了个排除 重新引入新的okhttp就可以了