2

我试图让用户在进入我网站的某些部分时重新输入密码。我读过我应该使用“重新验证”授权类型来解决这个问题,但我遇到了两个问题。

  1. 当用户点击“重新验证”按钮时,密码已经填写在“密码”输入框中。

  2. 当用户单击“Reauthentice”按钮然后关闭或单击授权窗口上的取消时,我仍然会收到带有登录数据的响应,基本上它“告诉”我的代码用户已登录。

有没有人遇到过这些问题?这是我的代码的一部分:

<fb:login-button id="facebook-reauth" onclick="return false;">Login with Facebook</fb:login-button>


<script type="text/javascript">
    $(document).ready(function () {
        document.getElementById('facebook-reauth').onclick = function () {
            FB.login(function (response) {
                if (response) {
                    window.location = '/Account/FacebookLogin?isCheckout=false';
                }
                else {
                    window.location = '/';
                }
            }, { scope: 'email', auth_type: 'reauthenticate' });
        };
    });
</script>

编辑:

我尝试更改<fb:login-button />to<div />标记,但它根本没有帮助。

非常感谢!

4

3 回答 3

5
  1. 密码字段可能已预先填写,因为您的浏览器只记住了您的密码,请尝试在浏览器中清除该密码,或尝试使用浏览器不记得的其他电子邮件。

  2. 我认为您只是忘记检查response.authResponse,所以它应该是:

.

FB.login(function (response) {
    if (response.authResponse) {
        window.location = '/Account/FacebookLogin?isCheckout=false';
    }
    else {
        window.location = '/';
    }
}, { scope: 'email', auth_type: 'reauthenticate' });

编辑

是的,你是对的,即使用户取消重新认证,回调也会被执行并且状态是“已连接”。
这可能是一个错误或其他什么,但从我现在所做的测试来看,如果用户成功完成了重新身份验证过程,那么令牌就会更改,所以这应该可以工作:

var oldToken = FB.getAccessToken();

FB.login(function (response) {
    if (response.authResponse && response.authResponse.accessToken != oldToken) {
        window.location = '/Account/FacebookLogin?isCheckout=false';
    }
    else {
        window.location = '/';
    }
}, { scope: 'email', auth_type: 'reauthenticate' });
于 2012-06-26T15:27:46.283 回答
2

除了(或代替)Nitzan 的解决方案之外,还可以在后端添加验证。

如果你打电话:

https://graph.facebook.com/oauth/access_token_info?client_id=CLIENT_ID&access_token=ACCESS_TOKEN

您将收到以下响应:

“访问令牌:...,

token_type: "承载者",

expires_in: 5937,

auth_type: "重新认证"

仅当用户通过授权模式成功重新验证时,auth_type 才会设置为“重新验证”。

还建议验证 expires_in > 0 以确保令牌仍然有效。

于 2013-09-23T20:59:07.117 回答
1
if (response.status === 'connected') {
    /**
     * Even if the user cancels the re-authentication the callback is executed and the status is "connected".
     * This is probably a bug or something, but you can get info about the token and check that.    
     */
    FB.api('/debug_token', {
        input_token: response.authResponse.accessToken
    }, function(token_info) {

        if (typeof token_info.data.metadata != 'undefined') {

            if (token_info.data.metadata.auth_type == "reauthenticate") {

            }
        } else {
            //user did not re-authenticate so do nothing
        }
    });
}
于 2015-06-09T12:45:49.250 回答