我希望匹配state/city路径中的模式,除非状态变量等于"auth"
match '/:state/:city' => 'cities#index', :as => :state_cities, :constraints => {:state => /(?!auth)/ }
Run Code Online (Sandbox Code Playgroud)
例如,mydomain.com/fl/miami很好.mydomain.com/auth/twitter不好.
我正在使用omniauth,它要求你/auth/twitter进行身份验证,但是当我输入时无处可寻rake routes.
我正在开发一个rails应用程序,允许用户使用omniauth通过facebook/twitter/linkedin登录.到目前为止,用户可以使用身份验证进行注册和创建帐户,但是他们必须通过验证,然后转发到注册页面,在那里他们必须输入有效的名称,用户名和电子邮件.如果可能的话,我希望使用request.env ["omniauth.auth"]哈希填写这些字段.
这是我的代码:
authentications_controller.rb
user = User.new
user.apply_omniauth(omniauth)
if user.save
flash[:notice] = "Signed in successfully."
sign_in_and_redirect(:user, user)
else
session[:omniauth] = omniauth.except('extra')
redirect_to new_user_registration_url
end
Run Code Online (Sandbox Code Playgroud)
registrations_controller.rb:
def build_resource(*args)
super
if session[:omniauth]
@user.apply_omniauth(session[:omniauth])
@user.valid?
end
end
Run Code Online (Sandbox Code Playgroud)
user.rb:
def apply_omniauth(omniauth)
self.name = omniauth['user_info']['name'] if name.blank?
self.email = omniauth['user_info']['email'] if email.blank?
authentications.build(:provider => omniauth['provider'], :uid => omniauth['uid'])
end
Run Code Online (Sandbox Code Playgroud)
这条线:
self.email = omniauth['user_info']['email'] if email.blank?
Run Code Online (Sandbox Code Playgroud)
导致此NoMethodError:
undefined method `[]' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
会话[:omniauth]正在apply_omniauth方法中从注册控制器传递到omniauth.如何在此会话中访问姓名和电子邮件?
谢谢
我正在开发一个Sinatra应用程序,我想使用OmniAuth.到目前为止,我对Web应用程序有类似的东西:
http://codebiff.com/omniauth-with-sinatra
我希望网络应用程序可以通过Android手机使用,它将使用API,通过令牌进行身份验证.这里似乎很好地介绍了API的开发:
目前尚不清楚的是我可能会安排登录程序.据推测,它将沿着这些方向:
关于如何管理第3点,我不是很清楚 - 有没有人有任何建议?
在我的身份验证过程的回调中:
auth_hash = request.env['omniauth.auth']
然后,我正在提取用户ID,但是有可能同时获取用户的姓名和电子邮件地址吗?
我已经将Rails应用程序部署到VPS服务器,并且我正在使用Nginx/Unicorn组合,一切正常,除了由于某种原因超出我的理解,Omniauth回调重定向错误,
即.
http://unicorn/users/auth/linkedin/callback?oauth_token=95218ed3-b426-45ab-b022-693d2a2447cb&oauth_verifier=25955
Run Code Online (Sandbox Code Playgroud)
它应该是:
http://my-real-domain.com/users/auth/linkedin/callback?oauth_token=95218ed3-b426-45ab-b022-693d2a2447cb&oauth_verifier=25955
Run Code Online (Sandbox Code Playgroud)
怎么了?为什么回调使用nginx中定义的上游名称?
upstream unicorn {
server unix:/tmp/unicorn.todo.sock fail_timeout=0;
}
server {
listen 80;
listen [::]:80 ipv6only=on default_server;
root /home/deploy/work/project/current/public;
index index.html index.htm;
server_name my-real-domain.com;
try_files $uri/index.html $uri @unicorn;
location @unicorn {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://unicorn;
}
error_page 500 502 503 504 /500.html;
location ~ ^/assets/ {
expires 1y;
add_header Cache-Control public;
add_header ETag "";
break;
}
}
Run Code Online (Sandbox Code Playgroud)
请你帮助我好吗?我需要知道如何克服这种错误的重定向.
提前致谢!
我在我的Rails应用程序中使用omniauth-coinbase和coinbase-ruby.
在我的应用程序中,用户通过Coinbase登录,生成一个code然后我转为a access_token和a refresh_token.
然后,我在变量下创建一个新的OAuth客户端coinbase,它具有完整的功能.
user_credentials = {
:access_token => access_token,
:refresh_token => refresh_token,
:expires_at => Time.now + 1.day
}
coinbase = Coinbase::OAuthClient.new(ENV['COINBASE_CLIENT_ID'], ENV['COINBASE_CLIENT_SECRET'], user_credentials)
Run Code Online (Sandbox Code Playgroud)
这是问题开始的地方:
我存储access_token和refresh_token对用户模型作为字符串,以便当用户回来,我既可以使用两个活动令牌或使用refresh_token产生两个新的标记,如节中提到这里的"访问令牌和刷新令牌"
Coinbase公开了一个refresh!我可以在我的coinbaseOAuth实例上调用的方法,它应该给我两个新的标记.
refresh!正常工作后,我产生一个新的OAuth客户端,但不是当我拉从数据库中现有的标记(有效或无效)关闭用户模式,创建一个user_credentials哈希如上所述,实例化一个新的OAuth客户端,然后调用refresh!上.
据我所知,我的研究access_token到期了.我使用refresh_token随时随地获得新的access_token和新的refresh_token.所以在我看来,我应该能够实例化一个新的OAuth客户端,给它两个键并运行一个refresh!让我恢复正常工作并能够对Coinbase API进行有效调用.
任何人都可以帮助我解决我可能做错的事情吗?谢谢!
我得到的错误refresh!如下:
OAuth2::Error: invalid_request: The request …Run Code Online (Sandbox Code Playgroud) 我正在尝试从Rails 4.1.11升级到4.1.16.升级后,我的几个SessionsController规范都失败了.但是当我尝试登录开发环境时,一切似乎都运行正常.
我有以下代码:
# sessions_controller.rb
def create
@identity = Identity.find_or_create(auth)
...
end
protected
def auth
request.env["omniauth.auth"]
end
# identity.rb
class Identity < ActiveRecord::Base
...
def self.find_or_create(auth)
where(auth.slice(:uid, :provider)).first_or_create
end
end
Run Code Online (Sandbox Code Playgroud)
在我的规范中,我使用fixture spec_helper.rb来提供OmniAuth哈希:
# spec_helper.rb
OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new({
:provider => 'facebook',
:uid => '1234567',
:info => {
:email => 'joe@bloggs.com',
...
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用OmniAuth属性来查找用户的身份时,我得到一个ForbiddenAttributesError:
1) SessionsController GET :create not yet signed in sets the user ID in the session hash
Failure/Error: get :create
ActiveModel::ForbiddenAttributesError:
ActiveModel::ForbiddenAttributesError
# /Users/pat/.rvm/gems/ruby-2.1.2/gems/activemodel-4.1.6/lib/active_model/forbidden_attributes_protection.rb:21:in `sanitize_for_mass_assignment' …Run Code Online (Sandbox Code Playgroud) 我刚刚按照这篇文章在我的Rails 4应用程序中实现omniauth。
在我的用户模型中,我有两种类型的用户,即ADMIN(由表单创建)和MEMBER(由omniauth创建)。我需要绕过将由omniauth创建的MEMBER用户的所有验证。
我知道可以通过传递此选项来完成:
save(validate: false)
Run Code Online (Sandbox Code Playgroud)
但是,采用了first_or_create方法:
def self.from_omniauth(auth)
# where(auth.slice(:provider, :uid)).first_or_create do |user|
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.email = auth.info.email
user.password = Devise.friendly_token[0,20]
user.name = auth.info.name # assuming the user model has a name
user.image = auth.info.image # assuming the user model has an image
end
end
Run Code Online (Sandbox Code Playgroud)
因此,我的问题是:在这种omniauth情况下,如何绕过所有验证?
请指教。
所以我使用omniauth-facebook使用Facebook创建登录.
这是我的sessions_controller.rb
class SessionsController < ApplicationController
def create
user = User.from_omniauth(env["omniauth.auth"])
session[:user_id] = user.id
redirect_to "/sessions/menu"
end
def destroy
session[:user_id] = nil
redirect_to root_url
end
def new
end
def menu
puts user.name
end
end
Run Code Online (Sandbox Code Playgroud)
不幸的是我不知道如何在菜单操作中访问用户变量.你们怎么建议我这样做?
更新
class SessionsController < ApplicationController
def create
@user = User.from_omniauth(env["omniauth.auth"])
session[:user_id] = @user.id
redirect_to "/sessions/menu"
end
def destroy
session[:user_id] = nil
redirect_to root_url
end
def new
end
def menu
puts @user
end
end
Run Code Online (Sandbox Code Playgroud)
即使我像这样更新它,它也行不通
我正在研究来自http://www.theodinproject.com/ruby-on-rails/final-project的facebook克隆项目.
我被omniauth-facebook部分困住了,我无法成功登录facebook.我认为问题可能是由于request.env ["omniauth.auth"].当我尝试提出request.env ["omniauth.auth"].to_yaml时.我得到以下不完整的哈希.它缺少很多信息,例如first_name,last_name,gender等.
--- !ruby/hash:OmniAuth::AuthHash
provider: facebook
uid: '10206926404981253'
info: !ruby/hash:OmniAuth::AuthHash::InfoHash
name: Thomas Pan
image: http://graph.facebook.com/10206926404981253/picture
credentials: !ruby/hash:OmniAuth::AuthHash
token: <token>
expires_at: 1442277104
expires: true
extra: !ruby/hash:OmniAuth::AuthHash
raw_info: !ruby/hash:OmniAuth::AuthHash
name: Thomas Pan
id: <id>
Run Code Online (Sandbox Code Playgroud)
**用<>替换了一些信息以确保安全性.
我也在使用它和设计.
其他所有东西似乎都设置正确,因为我按照这里的说明进行设计和omniauth-facebook.https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview
user.rb
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:omniauthable, :omniauth_providers => [:facebook]
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.email = auth.info.email
user.password = Devise.friendly_token[0,20]
user.first_name = auth.info.first_name
user.last_name = auth.info.last_name
user.gender = auth.extra.raw.gender
end
end
Run Code Online (Sandbox Code Playgroud)
devise.rb
config.omniauth :facebook, …Run Code Online (Sandbox Code Playgroud)