如何在 Blazor 客户端中正确获取 facebook 登录令牌?
How to get facebook login token in Blazor Client properly?
应用是Blazor客户端,尝试实现facebook身份验证。
按照 facebook 指南,我有以下代码:
JS部分:
window.fbAsyncInit = function () {
FB.init({
appId: '...',
autoLogAppEvents: true,
xfbml: true,
version: 'v7.0'
});
// To don't call the FB.login directly
function login() {
FB.login(function (response) {
if (response.authResponse) {
console.log('Welcome! Fetching your information.... ');
var accessToken = response.authResponse.accessToken;
console.log(accessToken.getToken());
//location.href = "REDIRECT_TO.php";
//await callbackMethod.invokeMethodAsync('Callback', accessToken);
}
else {
console.log('User cancelled login or did not fully authorize.');
//await callbackMethod.invokeMethodAsync('Callback', 'xx');
}
});
FB.getLoginStatus(function (response) {
if (response.status === 'connected') {
var accessToken = response.authResponse.accessToken;
return accessToken;
}
});
}
};
C# 部分:
public async Task FBLogin()
{
var reference = DotNetObjectReference.Create(this);
await jsRuntime.InvokeVoidAsync("FB.login", reference);
}
[JSInvokable("Callback")]
public void Callback(object token)
{
// things to do..
}
问题一。
可以直接从 js 同步检索任何值到 C# 吗? (只有异步访问js)
问题二。
使用回调函数是检索令牌的正确方法吗?在哪里放置 "callbackMethod" 作为参数? (我不是 js 专家,我尝试了所有方法并且 none 有效)。
在没有通过参考的情况下,登录工作正常。当我通过时显示以下错误消息:
首先在你的blazor webassembly项目中的“wwwroot/js/”中创建一个javascript文件,并将其命名为“fbInit.js”,将这段代码放入文件中:
window.fbAsyncInit = function () {
window.FB.init({
appId: 'your-fb-app-id',
cookie: true,
xfbml: true,
version: 'v7.0'
});
window.FB.AppEvents.logPageView();
};
(function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) { return; }
js = d.createElement(s); js.id = id;
js.src = "https://connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
现在在“wwwroot/js”中创建另一个 javascript 文件并将其命名为“fbLogin.js”,将此代码放入文件中:
window.fbLogin = function() {
window.FB.login(function (response)
{
if (response.status === 'connected') {
//console.log(response)
} else {
console.log("No se logeo");
}
DotNet.invokeMethodAsync('WebClient-Blazor', 'FbLoginProcessCallback', response);
}, { scope: 'public_profile, email' });
}
现在你需要在你的 webassembly 项目的“wwwroot/index.html”文件中声明这些脚本的存在,这样做:
<script src="_framework/blazor.webassembly.js"></script>
<!--put it below blazor.webassembly.js declaration -->
<script src="js/fbInit.js"></script>
<script src="js/fbLogin.js"></script>
现在在您的“shared/MainLayout.razor”文件中,插入此代码:
protected override async Task OnInitializedAsync()
{
base.OnInitialized();
await JSRuntime.InvokeVoidAsync("fbAsyncInit");
}
记得在启动 razor 文件的代码部分之前注入 IJSRuntime 接口,只需将此依赖项注入插入:
@inject IJSRuntime jsRuntime
@code
{
//all your razor code
}
最后,在您的登录组件或页面中,您的按钮将执行 Facebook 登录,创建此异步方法并从自定义 facebook 按钮的 @onclick 方法调用它:
public async Task FbLoginProcess()
{
await JSRuntime.InvokeAsync<object("fbLogin");
}
如果您想从 javascript 代码中回调您的 c# 代码并传递 facebook 登录结果,请添加此其他方法。
[JSInvokable("FbLoginProcessCallback")]
public static void FbLoginProcessCallback(object result)
{
Console.WriteLine(result);
}
javascript 函数“fbLogin”将 return Facebook Response 对象到您的 C#“FbLoginProcessCallback”函数,您可以随意使用它,也许可以创建一个 httpclient post 请求您自己的 API 或使用 Blazor NavigationManager 重定向到另一个页面或仅将其保存在您的本地存储对象中。
希望这个回答对您有所帮助。
有关 JSInterop 的更多信息,click here!
我不是所有者,但发现了在 jwt 令牌上完全使用 Twitter、Facebook(Google 目前不工作)webassembly 的很好的例子
应用是Blazor客户端,尝试实现facebook身份验证。
按照 facebook 指南,我有以下代码:
JS部分:
window.fbAsyncInit = function () {
FB.init({
appId: '...',
autoLogAppEvents: true,
xfbml: true,
version: 'v7.0'
});
// To don't call the FB.login directly
function login() {
FB.login(function (response) {
if (response.authResponse) {
console.log('Welcome! Fetching your information.... ');
var accessToken = response.authResponse.accessToken;
console.log(accessToken.getToken());
//location.href = "REDIRECT_TO.php";
//await callbackMethod.invokeMethodAsync('Callback', accessToken);
}
else {
console.log('User cancelled login or did not fully authorize.');
//await callbackMethod.invokeMethodAsync('Callback', 'xx');
}
});
FB.getLoginStatus(function (response) {
if (response.status === 'connected') {
var accessToken = response.authResponse.accessToken;
return accessToken;
}
});
}
};
C# 部分:
public async Task FBLogin()
{
var reference = DotNetObjectReference.Create(this);
await jsRuntime.InvokeVoidAsync("FB.login", reference);
}
[JSInvokable("Callback")]
public void Callback(object token)
{
// things to do..
}
问题一。 可以直接从 js 同步检索任何值到 C# 吗? (只有异步访问js)
问题二。 使用回调函数是检索令牌的正确方法吗?在哪里放置 "callbackMethod" 作为参数? (我不是 js 专家,我尝试了所有方法并且 none 有效)。
在没有通过参考的情况下,登录工作正常。当我通过时显示以下错误消息:
首先在你的blazor webassembly项目中的“wwwroot/js/”中创建一个javascript文件,并将其命名为“fbInit.js”,将这段代码放入文件中:
window.fbAsyncInit = function () {
window.FB.init({
appId: 'your-fb-app-id',
cookie: true,
xfbml: true,
version: 'v7.0'
});
window.FB.AppEvents.logPageView();
};
(function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) { return; }
js = d.createElement(s); js.id = id;
js.src = "https://connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
现在在“wwwroot/js”中创建另一个 javascript 文件并将其命名为“fbLogin.js”,将此代码放入文件中:
window.fbLogin = function() {
window.FB.login(function (response)
{
if (response.status === 'connected') {
//console.log(response)
} else {
console.log("No se logeo");
}
DotNet.invokeMethodAsync('WebClient-Blazor', 'FbLoginProcessCallback', response);
}, { scope: 'public_profile, email' });
}
现在你需要在你的 webassembly 项目的“wwwroot/index.html”文件中声明这些脚本的存在,这样做:
<script src="_framework/blazor.webassembly.js"></script>
<!--put it below blazor.webassembly.js declaration -->
<script src="js/fbInit.js"></script>
<script src="js/fbLogin.js"></script>
现在在您的“shared/MainLayout.razor”文件中,插入此代码:
protected override async Task OnInitializedAsync()
{
base.OnInitialized();
await JSRuntime.InvokeVoidAsync("fbAsyncInit");
}
记得在启动 razor 文件的代码部分之前注入 IJSRuntime 接口,只需将此依赖项注入插入:
@inject IJSRuntime jsRuntime
@code
{
//all your razor code
}
最后,在您的登录组件或页面中,您的按钮将执行 Facebook 登录,创建此异步方法并从自定义 facebook 按钮的 @onclick 方法调用它:
public async Task FbLoginProcess()
{
await JSRuntime.InvokeAsync<object("fbLogin");
}
如果您想从 javascript 代码中回调您的 c# 代码并传递 facebook 登录结果,请添加此其他方法。
[JSInvokable("FbLoginProcessCallback")]
public static void FbLoginProcessCallback(object result)
{
Console.WriteLine(result);
}
javascript 函数“fbLogin”将 return Facebook Response 对象到您的 C#“FbLoginProcessCallback”函数,您可以随意使用它,也许可以创建一个 httpclient post 请求您自己的 API 或使用 Blazor NavigationManager 重定向到另一个页面或仅将其保存在您的本地存储对象中。
希望这个回答对您有所帮助。
有关 JSInterop 的更多信息,click here!
我不是所有者,但发现了在 jwt 令牌上完全使用 Twitter、Facebook(Google 目前不工作)webassembly 的很好的例子