Как использовать метод экспресс-публикации с Google Oauth2.0 во время авторизованного URL перенаправления - PullRequest
0 голосов
/ 14 мая 2018

Я человек, который практикует Google oauth2.0. Я создаю пример, но он плохо работает с аутентификацией Oauth.

Во-первых, операция в index.html выглядит следующим образом. Запросите Oauth-токен запроса с помощью простого тега с помощью команды href.

<a href="https://accounts.google.com/o/oauth2/v2/auth?
scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.readonly&access_type=offline&
include_granted_scopes=true&state=state_parameter_passthrough_value&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2FreceiveCode&response_type=code&client_id=665922514832-f7n0s3chgn41vsojtg4gfl2j7c5a5lfr.apps.googleusercontent.com">Using google API
</a>
<form action='http://localhost:3000/user' method='get'>
    <button name="subject" type="submit" value='THIS 123!@# IS GET!!' href='www.google.com'>get</button>
</form>

Авторизованный URI перенаправления здесь: http: // localhost: 3000 / receiveCode.

Я хотел использовать restful API вместо php-файла.

До сих пор это так хорошо работало. Проблема в том, что я не могу использовать Scope после входа на сайт Google. Согласно шагу 5 справки Google https://developers.google.com/identity/protocols/OAuth2WebServer,

сеанс связан с авторизованным URI перенаправления, а затем различные данные, такие как значения кода, отправляются в POST для запроса токена доступа

Однако в receiveCode, который я установил в качестве маршрутизатора, это всегда GET.

Код выглядит следующим образом и URL результата:

http://localhost:3000/receiveCode?state=state_parameter_passthrough_value&code=4/AAAhDsl2wLidOA1Gqq9UzXbeWMe25sYx_8HtXx3_rGgeY9cm5mp2uSvdRBNqF6Da9ScEp0jE10mF_ibibEsM3x4&scope=https://www.googleapis.com/auth/calendar+https://www.googleapis.com/auth/calendar.readonly#

router.get('/receiveCode', (req, res, next) => {
    //NOT ERROR BUT NOT POST
})

router.post('/receiveCode', (req, res, next) => {
    // ERROR (Internal Server Error)
    // actually... never calling enter post method
})

Я не уверен, является ли это структурной проблемой или API, который использует post.

Разве вы не должны использовать restAPI в экспрессе?

1 Ответ

0 голосов
/ 15 мая 2018

Ресурсы, идентифицируемые redirect_uri, действительно должны быть получены с помощью метода HTTP GET, поэтому я думаю, что пока все работает для вас, как задумано.

Отсюда вы сможетеИзвлеките параметры запроса, необходимые для обработки вашей реализации /receiveCode, из переменной req express params свойство , например:

req.params.code

Объяснение

Какмы знаем, GET правильно?

Документы Google не очень понятны, пока вы не посмотрите на пример реализации: https://developers.google.com/identity/protocols/OAuth2WebServer#example

Если вы посмотрите, например, на пример Ruby(приведено ниже), вы можете видеть, что обратный вызов /oauth2callback аналогичен вашему /receiveCode и действительно реализован с помощью GET:

<code>require 'google/apis/drive_v2'
require 'google/api_client/client_secrets'
require 'json'
require 'sinatra'

enable :sessions
set :session_secret, 'setme'

get '/' do
  unless session.has_key?(:credentials)
    redirect to('/oauth2callback')
  end
  client_opts = JSON.parse(session[:credentials])
  auth_client = Signet::OAuth2::Client.new(client_opts)
  drive = Google::Apis::DriveV2::DriveService.new
  files = drive.list_files(options: { authorization: auth_client })
  "<pre>#{JSON.pretty_generate(files.to_h)}
"end get '/ oauth2callback' do client_secrets = Google ::APIClient :: ClientSecrets.load auth_client = client_secrets.to_authorization auth_client.update! (: Scope => 'https://www.googleapis.com/auth/drive.metadata.readonly',: redirect_uri => url (' / oauth2callback ')) if request [' code '] == nil auth_uri = auth_client.authorization_uri.to_s перенаправить на (auth_uri) иначе auth_client.code = request ['code'] auth_client.fetch_access_token!auth_client.client_secret = nil session [: credentials] = auth_client.to_json перенаправление на ('/') end end

Для некоторого дополнительного контекста, здесь приведены соответствующие части спецификации Oauth 2:

https://tools.ietf.org/html/rfc6749#section-4.1.2

https://tools.ietf.org/html/rfc6749#section-4.1.1

https://tools.ietf.org/html/rfc6749#section-3.1.2

...