OAuth поначалу может быть немного сложным.И это руководство действительно показывает эквивалент использования cURL для тестирования вашего API.
В реальном приложении redirect_uri
- это любая конечная точка в вашем приложении, которая обрабатывает ответ, когда провайдер перенаправляет обратно из авторизации.
Итак, давайте настроим приложение минимального реального рельса.
1.Зарегистрируйте ваше приложение
Зарегистрируйте новое приложение или отредактируйте существующее приложение.Используйте http://localhost:3000/oauth/inaturalist/callback
для URL обратного вызова (при необходимости измените хост).
Держите окно открытым, так как вам понадобится client_id и секрет в данный момент.
2.Настройте ваши маршруты
# /config/routes.rb
Rails.application.routes.draw do
# just make sure you have a root path defined.
root to: 'pages#home'
namespace :oauth do
namespace :inaturalist, controller: :callbacks do
# This is just a simple redirect route
get '/', action: :passthru, as: :authorize
# This is the route that handles the actual callback
get 'callback'
end
end
end
Вы можете сделать это без маршрута перенаправления и просто установить ссылку на URL https://www.inaturalist.org/oauth/authorize...
в своем представлении.Но наличие этого изолирует ваше приложение от сумасшествия, которое есть OAuth и как OmniAuth делает это.
3.Добавьте свои учетные данные в приложение Rails.
В Rails 5 используйте зашифрованные учетные данные для хранения вашего client_id и секрета.
Запустите $ bin/rails credentials:edit
из вашей оболочки.
inaturalist:
client_id: <from the inaturalist site>
secret: <from the inaturalist site>
В более ранних версиях вместо этого используйте ENV vars.
4.Установите камень oauth2
# Place this in your gemfile outside any groups
gem 'oauth2', '~> 1.4', '>= 1.4.1'
Затем запустите bundle install
.
4.Настройте контроллер
# app/controllers/oauth/inaturalist/callbacks_controller.rb
require 'oauth2'
module Oauth
module Inaturalist
class CallbacksController < ::ActionController::Base
# GET /oauth/inaturalist
def passthru
redirect_to client.auth_code.authorize_url
end
# This endpoint is where the provider redirects the user back to
# after authorization.
# GET /oauth/inaturalist/callback
def callback
# Fetch an auth token from the access code
token = client.auth_code.get_token(params[:code])
# Perform an authenticated request to get the users data
api_response = token.get("/users/edit.json")
@user_data = JSON.parse(api_response.body)
# This is just an example of how you can use the user data from
# the provider
@user = {
uid: @user_data["id"],
nickname: @user_data["nickname"]
}
session[:user_id] = @user[:uid]
session[:token] = token.to_hash
redirect_to root_path, success: "Hello #{@user[:nickname]}"
end
private
# Change this if you are not using Rails 5 credentials.
def client
OAuth2::Client.new(
credentials.fetch(:client_id),
credentials.fetch(:secret),
site: "https://www.inaturalist.org",
redirect_uri: oauth_inaturalist_callback_url
)
end
def credentials
Rails.application.credentials.fetch(:inaturalist)
end
end
end
end
token
здесь на самом деле новый экземпляр OAuth2::AccessToken
, который можно вызывать для вызова конечных точек с выбранными учетными данными.
В этом примере токен хранится в сеансе.Вы можете получить его в последующих запросах с помощью:
token = OAuth2::AccessToken.from_hash( session[:token] )
В документе упоминается о обмене токена доступа oauth на токен api для api.inaturalist.org .Но детали довольно редки.
5 Добавьте ссылку для входа в систему:
<%= link_to 'Sign in to iNaturalist.org', oauth_inaturalist_authorize_path %>