设计Omniauth - 设置&定义策略 [英] Devise Omniauth - setup & defining strategies

查看:379
本文介绍了设计Omniauth - 设置&定义策略的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试过问这个问题,没有找到任何帮助。

  http://stackoverflow.com/questions / 33493369 / rails-devise-omniauth-problems-with-setup 

我放弃了试图解决问题,并创建了一个全新的应用程序,没有其他的,所以我可以尝试减少其他错误干扰的范围。



在我的新应用程序,我现在得到一个我点击新的注册/新用户链接时出错。



我已经按照rails casts教程(已经尝试了大约20个)来获取此设置。 1.5年,我仍然在努力。



问题在于控制器中策略的定义方式。我有4个策略(叽叽witter witter,Facebook,谷歌和链接),而且当我尝试点击这些链接来创建一个新的注册时,我正在收到每一个错误:



对于Twitter:
未知动作
无法为Users :: AuthenticationsController找到twitter动作



Facebook:

 应用程序配置不允许发送URL:应用程序设置不允许一个或多个给定的URL 。它必须与网站URL或Canvas URL匹配,否则域必须是其中一个应用程序域的子域。 

此错误是因为我无法找出Facebook的文档。它显示了如何使用js登录Facebook,我正在尝试在Rails中使用宝石。我不担心这个错误。我认为这与我的网站没有被定义为本地主机有关,尽管我在Facebook的开发者控制台中找不到任何地方但是回调网址。我的问题与这个问题没有关系,我会在另一个时间找到帮助。



对于LinkedIn:

  Safari无法打开该页面https://www.linkedin.com/uas/oauth2/authorization?client_id=LINKEDIN_DEV_ID&redirect_uri=http%3A% 2F%2Flocalhost%3A3000%2Fusers%2Fauth%2Flinkedin%2Fcallback&放大器;放大器; RESPONSE_TYPE =代码&放大器;放大器;范围= r_basicprofile + r_emailaddress&放大器;放大器;状态= 3fef961c10410464cd5b0ca49b25112ce53fb65f1a3c794f。 

错误是:无法解码原始数据(NSURLErrorDomain:-1015)
I有一个oauth2回调定义为:

  http:// localhost:3000 / users / auth / linkedin / callback 

我不知道这里有什么坏处。



Google:

 翻译错误:en.devise.authentications.user.failure 
/ pre>

当我点击此链接时,新的注册视图将刷新,并显示以上错误消息。我不知道是什么原因导致这个错误。



每个错误是不同的。



我的控制器文件夹中有一个名为users的文件夹。里面我有两个控制器如下:



认证控制器:

  class Users :: AuthenticationsController< Devise :: OmniauthCallbacksController 
before_action:set_authentication,only:[:destroy]

def index
@authentications = current_user.authentications if current_user
end


def create
omniauth = request.env [omniauth.auth]
authentication = Authentication.find_by_provider_and_uid(omniauth ['provider'],omniauth ['uid'])
如果身份验证
sign_in_and_redirect_user(:user,authentication.user.profile)

elsif current_user
current_user.authentications.create!(:provider => omniauth ['provider '],:uid => omniauth ['uid'])
redirect_to user.profile_url
else
user = User.new
user.omniauth(omniauth)
如果user.save!
sign_in_and_redirect_user(:user,user.profile)
else
会话[:omniauth] = omniauth.except('extra')
redirect_to new_user_registration_url
end
end
end

def destroy
@ authentication.destroy
respond_to do | format |
format.html {redirect_to root_path}
format.json {head:no_content}
end
end

private
#使用回调共享动作之间的共同设置或约束。
def set_authentication
@authentication = current_user.authentications.find(params [:id])
end

结束



注册控制器:

  class Users :: RegistrationsController< Devise :: RegistrationsController 
#before_filter:check_permissions,:only => [:new,:create,,cancel]
#skip_before_filter:require_no_authentication
#before_action:configure_permitted_pa​​rameters,如果::devise_controller?

def check_permissions
授权! :create,resource
end

def index
如果params [:approved] ==false
@users = User.find_all_by_approved(false)
else
@users = User.all
end
end

def create
super
session [:omniauth] = nil unless @ user.new_record?
end

#这是一个来自SITEPOINT TUTORIAL的建议
#protected

#def configure_permitted_pa​​rameters
#devise_parameter_sanitizer.for(:sign_up) << [:first_name,:last_name]
#end


private
def user_params
params.require(:user).permit(:first_name, last_name,:email,:password)
end

def build_resource(* args)
super
如果会话[:omniauth]
@ user.apply_omniauth (session [:omniauth])
@ user.valid?
end
end

end

用户。 rb有

  devise 
:omniauthable,:omniauth_providers => [:facebook,,linkedin,:twitter,,google_oauth2]


has_many:authentications,:dependent => :delete_all


def apply_omniauth(omniauth)
self.email = auth ['extra'] ['raw_info'] ['email']
authentications.build (:provider => omniauth ['provider'],:uid => omniauth ['uid'],:token => auth ['credentials'] ['token'])
end

def password_required?
(authentications.empty?||!password.blank?)&&超级
结束

在我的routes.rb中我有:

  devise_for:users,
:controllers => {
:registrations => users / registrations,
:omniauth_callbacks => users / authentications
#:omniauth_callbacks => 'users / omniauth_callbacks',
}
get'/ auth /:provider / callback'=> 'users / authentications#create'
get'/ sign_out',:to => 'user / authentications#destroy'

在我的omniauth.rb中我有:

  require'omniauth-facebook'
require'omniauth-google-oauth2'
require'omniauth-twitter'



OmniAuth.config.logger = Rails.logger

Rails.application.config.middleware.use OmniAuth :: Builder do
provider:twitter ,ENV ['TWITTER_KEY'],ENV ['TWITTER_SECRET']
end

Rails.application.config.middleware.use OmniAuth :: Builder do
提供者:facebook,ENV ['FACEBOOK_ID'],ENV ['FACEBOOK_KEY'],
:scope => 'public_profile',info_fields:'id,first_name,last_name,link,email',
:display => 'popup',
:client_options => {:ssl => {:ca_file => '/usr/lib/ssl/certs/ca-certificates.crt'}}

end

Rails.application.config.middleware.use OmniAuth :: Builder do
provider:google_oauth2,ENV ['YT_CLIENT_ID'],ENV ['YT_CLIENT_SECRET'],
scope:'profile',image_aspect_ratio:'square',image_size:48,
#{name:
access_type:'online'
#ENV [GOOGLE_APP_ID],ENV [GOOGLE_APP_SECRET]
#{
#:name = > google,
#:scope => userinfo.email,userinfo.profile,plus.me,http://gdata.youtube.com,
#:prompt => select_account,
#:image_aspect_ratio => square,
#:image_size => 50
#}

end

Rails.application.config.middleware.use OmniAuth :: Builder do
如果Rails.env =='production '
key = ENV [LINKEDIN_PRODUCTION_KEY]
secret = ENV [LINKEDIN_PRODUCTION_SECRET]
else
key =LINKEDIN_DEV_ID
secret =LINKEDIN_DEV_KEY
end

provider:linkedin,key,secret,
:scope => r_basicprofile r_emailaddress,
:field => [id,email-address,first-name,last-name],
:client_options => {:ssl => {:ca_file => '/usr/lib/ssl/certs/ca-certificates.crt'}}
end

在我的新注册/会话视图中,我有:

 <%if devise_mapping.omniauthable? %GT; 
<%= link_to图标('facebook',id:'facebookauth'),user_omniauth_authorize_path(:facebook)%>

<%= link_to图标('google',id:'googleauth'),user_omniauth_authorize_path(:google_oauth2)%>

<%= link_to图标('linkedin',id:'linkedinauth'),user_omniauth_authorize_path(:linkedin)%>

<%= link_to图标('twitter',id:'twitterauth'),user_omniauth_authorize_path(:twitter)%>
<%end%>

我认为这与没有命名策略的身份验证控制器有关。在其他教程中,我已经设置了以下内容(现在已经注释掉了控制器,因为现在使用了一个名为apply_omniauth的方法)。

 #def facebook 
##@user = User.find_for_facebook_oauth(request.env [omniauth.auth])
##if @ user.persisted?
###@ user.send_admin_mail
###@ user.send_user_welcome_mail

##sign_in @user,:event => :认证#this将抛出@user没有激活

##if @ user.profile
##redirect_to profile_path(@ user.profile)
##else
##redirect_to new_profile_path
##end

###sign_in_and_redirect @user,:event => :认证#如果@user没有被激活,这将抛出
###set_flash_message(:notice,:success,:kind =>Facebook)if is_navigational_format?
##else
##session [devise.facebook_data] = request.env [omniauth.auth]
##redirect_to root_path
##end
##end


##def linkedin
##@user = User.find_for_linkedin_oauth(request.env [omniauth.auth])

##if @ user.persisted?
###@ user.send_admin_mail
###@ user.send_user_welcome_mail

##sign_in @user,:event => :验证

##if @ user.profile
##redirect_to profile_path(@ user.profile)
##else
##redirect_to new_profile_path
##end
###set_flash_message(:notice,,success,,kind =>LinkedIn)if is_navigational_format?
##else
##session [devise.linkedin_data] = request.env [omniauth.auth]
##redirect_to root_path
##end
##end


##def twitter
##begin
##@user = User.from_omniauth(request.env ['omniauth.auth'] )
##session [:user_id] = @ user.id
##flash [:success] =欢迎,#{@user.name}!
##rescue
##flash [:warning] =尝试验证您时出现错误...
##end
##redirect_to new_profile_path #root_path
##end

##
#def google_oauth2
##您需要在模型中实现以下方法(例如app / models / user.rb )
#@user = User.find_for_google_oauth2(request.env [omniauth.auth],current_user)

#if @ user.persisted?
#sign_in @user,:event => :认证#this将抛出@user没有激活
#if @ user.profile
#redirect_to profile_path(@ user.profile)
#flash [:notice] = I18n.t devise.omniauth_callbacks.success,:kind => Google
#else
#redirect_to new_profile_path
#end

#else
#session [devise.google_data] = request.env [ omniauth.auth]
#redirect_to new_user_registration_url
#end
#end


$ b $在我完全挖掘轨道投影设置之前,有没有办法使用我已经拥有的代码将当前结构指向命名提供者?



另一个尝试:



所以我放弃了RailsCast。我试图遵循本教程:

  http://willschenk.com/setting-up-devise-with-twitter-and -facebook-and-other-omniauth-schemes-without-email-addresses / 

我很困惑通过引用添加一个称为FormUser的新类。我创建了一个名为form_user.rb的新模型,并按照描述添加了内容。我使用的是Rails 4.我不知道atto-accessor是什么意思,但是在我的文件中我已经证明了这一点。我没有相应的控制器。我也没有在我的用户模型(我认为这属于)中定义了关联。



无论如何,我已经遵循了安装程序,现在得到这个错误: / p>

  TypeError 
超类不匹配类OmniauthCallbacksController

我的应用程序中定义的每个策略都是一样的。



有没有人看到这个特定的错误&有任何提示如何解决它?



我的设置和教程之间的唯一区别是,在我的控制器中,我有一个名为users的文件夹,在那里,我有一个注册控制器和一个omniauth_callbacks控制器。我的路线已被调整以反映此层。

  devise_for:users,class_name:'FormUser',
:controllers => {
:registrations => users / registrations,
#:omniauth_callbacks => users / authentications
:omniauth_callbacks => 'users / omniauth_callbacks',
}
get'/ auth /:provider / callback'=> 'users / authentications#create'
get'/ authentications / sign_out',:to => 'users / authentications#destroy'


devise_scope:user do
get'/ users / auth /:provider / upgrade'=> 'users / omniauth_callbacks#upgrade',as::user_omniauth_upgrade
get'/ users / auth /:provider / setup',:to => 'users / omniauth_callbacks#setup'
end


解决方案

如果其他人正在撕裂头发试图解决这个问题 - 我没有答案如何做,但是我知道轨道卫星是如此之大,他们没有用。上面的代码有几个部分不再匹配gem配置。以下这些教程不会帮助你。在过去的1.5年中,我试图跟随至少20个不同的教程,但尚未找到可以上班的工作。导轨中的错误包括重定向(不需要在许多其他人中引用用户)放弃,如果你依赖于Rails演员,我真的很感激任何人有什么见解,在哪里找到一个CURRENT教程。


I tried asking this question - and didn't find any help.

http://stackoverflow.com/questions/33493369/rails-devise-omniauth-problems-with-setup

I gave up trying to solve the problem and made an entirely new app with nothing else in it so that I could try to reduce the scope for other errors interfering.

In my new app, I now get an error when I click on the new registration/new user link.

I have followed the rails casts tutorials (having tried about 20 others) to get this setup. 1.5 years in and I am still struggling.

The problem is with the way the strategies are defined in the controller. I have 4 strategies (twitter, Facebook, google and linkedin) and am I am currently getting a different error for each of them when I try clicking on the links to create a new registration with those accounts:

For Twitter: Unknown action The action 'twitter' could not be found for Users::AuthenticationsController

For Facebook:

Given URL is not permitted by the Application configuration: One or more of the given URLs is not permitted by the App's settings. It must match the Website URL or Canvas URL, or the domain must be a subdomain of one of the App's domains.

This error is because I can't figure out Facebook's documentation. It shows how to use js to login with Facebook where I am trying to use gems in Rails. I'm not worried about this error. I think it has something to do with my website not being defined as local host, although I can't find anywhere to but a callback url in Facebook's developer console. My question doesn't relate to this problem, I'll find help to sort this out another time.

For LinkedIn:

Safari can’t open the page "https://www.linkedin.com/uas/oauth2/authorization?client_id=LINKEDIN_DEV_ID&amp;redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fusers%2Fauth%2Flinkedin%2Fcallback&amp;response_type=code&amp;scope=r_basicprofile+r_emailaddress&amp;state=3fef961c10410464cd5b0ca49b25112ce53fb65f1a3c794f".

The error is: "cannot decode raw data" (NSURLErrorDomain:-1015) I have an oauth2 callback defined as:

http://localhost:3000/users/auth/linkedin/callback

I don't know what's broken here.

For Google:

translation missing: en.devise.authentications.user.failure

The new registrations view just refreshes when i click this link and an error message says the above. I don't know what's causing this error either.

Each of the errors is different.

I have a folder in my controllers folder called users. Inside that I have two controllers as follows:

Authentications controller:

class Users::AuthenticationsController < Devise::OmniauthCallbacksController
  before_action :set_authentication, only: [:destroy]

  def index
    @authentications = current_user.authentications if current_user
  end


  def create
    omniauth = request.env["omniauth.auth"]
    authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
    if authentication
      sign_in_and_redirect_user(:user, authentication.user.profile)

    elsif current_user
      current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid'])
      redirect_to user.profile_url
    else
      user = User.new
      user.omniauth(omniauth)
      if user.save!
        sign_in_and_redirect_user(:user, user.profile)
      else
        session[:omniauth] = omniauth.except('extra')
        redirect_to new_user_registration_url
      end
    end  
  end

  def destroy
    @authentication.destroy
    respond_to do |format|
      format.html { redirect_to root_path }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_authentication
      @authentication = current_user.authentications.find(params[:id])
    end

end

Registrations controller:

class Users::RegistrationsController < Devise::RegistrationsController 
  #before_filter :check_permissions , :only => [ :new, :create, :cancel ] 
  #skip_before_filter :require_no_authentication 
  # before_action :configure_permitted_parameters, if: :devise_controller?

  def check_permissions
    authorize! :create, resource
  end

  def index
    if params[:approved] == "false"
      @users = User.find_all_by_approved(false)
    else
      @users = User.all
    end
  end

  def create
    super
    session[:omniauth] = nil unless @user.new_record?
  end

  # THIS IS A SUGGESTION FROM SITEPOINT TUTORIAL 
  # protected

  #   def configure_permitted_parameters
  #     devise_parameter_sanitizer.for(:sign_up) << [:first_name, :last_name]
  #   end


  private
    def user_params
          params.require(:user).permit(:first_name, :last_name, :email, :password )
    end

    def build_resource(*args)
        super
        if session[:omniauth]
        @user.apply_omniauth(session[:omniauth])
        @user.valid?
        end
    end  

end

User.rb has

devise
:omniauthable, :omniauth_providers => [:facebook, :linkedin, :twitter, :google_oauth2 ]


 has_many :authentications, :dependent => :delete_all


def apply_omniauth(omniauth)
        self.email = auth['extra']['raw_info']['email']
        authentications.build(:provider => omniauth['provider'], :uid => omniauth['uid'], :token => auth['credentials']['token'])
    end

def password_required?
  (authentications.empty? || !password.blank?) && super
end

In my routes.rb I have:

  devise_for :users,
             :controllers => {
                :registrations => "users/registrations",
                :omniauth_callbacks => "users/authentications"
                # :omniauth_callbacks => 'users/omniauth_callbacks',
           }
  get '/auth/:provider/callback' => 'users/authentications#create'
  get '/sign_out', :to => 'users/authentications#destroy'         

In my omniauth.rb I have:

require 'omniauth-facebook'
require 'omniauth-google-oauth2'
require 'omniauth-twitter'



OmniAuth.config.logger = Rails.logger

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, ENV['TWITTER_KEY'], ENV['TWITTER_SECRET']
end

Rails.application.config.middleware.use OmniAuth::Builder do
   provider :facebook, ENV['FACEBOOK_ID'], ENV['FACEBOOK_KEY'],
     :scope => 'public_profile', info_fields: 'id,first_name,last_name,link,email',
     :display => 'popup',
     :client_options => {:ssl => {:ca_file => '/usr/lib/ssl/certs/ca-certificates.crt'}}

end

Rails.application.config.middleware.use OmniAuth::Builder do
   provider :google_oauth2, ENV['YT_CLIENT_ID'], ENV['YT_CLIENT_SECRET'],
            scope: 'profile', image_aspect_ratio: 'square', image_size: 48,
            # {name: "google_login", approval_prompt: ''},
            access_type: 'online'
            #ENV["GOOGLE_APP_ID"], ENV["GOOGLE_APP_SECRET"]
#   {
#         :name => "google",
#         :scope => "userinfo.email, userinfo.profile, plus.me, http://gdata.youtube.com",
#         :prompt => "select_account",
#         :image_aspect_ratio => "square",
#         :image_size => 50
#       }

end

Rails.application.config.middleware.use OmniAuth::Builder do
   if Rails.env == 'production'
     key = ENV["LINKEDIN_PRODUCTION_KEY"]
     secret = ENV["LINKEDIN_PRODUCTION_SECRET"]
   else
     key = "LINKEDIN_DEV_ID"
     secret = "LINKEDIN_DEV_KEY"
   end

   provider :linkedin, key, secret,
     :scope => "r_basicprofile r_emailaddress", 
     :field => ["id", "email-address", "first-name", "last-name" ],
     :client_options => {:ssl => {:ca_file => '/usr/lib/ssl/certs/ca-certificates.crt'}} 
end

In my new registration/session views, I have:

<% if devise_mapping.omniauthable? %>
                            <%= link_to icon('facebook', id: 'facebookauth'), user_omniauth_authorize_path(:facebook) %>

                            <%= link_to  icon('google', id: 'googleauth'), user_omniauth_authorize_path(:google_oauth2) %>

                            <%= link_to icon('linkedin', id: 'linkedinauth'), user_omniauth_authorize_path(:linkedin) %>

                            <%= link_to icon('twitter', id: 'twitterauth'), user_omniauth_authorize_path(:twitter) %>
                        <% end %>   

I think it has something to do with not having named strategies the authentications controller. In other tutorials, I have set up the following (now commented out of the controller because there is a method called apply_omniauth used now).

# def facebook
#   #   @user = User.find_for_facebook_oauth(request.env["omniauth.auth"])
#   #   if @user.persisted?
#   #     # @user.send_admin_mail
#   #     # @user.send_user_welcome_mail

#   #     sign_in @user, :event => :authentication #this will throw if @user is not activated

#   #     if @user.profile
#   #       redirect_to profile_path(@user.profile)
#   #     else
#   #       redirect_to new_profile_path
#   #     end

#   #     # sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated
#   #     # set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format?
#   #   else
#   #     session["devise.facebook_data"] = request.env["omniauth.auth"]
#   #     redirect_to root_path
#   #   end
#   # end


#   # def linkedin
#   #   @user = User.find_for_linkedin_oauth(request.env["omniauth.auth"])

#   #   if @user.persisted?
#   #     # @user.send_admin_mail
#   #     # @user.send_user_welcome_mail

#   #     sign_in @user, :event => :authentication

#   #     if @user.profile
#   #       redirect_to profile_path(@user.profile)
#   #     else
#   #       redirect_to new_profile_path
#   #     end
#   #     #  set_flash_message(:notice, :success, :kind => "LinkedIn") if is_navigational_format?
#   #   else
#   #     session["devise.linkedin_data"] = request.env["omniauth.auth"]
#   #     redirect_to root_path
#   #   end
#   # end


#   # def twitter
#   #   begin
#   #     @user = User.from_omniauth(request.env['omniauth.auth'])
#   #     session[:user_id] = @user.id
#   #     flash[:success] = "Welcome, #{@user.name}!"
#   #   rescue
#   #     flash[:warning] = "There was an error while trying to authenticate you..."
#   #   end
#   #   redirect_to new_profile_path #root_path
#   # end

#   # #
#   def google_oauth2
#      # You need to implement the method below in your model (e.g. app/models/user.rb)
#      @user = User.find_for_google_oauth2(request.env["omniauth.auth"], current_user)

#      if @user.persisted?
#         sign_in @user, :event => :authentication #this will throw if @user is not activated
#         if @user.profile
#           redirect_to profile_path(@user.profile)
#           flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Google"
#         else
#           redirect_to new_profile_path
#         end

#      else
#        session["devise.google_data"] = request.env["omniauth.auth"]
#        redirect_to new_user_registration_url
#      end
#   end

Before I completely ditch the rails cast setup, is there a way I can point the current structure towards the named providers using the code I already have?

ANOTHER ATTEMPT:

So I ditched the RailsCast. I tried to follow this tutorial:

http://willschenk.com/setting-up-devise-with-twitter-and-facebook-and-other-omniauth-schemes-without-email-addresses/

I'm confused by the reference to adding a new 'class' called FormUser. I made a new model called form_user.rb and added the content as described. I'm using Rails 4. I don't know what atto-accessor means, but I have it in my file as demonstrated. I don't have a corresponding controller. I also don't have associations defined in my user model (which I think this belongs to).

Anyway, I have followed the setup and now get this error:

    TypeError
superclass mismatch for class OmniauthCallbacksController

It's the same for each of the strategies defined in my app.

Has anyone seen this particular error & have any tips for how to resolve it?

The only difference between my setup and the tutorial is that in my controllers, I have a folder called users, in that, I have a registrations controller and an omniauth_callbacks controller. My routes have been adjusted to reflect this layer.

devise_for :users, class_name: 'FormUser',
             :controllers => {
                :registrations => "users/registrations",
                # :omniauth_callbacks => "users/authentications"
                :omniauth_callbacks => 'users/omniauth_callbacks',
           }
  get '/auth/:provider/callback' => 'users/authentications#create'
  get '/authentications/sign_out', :to => 'users/authentications#destroy' 


  devise_scope :user do
    get '/users/auth/:provider/upgrade' => 'users/omniauth_callbacks#upgrade', as: :user_omniauth_upgrade
    get '/users/auth/:provider/setup', :to => 'users/omniauth_callbacks#setup'
  end

解决方案

If anyone else is tearing their hair out trying to figure this out - I don't have the answers for how to do it, but I do know that the Railscasts are so old they are not useful. There are several parts of the code above that no longer match the gem config. Following those tutorials will not help you. Over the past 1.5 years I've tried to follow at least 20 different tutorials and am yet to find one that I can get to work. Errors in the rails cast include the redirect (doesnt require reference to 'user' any more amongst many others. Give up if you're relying on the Rails Cast. I'd really appreciate if anyone has any insights into where to find a CURRENT tutorial.

这篇关于设计Omniauth - 设置&amp;定义策略的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆