Authentication ASP.NET核心WebAPI+;Ionic 2社交媒体认证

Authentication ASP.NET核心WebAPI+;Ionic 2社交媒体认证,authentication,angular,asp.net-web-api,ionic-framework,Authentication,Angular,Asp.net Web Api,Ionic Framework,我按照ASP.NET核心文档中的步骤将Facebook/Google登录添加到我的应用程序: 它工作得很好 问题是我希望有一个离子2客户端应用程序(使用Angular 2)和一个ASP.NET核心API作为后端 在文档中,在我们配置了社交媒体中间件之后,它们的登录按钮神奇地显示在MVC应用程序中 由于ASP.NET核心MVC应用程序和WebAPI本质上是相同的,我想我可以使用这个示例,只是更改前端 我读了很多关于身份验证、Identity Server 4、JWT、OpenID等的书,但这是一

我按照ASP.NET核心文档中的步骤将Facebook/Google登录添加到我的应用程序:

它工作得很好

问题是我希望有一个离子2客户端应用程序(使用Angular 2)和一个ASP.NET核心API作为后端

在文档中,在我们配置了社交媒体中间件之后,它们的登录按钮神奇地显示在MVC应用程序中

由于ASP.NET核心MVC应用程序和WebAPI本质上是相同的,我想我可以使用这个示例,只是更改前端

我读了很多关于身份验证、Identity Server 4、JWT、OpenID等的书,但这是一个非常广泛的主题,我不知道应该专注于什么研究


到目前为止,据我所知,我需要Ionic应用程序向社交提供商进行身份验证。这将生成一个令牌,我应该将其传递给API,然后API将向社交提供商验证该令牌,以授予对其内容的访问权。这个流程正确吗?如何在API中验证收到的令牌?

以下是我使用的解决方案:

1) 有两个身份验证级别 -离子应用 -原料药

2) 当用户登录应用程序时,我使用Firebase身份验证,如果一切正常,它会向我返回一个令牌。此时,用户在应用程序上进行了身份验证,我保存了用于调用API的令牌

3) 当用户需要访问任何资源时,将调用API。这个调用也需要某种身份验证,因为API不是公共的

4) 我得到保存在(2)上的令牌,并将其放入http请求的头中:

let headers = new Headers();

headers.append('Content-Type', 'application/json');
headers.append('Authentication', `${my-saved-token}`);

let options = new RequestOptions({ headers: headers });

return this.http.get(url, options)
            .toPromise()
            .then( .... )
5) 在服务器端(我使用ASP.NETCore),我创建了一个自定义中间件,它读取每个请求的头并查找“身份验证”密钥。如果它不在那里,它只返回401错误,否则它验证令牌,如果它有效,它将请求发送到管道中的下一个中间件。此处未显示验证服务,但我在回答中使用了代码:

在客户端应用程序上,我使用AngularFire2进行身份验证,但请记住,当使用Firebase+AngularFire2时,Ionic 2中不支持他们提供的登录方法

要解决此问题,您必须使用AppBrowser中的
cordova插件和
cordova-plugin-facebook4
。然后,您将通过Facebook插件登录应用程序,获取Facebook身份验证令牌,然后使用此令牌登录Firebase。以下是我的登录方法:

public signInWithFacebook(): firebase.Promise<any>
{
    if (this.platformService.is('cordova'))
    {
        return Facebook.login(['email', 'public_profile']).then(res =>
        {
            const facebookCredential = firebase.auth.FacebookAuthProvider.credential(res.authResponse.accessToken);

            return firebase.auth().signInWithCredential(facebookCredential);
        });
    }
    else
    {
        return this.firebaseAuthenticationService.login(
            {
                provider: AuthProviders.Facebook,
                method: AuthMethods.Popup
            });
    }

}
publicsignwithfacebook():firebase.Promise
{
if(此.platformService.is('cordova'))
{
返回Facebook.login(['email','public_profile'])。然后(res=>
{
const facebookCredential=firebase.auth.FacebookAuthProvider.credential(res.authResponse.accessToken);
返回firebase.auth().signInWithCredential(facebookCredential);
});
}
其他的
{
返回this.firebaseAuthenticationService.login(
{
提供者:AuthProviders.Facebook,
方法:AuthMethods.Popup
});
}
}
正如您在上面的代码中所看到的,如果我检测到我在浏览器上运行,我将使用本机AngularFire2身份验证,如果我在设备上运行,那么我将通过Facebook cordova插件登录,然后将凭据传递给Firebase


答案很大,但我希望我能说清楚。。。如果您还有任何问题,请询问

你能找到解决办法吗?@NaveedAhmed是的,我找到了,但没有直接使用facebook。我使用Firebase身份验证解决了这个问题,Firebase身份验证也支持Facebook和其他社交媒体。你是否使用了ionic 2的Firebase身份验证插件?@Navedahmed当我周二回到办公室时,我会用details@NaveedAhmed不客气…很抱歉你这么大胆,但是。。听起来太棒了,你有这样的GitHub吗?也许可以缩短行程懒惰的-one@TzviGregoryKaidanov是 啊我不知道你就是他。。已经在我的电脑上运行了。非常感谢@TzviGregoryKaidanov我不是他,但这是一个更新的样本。足够好了。谢谢
public signInWithFacebook(): firebase.Promise<any>
{
    if (this.platformService.is('cordova'))
    {
        return Facebook.login(['email', 'public_profile']).then(res =>
        {
            const facebookCredential = firebase.auth.FacebookAuthProvider.credential(res.authResponse.accessToken);

            return firebase.auth().signInWithCredential(facebookCredential);
        });
    }
    else
    {
        return this.firebaseAuthenticationService.login(
            {
                provider: AuthProviders.Facebook,
                method: AuthMethods.Popup
            });
    }

}