Плагин воспроизведения, настройка заголовков HTTP HTTP POST

65
6

Вопрос

При использовании Google Plus Sign In Api с Play Framework вы должны устанавливать заголовки по-другому? Что-то я здесь делаю неправильно?

Задний план

Я использую Play Framework (на Java), чтобы использовать знак Google Plus в Api.
Я сталкиваюсь с проблемами на втором этапе аутентификации OAuth, обмениваясь Authorization Code для Token.

Основной поток OAuth

Приятная картина

Перенаправление пользователя на User login/Consent screen
    Это запрашивает у пользователя, хотят ли они предоставить вам разрешение на использование запрашиваемых областей URL: https://accounts.google.com/o/oauth2/auth
Authorization Code Exchange для Token
    Если пользователь предоставит ваше разрешение приложения, они будут перенаправлены на указанный вами URL, в этом URL-адресе (как параметр GET) будет указан Authorization Code. Затем ваше приложение может использовать этот Authoriztion Code чтобы получить Token с сервера Ваше приложение делает это, сделав HTTP-запрос конечной точке на серверах Google (или любой другой сервис, который вы используете)
      URL: https://accounts.google.com/o/oauth2/token
Использовать Token в запросах API Проблема

Чтобы Authorization Code для Token, с помощью Google Plus Sign In Api, вы должны сделать запрос POST на https://accounts.google.com/o/oauth2/token со следующими периметрами

{
"code": "Security Code Returned from Step 1",
"client_id": "Client Id that was given to you in GApi Console",
"client_secret": "Client Secret that was given to you in the GApi Console",
"redirect_uri": "Redirect Uri you specified in the GApi Console",
"grant_type": "authorization_code"
}

Однако, когда я делаю этот запрос со всеми правильными параметрами, я получаю эту ошибку

{
"error" : "invalid_request",
"error_description" : "Required parameter is missing: grant_type"
}

Из Google Plus Войдите в Api

Чтобы сделать HTTP-запросы в Play Framework, вы используете WS Library. Я делаю запрос таким образом

public static F.Promise<Result> OAuthCallback(String state, String code){
/*
Note:
- The GoogleStrategy class is just a class that holds all my GApi credentials
- The parameters (String state, String code) are just GET params from Step 1, returned by the GApi
*/

//Make URL builder
WSRequestHolder requestHolder = WS.url(GoogleStrategy.getTokenUrl);

//Set headers
requestHolder.setHeader("code", code);
requestHolder.setHeader("client_id", GoogleStrategy.clientId);
requestHolder.setHeader("client_secret", GoogleStrategy.clientSecret);
requestHolder.setHeader("redirect_uri", GoogleStrategy.redirectUri);
requestHolder.setHeader("grant_type", GoogleStrategy.grantType);//GoogleStrategy.grantType = "authorization_code"

//Make HTTP request and tell program what to do once the HTTP request is finished
F.Promise<Result> getTokenPromise = requestHolder.post("").map(
new F.Function<WSResponse, Result>() {
public Result apply(WSResponse response){
return ok(response.asJson());//Returning result for debugging
}
}
);

return getTokenPromise;//Return promise, Play Framework will handle the Asynchronous stuff
}

Как вы можете видеть, я устанавливаю заголовок grant_type. Чтобы убедиться, что настройки заголовков работают, я сделал программу, которая выплевывает заголовки запроса в NodeJS (Source), и это было результатом

{
"HEADERS": {
"host": "127.0.0.1:3000",
"code": "4/qazYoReIJZAYO9izlTjjJA.gihwUJ6zgoERgtL038sCVnsvSfAJkgI",
"grant_type": "authorization_code",
"client_secret": "XXXX-CENSORED FOR SECURITY PURPOSES-XXX",
"redirect_uri": "http://127.0.0.1:9000/api/users/auth/google/callback",
"client_id": "XXXX-CENSORED FOR SECURITY PURPOSES-XXX",
"content-type": "text/plain; charset=utf-8",
"connection": "keep-alive",
"accept": "*/*",
"user-agent": "NING/1.0",
"content-length": "14"
}
}

спросил(а) 2021-01-19T14:54:22+03:00 9 месяцев, 1 неделя назад
1
Решение
65

Я думаю, что они не должны быть отправлены в качестве заголовков, а как тело. В приведенной ссылке есть пример:

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=8819981768.apps.googleusercontent.com&
client_secret={client_secret}&
redirect_uri=https://oauth2-login-demo.appspot.com/code&
grant_type=authorization_code

Поэтому передайте их своему post звонку:

StringBuilder sb = new StringBuilder();
sb.append("code=").append(code)
.append("&client_id=").append(GoogleStrategy.clientId)
.append("&client_secret=").append( GoogleStrategy.clientSecret)
.append("&redirect_uri=").append(GoogleStrategy.redirectUri)
.append("&grant_type=").append(GoogleStrategy.grantType)

requestHolder.setContentType("application/x-www-form-urlencoded")
.post(sb.toString());

ответил(а) 2021-01-19T14:54:22+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема