不使用ASP.NET的Facebook OAuth 2.0身份验证

本文关键字:OAuth 身份验证 Facebook ASP NET | 更新日期: 2023-09-27 18:09:24

我正在为iOS和Android开发一个使用Facebook登录的应用程序。用户将使用他们的Facebook凭证在手机上登录,我使用Facebook的GraphAPI来验证他们的身份。我不想存储他们的电子邮件/密码,除非我绝对需要。

经过身份验证后,我可以从Facebook获得无数信息,但我最感兴趣的问题是访问令牌的授权令牌。

由于我的应用程序有一个服务器端组件,我还需要验证这个访问令牌在服务器端是有效的(所以给定访问令牌和Facebook用户id,我应该能够验证这个客户端),否则使用Facebook来认证用户的整个过程是毫无意义的,因为我还需要存储用户的用户名/密码我自己。

我的想法是通过SSL将userId和访问令牌发送到我的服务器,然后使用一个库来验证这些令牌是否有效,并且用户确实是它所说的用户,以便继续进行DB访问和其他与服务器相关的一切。

然而,我很难在。net中找到一个不使用ASP.NET的的库。

是否有任何库可以做这个简单的验证(给定一个授权令牌和一个用户id,告诉我用户是否登录到Facebook,如果是,令牌有效期多长),不需要注入20个不同的dll,不依赖于ASP.NET?

我已经看了一下DotNetOpenAuth,但是(1)它似乎需要相当多的dll来操作,这是一种很好的,虽然不理想,(2)它似乎依赖于ASP。. NET和microsoft库,我强烈希望避免。

我在Mono上运行我的服务器,理想情况下希望避免与ASP做任何事情。. NET,因为它们在过去被证明是非常不稳定的。

许多谢谢,

不使用ASP.NET的Facebook OAuth 2.0身份验证

您可能想尝试像https://oauth.io/home这样的服务,它可以为您处理oAUth的东西。根据文档,一旦您设置好它,您可以简单地使用rest进行身份验证调用。http://docs.oauth.io/simple-server-side-authorization

好吧,我找到了一个简单的方法。

首先,我从NuGet下载了他们的。net库:
<package id="Facebook" version="7.0.6" targetFramework="net40" />

下面是验证用户的过程。

步骤1

获取服务器的访问令牌(这必须在服务启动时完成一次)

var client = new FacebookClient
                    {
                        AppId = appId, // get this from developer.facebook
                        AppSecret = appSecret, // get this from developer.facebook
                    };
dynamic appTokenQueryResponse = client.Get("oauth/access_token"
                                            , new
                                                    {
                                                        client_id = appId,
                                                        client_secret = appSecret,
                                                        grant_type = "client_credentials"
                                                    });
_appAccessToken = appTokenQueryResponse.access_token;
步骤2

使用服务器访问令牌,我们能够对API进行适当的调用,以确保令牌有效。

private FacebookAuthorizationResponse AuthorizeUser(FacebookClient client, string userId, string accessToken)
{
    dynamic expirationToken = client.Get("debug_token", new
                                                            {
                                                                input_token = accessToken,
                                                                access_token = _appAccessToken
                                                            });
    DateTime expiresAt = DateTimeConvertor.FromUnixTime(expirationToken.data.expires_at);
    bool isValid = expirationToken.data.is_valid;
    if (!isValid)
    {
        return new FacebookAuthorizationResponse
                    {
                        IsAuthorized = false,
                    };
    }
    dynamic response = client.Get(userId, new
                                                {
                                                    access_token = accessToken,
                                                    fields = "id,name"
                                                });
    return new FacebookAuthorizationResponse
                {
                    IsAuthorized = isValid,
                    ExpiresAt = expiresAt,
                    Name = response.name
                };
}

,


public class FacebookAuthorizationResponse
{
    public bool IsAuthorized { get; set; }
    public DateTime ExpiresAt { get; set; }
    public string Name { get; set; }
}