【问题标题】:Not getting Access token using retrofit2 in android client在android客户端中没有使用retrofit2获取访问令牌
【发布时间】:2017-09-24 20:09:49
【问题描述】:

我没有在 android 客户端中使用 retrofit2 获取访问令牌。 我正在尝试从 google OAuth2 服务器获取访问令牌。我正在从我以前的 getAuthCode API 获取身份验证代码,该 API 是成功的,我使用 POSTMAN 检查获取访问令牌。我收到 Not found(404) 错误。

D/OkHttp: <-- 404  https://www.googleapis.com/o/oauth2/token (95ms)   

这是我的 okHttpClient 代码

public class HttpClient {
private static OkHttpClient.Builder builder;

public static synchronized OkHttpClient getOkHttpClient(){
    try {
    TrustManager[] trustManagers = new TrustManager[]{
            new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {

                }

                @Override
                public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

                }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[0];
                }
            }
    };

        SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null,trustManagers,new SecureRandom());
        SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        builder = new OkHttpClient().newBuilder()
                .sslSocketFactory(sslSocketFactory, (X509TrustManager) trustManagers[0])
                .addInterceptor(httpLoggingInterceptor)
                .hostnameVerifier(new HostnameVerifier() {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                });

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (KeyManagementException e) {
        e.printStackTrace();
    }

    return builder.build();
}
}

这是改造客户端代码

public class RetrofitClient {
private static Retrofit.Builder retrofit = null;

public static Retrofit getRetrofitClient(String baseUrl){

    if(retrofit == null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .client(HttpClient.getOkHttpClient())
                .addConverterFactory(GsonConverterFactory.create());
    }
    return retrofit.build();
}
}

这是界面

@POST("/o/oauth2/token")
@FormUrlEncoded
Call<AccessToken>  getAccessToken(@Field("client_id") String clientId,
                                  @Field("redirect_uri") String redirct,
                                  @Field("client_secret") String secret,
                                  @Field("grant_type") String grantType,
                                  @Field("code") String code
                                  );

这里是调用函​​数

AuthService authService = RetrofitClient.getRetrofitClient("https://accounts.google.com").create(AuthService.class);   
authService.getAccessToken(authCode.getOauthClientId(),redirect,clientPassword,grantType,authCode).enqueue(new Callback<AccessToken>() {
        @Override
        public void onResponse(Call<AccessToken> call, Response<AccessToken> response) {
            Log.d("AccessToken", "............." + response.isSuccessful());
            Log.d("AccessToken",response.message());
            if (response.code() == 200) {
                Log.d("Test", ".............Access Token" + response.body().getAccessToken());
            }
        }

        @Override
        public void onFailure(Call<AccessToken> call, Throwable t) {
            Log.d("Test", ".............Failed " + t.getMessage());
        }
    });

在上面的代码中,我使用了来自控制台的 client_id 和 client_secret,grant_type=authorization_code,auth_code 是我从以前的 API 和 grant_type=urn:ietf:wg:oauth:2.0:oob 获得的,或者只有 oob 两者都尝试过。

我尝试了什么

  1. 尝试使用具有相同参数的 POSTMAN 进行相同的请求,结果正常。
  2. 尝试不使用redirect_uri
  3. 尝试使用客户端 ID 和密码设置基本身份验证

日志

D/OkHttp: --> POST https://www.googleapis.com/o/oauth2/token http/1.1
D/OkHttp: Content-Type: application/x-www-form-urlencoded
D/OkHttp: Content-Length: 221
D/OkHttp: client_id=7********-***********.apps.googleusercontent.com&redirect_uri=oob&client_secret=1-****************&grant_type=authorization_code&code=4%2Fohfz64qAyQY3K3HZc7zBplCCl4uje28RoP5fnFZwIDw
D/OkHttp: --> END POST (221-byte body)
D/OkHttp: <-- 404  https://www.googleapis.com/o/oauth2/token (79ms)
D/OkHttp: cache-control: no-cache, no-store, max-age=0, must-revalidate
D/OkHttp: pragma: no-cache
D/OkHttp: expires: Mon, 01 Jan 1990 00:00:00 GMT
D/OkHttp: date: Thu, 27 Apr 2017 08:38:54 GMT
D/OkHttp: vary: Origin
D/OkHttp: vary: X-Origin
D/OkHttp: content-type: text/html; charset=UTF-8
D/OkHttp: x-content-type-options: nosniff
D/OkHttp: x-frame-options: SAMEORIGIN
D/OkHttp: x-xss-protection: 1; mode=block
D/OkHttp: server: GSE
D/OkHttp: alt-svc: quic=":443"; ma=2592000; v="37,36,35"
D/OkHttp: Not Found
D/OkHttp: <-- END HTTP (9-byte body)

【问题讨论】:

  • 大声笑,404。您的网址错误。不是你的令牌。如果是你的令牌,应该返回 401。
  • 没有正确的 url。我通过 POSTMAN 尝试了同样的方法,也使用 DefaultHttpClient 并且它有效。

标签: android oauth-2.0 retrofit2 google-oauth okhttp


【解决方案1】:

您是否尝试过检查改造请求的日志?例如,可能是标头、请求参数甚至完整的服务 URL,可能与 POSTMAN 请求不同。

检查以下答案以启用登录您的改造请求并将请求与邮递员进行比较: https://stackoverflow.com/a/33256827/4862126

我还发现了可能发生的情况: 404:未找到

  1. 当请求的资源(具有提供的 ID)从未存在时
  2. 访问用户无法访问的 API 时。

回复:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "notFound",
    "message": "Not Found"
   }
  ],
  "code": 404,
  "message": "Not Found"
 }
}

【讨论】:

    【解决方案2】:

    谢谢大家的回答。我发现了我的错误。要使改造对象单例,我正在检查 null,如果它不为 null,我将返回旧的改造对象。所以我的基本 URL 没有更改它坚持第一次设置的基本 URL。

    【讨论】:

      【解决方案3】:

      您的基本 URL 需要以 / 结尾,并且您的服务入口点需要是 @POST("o/oauth2/token")

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-02
        • 2019-05-19
        • 2014-11-06
        • 2021-09-12
        • 1970-01-01
        • 2021-08-31
        • 1970-01-01
        相关资源
        最近更新 更多