【发布时间】: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 两者都尝试过。
我尝试了什么
- 尝试使用具有相同参数的 POSTMAN 进行相同的请求,结果正常。
- 尝试不使用redirect_uri
- 尝试使用客户端 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