标签: facebook-authentication

用于网站的REST API,使用Facebook进行身份验证

我们有一个网站,登录和验证自己的网站的唯一方法是使用Facebook(这不是我的选择).第一次使用Facebook登录时,会自动为您创建一个帐户.

我们现在想为我们的网站创建一个iPhone应用程序,也为其他人创建一个公共API来使用我们的服务.

这个问题是关于如何通过app/API对我们的网站进行身份验证,并分为两部分:

  1. 从API到仅使用Facebook OAuth作为身份验证方法的网站处理REST身份验证的正确方法是什么?

    我已经阅读并研究了很多关于REST API的标准身份验证方法.我们不能通过HTTPS使用Basic Auth等方法,因为没有用户凭证.像这样的东西似乎只是用于使用API​​验证应用程序.

    目前,我认为最好的方法是在API上点击/授权终点,重定向到Facebook OAuth,然后重定向回站点并提供API的用户可以用来验证后续的"令牌"要求.

  2. 对于我们创建的官方应用程序,我们不一定需要以相同的方式使用公共API.那么与我们的网站交流并对用户进行身份验证的最佳方式是什么?

我理解(我认为)如何使用API​​(公共)密钥和秘密(私有)密钥验证使用我们的API的第三方应用程序.但是,当涉及到对正在使用该应用程序的用户进行身份验证时,我对如何进行此操作感到困惑,因为我们必须对用户进行身份验证的唯一方法是Facebook.

我觉得我错过了一些非常明显的东西,或者没有完全理解公共REST API应该如何工作,所以任何建议和帮助将不胜感激.

openid authentication rest facebook facebook-authentication

84
推荐指数
3
解决办法
4万
查看次数

是否可以检查Facebook上是否确认了电子邮件?

更新

这是在2013年12月16日通过https://www.facebook.com/whitehat/report/向Facebook报道的,Facebook 于12月17日回复说该错误早已得到修复.

我用我的Facebook帐户重新测试了这个(我还没有验证电子邮件地址),使用Grap API Explorer工具时,无法使用Graph API或使用FQL查询获取此帐户的电子邮件地址.

结论:使用Graph API或FQL查询从Facebook获得的电子邮件地址是经过验证的电子邮件.如果某个帐户尚未验证其电子邮件,则无法获得该帐户.

原帖

我正在制作一个带有SSO的网络应用程序,用户可以通过Google或Facebook登录.我希望拥有这两种类型帐户的用户在我的系统中显示为同一用户,无论他们使用哪种身份登录.为了实现这一点,我正在考虑使用电子邮件地址作为标识符来了解我是否应该创建一个新帐户或者用户是否已经存在.

为了不引入任何安全问题,我必须知道电子邮件地址已经过验证,并且实际上属于用户.对于Google,userinfo API可以告诉我电子邮件是否已经过验证,因此这里没有问题.但我在Facebook Graph API中找不到这样的东西.

是否有可能知道Facebook上是否确认了电子邮件地址?

我知道有一个verified字段,但这只会告诉帐户是否经过验证而不是电子邮件地址.

起初看起来您只能将图谱API用于已确认电子邮件地址的帐户.如果地址未得到确认,我只是在收到错误时告诉我必须先确认电子邮件地址才能登录任何第三方网站.

然而,对于所有帐户而言,这似乎并非如此.在某些情况下,即使您没有确认的电子邮件地址,也可以访问Facebook的所有部分.例如,当您使用@ myopera.com邮件地址注册时.

当您使用@ myopera.com电子邮件地址注册Facebook时,您会收到一条消息,表明您的帐户在提交注册表单后已暂时锁定.要继续,您需要提供您的电话号码以验证您的帐户并"保持Facebook安全且免受垃圾邮件"(对于屏幕截图中的瑞典语,这是在我进入Facebook并将语言更改为英语之前):

报名参加期间的安全检查

当您提供电话号码时,您已登录,Facebook不会再唠叨您必须验证您的电子邮件地址.

您可以在设置页面上看到尚未验证您的电子邮件地址的唯一位置:

Facebook设置视图与未经证实的电子邮件地址

在您验证电子邮件地址之前通常无法访问的移动设置可用,并列出注册期间输入的电话号码:

Facebook移动设置视图与未经证实的电子邮件地址

除此之外,还可以使用未经证实的电子邮件地址登录第三方站点:

使用未经证实的电子邮件地址登录图形API资源管理器

当我使用此用户连接到图形API时,我可以获得未经证实的电子邮件地址,并且该verified字段按预期返回true,因为我已通过添加电话号码验证了帐户.显然我不相信我从Facebook获得的电子邮件地址真的属于拥有Facebook帐户的用户.

有没有其他方法可以知道电子邮件地址是否经过验证,或者如果我想用它来识别用户,我是否必须自己验证?

security facebook single-sign-on facebook-graph-api facebook-authentication

65
推荐指数
2
解决办法
2万
查看次数

如何在服务器端消费Facebook用户访问令牌?

前言

我正在开发几个Web服务和一些客户端(Web应用程序,移动设备等),它们将通过HTTP与所述服务进行交互.我目前的工作项目是为产品设计身份验证和授权解决方案.我已决定利用外部身份提供商(如Facebook,Google,Microsoft,Twitter等)进行身份验证.

我正试图解决这个问题,"当我的服务器发出请求时,我怎么知道用户是谁以及我怎么能确定?".下面还有更多问题......

要求

  1. 依靠外部身份来表明我正在与谁打交道('userId'基本上就是我所关心的).
  2. 系统应使用基于令牌的身份验证(而不是cookie或基本身份验证).

    我相信这是扩展多个客户端和服务器同时提供松散耦合的正确选择.

工作流程

根据我对基于令牌的身份验证的阅读和理解,以下是我想象的工作流程.现在让我们在Facebook浏览器上关注Facebook.我的假设是其他外部身份提供者应该具有类似的能力,尽管我还没有确认.

请注意,截至撰写时,我的基础是Facebook登录版2.2

  1. 客户:使用JavaScript SDK启动登录Facebook
  2. Facebook:用户验证和批准应用权限(例如访问用户的公开个人资料)
  3. Facebook:向客户发送响应,其中包含用户的访问令牌,ID和签名请求
  4. 客户端:在浏览器会话中存储用户访问令牌(方便地由SDK处理)
  5. 客户端:通过在授权标头中发送用户的访问令牌+用户的ID(可能在自定义标头中),向我的Web服务请求安全资源
  6. 服务器:从请求标头读取用户访问令牌,并通过向Facebook提供的debug_token图形API发送请求来启动验证
  7. Facebook:使用用户访问令牌信息(包含appId和userId)回复服务器
  8. 服务器:通过将appId与预期(自身已知)和userId与客户端请求上发送的内容进行比较,完成对令牌的验证
  9. 服务器:使用请求的资源响应客户端(假设快乐的授权路径)

我想象对于后续的服务器请求会重复步骤5-9(当用户的访问令牌有效时 - 未过期,从FB端撤销,应用权限更改等)

这是一个帮助您完成这些步骤的图表.请理解这个系统不是单页面应用程序(SPA).提到的Web服务是基本上为客户端提供JSON数据的API端点; 它们不提供HTML/JS/CSS(Web客户端服务器除外).

工作流程图

问题

  1. 首先,根据我的前言和要求,所描述的方法是否有任何明显的差距/陷阱?

  2. 是否正在向Facebook执行出站请求,以根据所需/推荐的客户端请求验证访问令牌(上面的步骤6-8)?

    我至少知道,我必须验证来自客户端请求的访问令牌.但是,我不知道在第一次验证后进行后续验证的推荐方法.如果有典型的模式,我很想听听它们.据我所知,根据我的要求,他们可能依赖于应用程序; 但是,我只是不知道该寻找什么.一旦我有了基本想法,我就会进行尽职调查.

    例如,可能的想法:

    • 在第一次验证完成后散列访问令牌+ userId对,并将其存储在分布式缓存中(可由所有Web服务器访问),其到期时间等于访问令牌.根据客户端的后续请求,对访问令牌+ userId对进行散列并检查其是否存在于缓存中.如果存在,则请求被授权.否则,请访问Facebook图形API以确认访问令牌.我假设如果我使用HTTPS(我会这样),这个策略可能是可行的.但是,性能如何比较?

    • 此StackOverflow问题中接受的答案建议在Facebook用户令牌的第一次验证完成后创建自定义访问令牌.然后,自定义令牌将被发送到客户端以用于后续请求.不过,我想知道这是否比上述解决方案更复杂.这需要实现我自己的身份提供者(我想避免的事情,因为我想首先使用外部身份提供者......).这个建议有什么好处吗?

  3. 是signedRequest字段存在于在上述(步骤提到#3的响应此处),相当于签名的请求参数这里在"游戏画布登录"流?

    它们似乎被暗示为等同,因为前者在文档中与后者相关联.但是,我很惊讶在Web文档的"手动构建登录流程" 页面中没有提到游戏页面上提到的验证策略.

  4. 如果#3的答案为"是",那么解码签名的相同身份确认策略是否可以与服务器端预期使用的策略进行比较?

    从FB文档解码和比较

    我不知道是否这可以利用,而不是把所述debug_token图形API的出站呼叫(步骤#6的上方),以确认访问令牌的建议这里:

    来自FB docs的debug_token图形API

    当然,为了在服务器端进行比较,需要将签名的请求部分与请求一起发送到服务器(上面的步骤#5).除了在不牺牲安全性的情况下的可行性之外,我想知道性能与进行出站呼叫相比如何.

  5. 虽然我正处于这种状态,但在什么情况/出于何种目的,您是否会将用户的访问令牌持久存储到数据库中?我没有看到我需要这样做的场景,但是,我可能会忽视某些事情.我很好奇是一些常见的场景可能会引发一些想法.

谢谢!

security authentication facebook facebook-authentication facebook-access-token

64
推荐指数
1
解决办法
2万
查看次数

Facebook OAuth 2.0"代码"和"令牌"

为什么在Facebook OAuth2身份验证流程中需要"代码"和"令牌",如下所述:https://developers.facebook.com/docs/authentication/

如果您查看OAuth对话框参考(https://developers.facebook.com/docs/reference/dialogs/oauth/),您似乎只使用该令牌来获取有关该用户的信息,并且如果您指定response_type参数为tokencode,token,然后您第一次获得令牌.

为什么需要获取"代码"然后使用代码获取"令牌"而不是直接获取令牌?

我想我误解了关于OAuth如何工作的基本信息,但是https://graph.facebook.com/oauth/access_token如果你第一次使用对话框获得令牌,你似乎完全避免了请求.

facebook oauth-2.0 facebook-authentication

61
推荐指数
8
解决办法
3万
查看次数

如何使用Firebase登录多个社交服务?

我希望用户能够使用多个不同的身份验证提供程序(例如Facebook,Twitter或Github)对我的Firebase应用程序进行身份验证.经过身份验证后,我希望用户无论使用哪种身份验证方法都可以访问同一帐户.

换句话说,我想将多个身份验证方法合并到我的应用程序中的单个帐户中.如何在Firebase应用中执行此操作?

authentication facebook-authentication firebase firebase-security

56
推荐指数
2
解决办法
1万
查看次数

何时使用Facebook的新Android SDK 3.0请求权限?

随着Facebook的新Android SDK 3.0(几天前发布),身份验证过程发生了变化.

那么你如何申请阅读权限,例如"friends_hometown"?

以下代码是我试图这样做的 - 但我很确定这不是你应该这样做的方式:

版本1:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Session.openActiveSession(this, true, new Session.StatusCallback() { // start Facebook login
        @Override
        public void call(Session session, SessionState state, Exception exception) { // callback for session state changes
            if (session.isOpened()) {
                List<String> permissions = new ArrayList<String>();
                permissions.add("friends_hometown");
                session.requestNewReadPermissions(new Session.NewPermissionsRequest(FBImport.this, permissions));
                Request.executeGraphPathRequestAsync(session, "me/friends/?access_token="+session.getAccessToken()+"&fields=id,name,hometown", new Request.Callback() {
                    ...
                });
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

版本2:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Session currentSession = Session.getActiveSession();
    if (currentSession == null || currentSession.getState().isClosed()) { …
Run Code Online (Sandbox Code Playgroud)

android facebook facebook-authentication facebook-android-sdk

37
推荐指数
3
解决办法
4万
查看次数

python-social-auth AuthCanceled异常

我在我的Django应用程序中使用python-social-auth通过Facebook进行身份验证.但是当用户尝试登录并且当它被重定向到Facebook应用页面点击"取消"按钮时,会出现以下异常:

ERROR 2014-01-03 15:32:15,308 base :: Internal Server Error: /complete/facebook/
Traceback (most recent call last):
  File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 57, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/apps/django_app/utils.py", line 45, in wrapper
    return func(request, backend, *args, **kwargs)
  File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/apps/django_app/views.py", line 21, in complete
    redirect_name=REDIRECT_FIELD_NAME, *args, **kwargs)
  File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/actions.py", line 54, in do_complete
    *args, **kwargs)
  File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/strategies/base.py", line 62, in complete
    return self.backend.auth_complete(*args, **kwargs)
  File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/backends/facebook.py", line 63, in auth_complete
    self.process_error(self.data)
  File …
Run Code Online (Sandbox Code Playgroud)

python django facebook facebook-authentication python-social-auth

25
推荐指数
4
解决办法
8456
查看次数

在requestNewReadPermissions然后requestNewPublishPermissions之后没有调用StatusCallback

我正在开发一个与Facebook集成的Android应用程序.我想要:

  1. 让用户使用Facebook登录
  2. 在Facebook上获取用户的电子邮件地址(可以是代理的电子邮件地址,这很好)
  3. 代表他/她发布到用户的墙/时间线

从技术上讲,这将是:

  1. 验证用户
  2. 请求email许可
  3. 请求publish_stream许可

1.验证用户

我打电话Session.openActiveSession()Session.StatusCallback(我已经检查过事先没有活动的打开会话):

final Session.StatusCallback sessionStatusCallback = new Session.StatusCallback() {
    public void call(final Session session, SessionState state, Exception exception) {
        // If there is an exception...
        if(exception != null)
        {
            // Handle fail case here.
            return;
        }

        // If session is just opened...
        if(state == SessionState.OPENED)
        {
            // Handle success case here.
            return;
        }
    };
};

// Start Facebook Login.
Session.openActiveSession(activity, true, sessionStatusCallback); …
Run Code Online (Sandbox Code Playgroud)

android facebook facebook-authentication facebook-android-sdk

22
推荐指数
1
解决办法
2万
查看次数

为什么Facebook身份验证SDK的行为因其模式而如此不同?

我在App Store中有一个Android应用。它在后端使用Firebase,并通过Facebook(和Google)提供社交登录。

最近,Facebook联系我,警告我通过Facebook登录时我的应用程序崩溃/无响应。感到困惑,我开始进行一些测试。

我发现,如果我在未安装Facebook应用程序的情况下使用Facebook登录名,则一切运行正常。向用户显示一个浏览器窗口,可以登录,他们被重定向回我的应用程序,并且我具有他们的身份。当然,我在开发过程中发现了所有这些内容,但只是想确认一切仍然正常。

但是,当我安装Facebook应用程序时(在开发过程中我忽略了这一点),我发现它不再起作用。而是,用户被重定向到此页面:

在此处输入图片说明

为了便于搜索和访问,该图像中的文字为:

登录错误:将您登录到此应用程序时出错。请稍后再试。

发生这种情况时,我已经检查了日志,发现以下内容可能相关,但我不确定:

07-05 15:36:28.468   908  5828 I ActivityManager: START u0 {act=NATIVE_WITH_FALLBACK cmp=<<redacted>>/com.facebook.FacebookActivity (has extras)} from uid 10264
07-05 15:36:28.469   665   665 D QCOM PowerHAL: LAUNCH HINT: ON
07-05 15:36:28.470   665   665 D QCOM PowerHAL: Activity launch hint handled
07-05 15:36:28.495  4837  4837 W ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@e64bd3e
07-05 15:36:28.689   665   665 D QCOM PowerHAL: LAUNCH HINT: OFF
07-05 15:36:28.946 29406  4941 W fb4a.BlueServiceQueue: Exception during service
07-05 15:36:28.946 29406 …
Run Code Online (Sandbox Code Playgroud)

android facebook facebook-authentication firebase firebase-authentication

21
推荐指数
2
解决办法
566
查看次数

使用Facebook登录集成的Firebase Auth用户的空电子邮件字段(Firebase 3.0)

我已成功部署了https://firebase.google.com/docs/auth/android/facebook-login中的教程代码,以便将Firebase身份验证登录与Facebook集成.用户已在Firebase Auth控制台中成功创建.

但是,我注意到用户对象中的电子邮件字段为空( - ).奇怪的是,我使用获取的令牌使用GraphRequest直接从提供者结果对象中成功检索了电子邮件信息.

根据我阅读的文档(https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseUser.html#getEmail()),应从登录提供商填充电子邮件字段.

一些额外的奇怪行为:

  1. 成功登录后,将调用onAuthStateChanged两次.firebaseAuth.getCurrentUser().getProviderId()的值在两种情况下都是Firebase
  2. 我尝试从FirebaseUser对象user.getProviderData()列出提供程序.我有两个提供商:firebase和facebook.com
  3. 当我尝试使用FirebaseUser.updateEmail(event.getEmail())更新电子邮件时,我收到此错误:发生了内部错误.[EMAIL_EXISTS]

有什么我想念或做的我做错了吗?

这是我的代码:

public class LoginActivity extends AppCompatActivity {
    private static final String TAG = "LOGIN_ACTIVITY";
    private static final int RC_SIGN_IN = 777;
    private EventBus eventBus;
    private SweetAlertDialog pDialog;

    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;
    private CallbackManager mCallbackManager;
    private ImageView mPasswordVisibilityView;
    private TextView txtPassword;
    private boolean justEnteredAuthStateChanged = false;
    private GoogleApiClient mGoogleApiClient;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());

        setContentView(R.layout.login);

        // Firebase
        mAuth = FirebaseAuth.getInstance();

        mAuthListener …
Run Code Online (Sandbox Code Playgroud)

android facebook-authentication firebase firebase-authentication

20
推荐指数
4
解决办法
1万
查看次数