对Rails应用程序使用Wordpress身份验证 - 从Rails到Wordpress之间的SSO

时间:2013-11-19 18:50:09

标签: ruby-on-rails wordpress api devise

我们有一位客户想要在他们的用户表的“来源”使用他们当前的Wordpress网站。

(如果它有所不同,rails应用程序将成为Web前端以及iOS和Android前端的主要应用程序界面。)

因此,用户将通过网站登录,并且想法是使用email / pwd对Wordpress进行API调用。它会返回一个成功的身份验证。然后,我会向移动平台发出令牌或类似内容,以允许他们继续访问。

关于如何使认证件在rails之间工作的任何想法 - > WordPress的?

1 个答案:

答案 0 :(得分:1)

如果其他人想要完成同样的事情。这是我解决问题的方法。首先,我的wordpress实例和rails实例位于同一个盒子上,这使得该解决方案可行。

1)我在rails侧使用devise进行身份验证。我已经为"身份验证创建了一个覆盖!"方法,检查wordpress。

require 'devise/strategies/authenticatable'

module Devise
  module Strategies
    class DeviseOverride < Authenticatable
      def valid?
        true
      end

      def authenticate!
        if params[:user]
          user = User.find_by_email(params[:user][:email])
          # user = User.first
          if user # && user.encrypted_password == params[:user][:password]
            #check password with Wordpress to verify it is a good user
            result = WordpressApi.verify_user(params[:user][:email], params[:user][:password])

            if result
              success!(user)
            else
              fail!("Couldn't verify your login. Please try again.")
            end
          else
            fail!("Could not log in")
          end 
        else
          fail!("")
        end 
      end 
    end 
  end 
end

Warden::Strategies.add(:local_override, Devise::Strategies::DeviseOverride)

2)这调用一个简单的方法,我只需调用wordpress实例来验证用户是否存在。 (我试图找到一种方法直接检查数据库表,但WP密码哈希不是我想解决的问题)

3)在wordpress方面(以及其他一些东西):

$user = get_user_by('email', $email);
        // print $user->data->user_email;
        if ($user && wp_check_password( $pwd, $user->data->user_pass, $user->ID) )
            return_json_success('Valid User', 'user', $user);
        else{
            return_json_error('Passwords do not match', 200);
            // print "Password: {$pwd}, User: {$user} UserPass: {$user->data->user_pass}  UserID: {$user->ID}";
            // print 'Passwords do not match';
        }