facebook - ServiceStack OAuth - 注册而不是登录

标签 facebook authentication oauth servicestack

在 servicestack OAuth 实现中,我只看到了自动登录的可能性,例如。 Facebook 帐户。

但是是否能够支持通过 Facebook 登录进行注册过程。我想要的是让用户登录到 facebook 应用程序,然后加载他们的姓名、姓氏和电子邮件,并预先填写所需的文本框以便在我的网站上进行真实注册(因为我还必须进行手机验证等)我不希望用户使用 facebook 登录时要获得授权和身份验证。只有凭据登录才能有效访问完整站点。

编辑:我找到了解决方案。

在 FacebookProvider.cs 中

public override bool IsAuthorized(IAuthSession session, IOAuthTokens tokens, Auth request = null)
{
    if (request != null)
    {
        if (!LoginMatchesSession(session, request.UserName)) return false;
    }
    return tokens != null && session.UserName!=null && !string.IsNullOrEmpty(tokens.AccessTokenSecret);
}

问题在于 && session.UserName!=null 部分。因此我们可以检查用户是否使用凭据登录,这将为 !=null 并且用户可以使用所有服务。如果不是,这将是 ==null 并且他只能从 session 中获取 facebook 信息。

最佳答案

SocialBootstrap API项目显示了通过覆盖 OnAuthenticated() hook of its custom user session 成功验证后处理回调的示例。 :

我删除、重写了一些内容并突出显示了一些重要的部分:

public class CustomUserSession : AuthUserSession
{
    public override void OnAuthenticated(IServiceBase authService, 
                    IAuthSession session, 
                    IOAuthTokens tokens, 
                    Dictionary<string, string> authInfo)
    {
        base.OnAuthenticated(authService, session, tokens, authInfo);

        //Populate matching fields from this session into your own MyUserTable
        var user = session.TranslateTo<MyUserTable>();
        user.Id = int.Parse(session.UserAuthId);
        user.GravatarImageUrl64 = CreateGravatarUrl(session.Email, 64);

        foreach (var authToken in session.ProviderOAuthAccess)
        {
            if (authToken.Provider == FacebookAuthProvider.Name)
            {
                user.FacebookName = authToken.DisplayName;
                user.FacebookFirstName = authToken.FirstName;
                user.FacebookLastName = authToken.LastName;
                user.FacebookEmail = authToken.Email;
            }
            else if (authToken.Provider == TwitterAuthProvider.Name)
            {
                user.TwitterName = authToken.DisplayName;
            }
        }

        //Resolve the DbFactory from the IOC and persist the user info
        using (var db = authService.TryResolve<IDbConnectionFactory>().Open())
        {
            //Update (if exists) or insert populated data into 'MyUserTable'
            db.Save(user);
        }

    }

    //Change `IsAuthorized` to only verify users authenticated with Credentials
    public override bool IsAuthorized(string provider)
    {
        if (provider != AuthService.CredentialsProvider) return false;
        return base.IsAuthorized(provider);
    }
}

基本上,这个用户定义的自定义逻辑(每次成功的身份验证后都会触发)从 UserSession 中提取数据并将其存储在自定义的“MyUserTable”中。

我们还重写了 IsAuthorized 的含义,仅接受已通过 CredentialsAuth 进行身份验证的用户。

您可以使用此数据完成其余的注册。

其他可能的自定义

ServiceStack 的内置 Auth 会保留 AuthData 并自动为您填充 session 。如果您想添加额外的验证断言,您可以简单地使用您自己的自定义 [Authentication] 属性,而不是包含其他自定义逻辑。看一下内置的执行AuthenticateAttribute as a guide .

关于facebook - ServiceStack OAuth - 注册而不是登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12432426/

相关文章:

php - META 描述和 Facebook

oauth - 适用于桌面客户端的 Gmail IMAP OAuth

ios - Facebook iOS SDK : refreshing an expired access token without presenting a dialog

Firefox : "Couldn' t parse invalid source chrome-extension"中的 Facebook JS API 初始化错误

python - Django-Allauth Facebook 集成 - 请求单独发布到用户墙上的权限

android - oData 服务中的安全性(身份验证)

php - 调用未定义函数 session_register()

azure - 来自 Microsoft 的罕见 AADSTS7000215 错误(提供了无效的客户端 key )

facebook - 不可见字符 - ASCII

android - Google 登录 - 尝试访问用户信息时出现 401 错误 "Login Required"