2015-04-14 3 views
0

Я застрял в миграции oauth1 на oauth2. Я не хочу, чтобы мои пользователи снова предоставляли мне доступ к контактам, поэтому я предпочитаю выполнять миграцию самостоятельно, но мне сложно понять, почему она не работает.Перемещение oauth1 Google на oauth2: Недопустимый заголовок авторизации

Я получаю эту ошибку с сервера Google:

DEBUG - << " "error" : "invalid_request",[\n]" 
DEBUG - << " "error_description" : "Invalid authorization header."[\n]" 

вот мой код, я сделал почти то же самое, когда потребление Google API, но для миграции он не работает.

GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); 
oauthParameters.setOAuthConsumerKey(getConsumerKey()); 
oauthParameters.setOAuthConsumerSecret(getConsumerSecret()); 
oauthParameters.setOAuthToken(token); 

ClassPathResource cpr = new ClassPathResource("mykey.pk8"); 
File file = cpr.getFile(); 
PrivateKey privKey = getPrivateKey(file); 

OAuthRsaSha1Signer signer = new OAuthRsaSha1Signer(privKey); 
GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(signer); 

String requestUrl = "https://www.googleapis.com/oauth2/v3/token"; 

String header = oauthHelper.getAuthorizationHeader(requestUrl, "POST", oauthParameters); 

String payload = "grant_type=urn:ietf:params:oauth:grant-type:migration:oauth1&client_id="+com.app.framework.utils.OAuthHelper.OAUTH2_CLIENT_ID+"&client_secret="+com.app.framework.utils.OAuthHelper.OAUTH2_CLIENT_SECRET; 

HttpClient httpClient = new DefaultHttpClient(); 

HttpPost httpPost = new HttpPost(requestUrl); 
httpPost.addHeader("Authorization", header); 
httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded"); 
httpPost.setEntity(new ByteArrayEntity(payload.getBytes())); 
String response = httpClient.execute(httpPost, new BasicResponseHandler()); 

ответ

0

Ваш запрос не подлежит подписи. Пожалуйста, ознакомьтесь с ответами на this related question для получения подробных инструкций о том, как построить базовую строку для вашего запроса и подписать ее.

Надеюсь, что это поможет!

1

После обмена некоторыми сообщениями с @Miguel он успешно указывает мне на решение.

Вопрос:

OAuthHelper что GoogleOAuthHelper расширяет использует TwoLeggedOAuthHelper построить base_string. TwoLeggedOAuthHelper не вводил 3 требуемых параметра: client_id, client_secret и grant_type в base_string.

Решение:

мне пришлось создать свои собственные классы: копировать/вставить код из OAuthHelper в MyOAuthHelper и от TwoLeggedOAuthHelper к MyTwoLeggedOAuthHelper. Вам нужны некоторые объявления от GoogleOAuthHelper для устранения ошибок компиляции.

MyOAuthHelper позвонит MyTwoLeggedOAuthHelper вместо TwoLeggedOAuthHelper.

Сейчас в MyTwoLeggedOAuthHelper, вокруг линии 79 найдите

Строка baseString = OAuthUtil.getSignatureBaseString (BaseUrl, HTTPMethod ...

и добавьте следующие:

String clientId = "client_id%3DXXX123456789XXX.apps.googleusercontent.com%26"; 
String clientSecret = "client_secret%3DXXXX_XXXX_XX_XX%26"; 
String grantType = "grant_type%3Durn%253Aietf%253Aparams%253Aoauth%253Agrant-type%253Amigration%253Aoauth1%26"; 

baseString = StringUtils.replace(baseString, "token&", "token&" + clientId + clientSecret + grantType); 

Некоторые примечания:

  • client_id и client_secret должен быть один ваш бэкэнд используется для получения OAuth1 обратите внимание на это, особенно если у вас есть несколько «Идентификатор клиента для веб-приложения», определенный в консоли Google.

  • Обратите внимание, что сумасшедший grant_type закодирован дважды.

  • Классы Google, используемые расположены в мавена: COM/Google/GData/ядро ​​/ 1.47.1/ядро-1.47.1.jar

Престижность @Miguel