现在我正在寻找两天以上的解决方案来解决以下问题。我有一个EmberJS客户端javascript应用程序,它使用我的服务器端Rail RESTful API。授权通过访问令牌完成。
现在,我想让用户也可以使用来自Google,Twitter等的OAuth2登录。 Discourse使用OmniAuth进行第三方登录,但OmniAuth需要服务器端会话。因为我构建了RESTful和无状态API,所以我不想在服务器上使用会话。所以我决定在Google+ Sign-In for server-side apps的帮助下自己构建它,但那里的例子也使用了一个会话。
有没有人有类似问题的解决方案或解决我问题的一些提示?
编辑1
由于OmniAuth不适合我的设置,我开始在Googles help之后为第三方OAuth2登录创建自己的实现。一切都运转良好。但是我没有实施上面提到的谷歌网站上标题1. Create an anti-forgery state token
下解释的CSRF保护。我的问题是,如何在不使用会话的情况下存储此CSRF令牌。是否足以将其存储在数据库中并在以后的谷歌回调请求中查找?
编辑2
我遵循了railscast。如果用户想要使用extern oauth提供程序登录,则有三种可能的情况:
我现在的问题是,在REST API中保存此类信息(authentication,oauth2 csrf-token)服务器端的好方法是什么,而不使用会话。我必须在服务器上保存这些信息,因为用户不应该在客户端操作它们。
也许我也应该为Ember应用程序和两者的可能解决方案创建一个关于令牌和会话身份验证的优缺点的新问题?
这是我的身份验证控制器:
class Api::V1::AuthenticationsController < ApplicationController
def oauth
# redirect to google/twitter/...
login_at(params[:provider])
end
def callback
# callback from provider
provider = params[:provider]
if @user = login_from(provider)
doorkeepter_token = Doorkeeper::AccessToken.create!(:resource_owner_id => @user.id)
@data = {
access_token: doorkeepter_token.token,
user: @user
}
render 'oauth/complete'
else
# user has no account, create a new one
@user = User.new
@user.email = @user_hash[:user_info]['email']
@user.authentications.build(:uid => @user_hash[:uid], :provider => params[:provider])
@user.oauth_pending!
if @user.save
doorkeepter_token = Doorkeeper::AccessToken.create!(:resource_owner_id => @user.id)
@data = {
access_token: doorkeepter_token.token,
user: @user,
errors: @user.errors
}
render 'oauth/complete'
else
render 'oauth/error'
end
end
end
end
答案 0 :(得分:1)
Ember.SimpleAuth仓库中有一个示例,展示了如何将Facebook用作外部身份验证提供程序:https://github.com/simplabs/ember-simple-auth/blob/master/examples/7-external-oauth/index.html。它基本上就像Discourse一样,或者是在2-3个月前做的(不确定是否改变它),而不需要服务器端会话。
支持Google的工作方式基本相同。
答案 1 :(得分:1)
我更新了Facebook Auth示例,以便服务器部分是可选的 - 它现在使用Facebook JS SDK:https://github.com/simplabs/ember-simple-auth/blob/master/examples/7-facebook-auth.html。也许这有助于您了解如何实施Google Auth - 我相信它的工作方式非常相似。
答案 2 :(得分:0)
你见过ember-simple-auth项目吗?它支持OAuth2。