TL; TR:如何使用facebook SDK 4.4获取在我的应用程序上登录的用户的电子邮件和名称
到目前为止,我已经设法登录工作,现在我可以从应用程序的任何位置获取当前访问令牌.
我如何配置登录视图控制器和Facebook登录按钮:
class LoginViewController: UIViewController, FBSDKLoginButtonDelegate {
@IBOutlet weak var loginButton: FBSDKLoginButton!
override func viewDidLoad() {
super.viewDidLoad()
if(FBSDKAccessToken.currentAccessToken() == nil)
{
print("not logged in")
}
else{
print("logged in already")
}
loginButton.readPermissions = ["public_profile","email"]
loginButton.delegate = self
}
//MARK -FB login
func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
//logged in
if(error == nil)
{
print("login complete")
print(result.grantedPermissions)
}
else{
print(error.localizedDescription)
}
}
func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) {
//logout
print("logout")
}
Run Code Online (Sandbox Code Playgroud)
现在在我的主视图中,我可以获得访问令牌,如下所示:
let accessToken = FBSDKAccessToken.currentAccessToken()
if(accessToken …Run Code Online (Sandbox Code Playgroud) 我不明白为什么他们不是一个明确的教程或指南,所以我希望我的问题可以在这里得到解答.
因此,尝试通过Web Api注册来自Facebook或谷歌的用户.
问题是,在这个RegisterExternal方法上,这一行:
var info = await Authentication.GetExternalLoginInfoAsync();
Run Code Online (Sandbox Code Playgroud)
它返回null,因此返回a BadRequest()
到目前为止我得到了什么:
在Startup.Auth.cs我已经知道了id和秘密,请注意我也尝试过使用Microsoft.Owin.Security.Facebook
var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions
{
AppId = "103596246642104",
AppSecret = "1c9c8f696e47bbc661702821c5a8ae75",
Provider = new FacebookAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, ClaimValueTypes.String, "Facebook"));
return Task.FromResult(0);
}
},
};
facebookOptions.Scope.Add("email");
app.UseFacebookAuthentication(facebookOptions);
app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
{
ClientId = "328779658984-t9d67rh2nr681bahfusan0m5vuqeck13.apps.googleusercontent.com",
ClientSecret = "ZYcNHxBqH56Y0J2-tYowp9q0",
CallbackPath = new PathString("/api/Account/ManageInfo")
});
Run Code Online (Sandbox Code Playgroud)
facebookOptions来源:这篇文章
额外的facebookOptions没有解决问题.
我能够从谷歌和Facebook检索access_token.我也可以使用此access_token进行身份验证api/Account/UserInfo
GET http://localhost:4856/api/Account/UserInfo
in the header:
Authorization: Bearer R9BTVhI0...
Run Code Online (Sandbox Code Playgroud)
哪个回报: …
我遇到了与DataProtectionProvider有关的这个问题,首先我们只有2个.NET Framework项目,现在添加了一个.NET Core项目让我困惑如何执行以下操作:从.NET Framework项目生成密码重置链接,并在.NET Core项目中使用它.两者都使用相同的数据库和用户表,这些表已经相互兼容..NET Framework仍然是Code-First数据库生成中的领先项目.
在两个.NET框架项目中,我使用一个共享代码库,它具有以下代码:
//not sure where I got this from but it is part of the solution for solving
//password link generating and using in two different applications.
public class MachineKeyProtectionProvider : IDataProtectionProvider
{
public IDataProtector Create(params string[] purposes)
{
return new MachineKeyDataProtector(purposes);
}
}
public class MachineKeyDataProtector : IDataProtector
{
private readonly string[] _purposes;
public MachineKeyDataProtector(string[] purposes)
{
_purposes = purposes;
}
public byte[] Protect(byte[] userData)
{
return MachineKey.Protect(userData, _purposes);
} …Run Code Online (Sandbox Code Playgroud) 可能是最常见的问题之一,而我发现的文档和其他一些问题试图为我解决问题,但是我仍然不确定如何解决此问题。
这是我的结构:
应用模块
export function HttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http);
}
@NgModule({
declarations: [
AppComponent
],
imports: [
HttpClientModule,
BrowserModule,
AppRoutingModule,
ContrySelectorModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
})
],
export class AppModule { }
Run Code Online (Sandbox Code Playgroud)
CountrySelectorModule
@NgModule({
declarations: [CountryselectorComponent],
imports: [
CommonModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
})
],
exports: [
CountryselectorComponent
]
})
export class ContrySelectorModule { }
Run Code Online (Sandbox Code Playgroud)
选择模块:
@NgModule({ …Run Code Online (Sandbox Code Playgroud) 不幸的是,我没有在服务器上使用Web Deploy的奢侈.如何在Visual Studio 2015中仅通过FTP更新已更改的文件?
听起来像一个已经回答的问题,对吧?好吧,我发现以前版本的问题没有好的答案但是可以发布单个文件.我仍然没有找到通过FTP发布更改文件的解决方案.这些年来还没有出现吗?
有这个选项允许在发布期间进行预编译.但这对默认设置没有任何影响.
我现在只是在本地发布它,然后使用FileZilla发布它,因为那个提供了一个选项,只有"覆盖更新".最好在VS中实现这种自动化.
是否有可能通过FTP使用Web Deploy的逻辑?
获取操作名称和控制器名称的 MVC 控制器:
public class AuthorizeController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
string actionName = filterContext.ActionDescriptor.ActionName;
string controllerNamespace = filterContext.ActionDescriptor.ControllerDescriptor.ControllerType.FullName;
//..more code
base.OnActionExecuting(filterContext);
}
}
Run Code Online (Sandbox Code Playgroud)
非常简单。
但是当我有一个 ApiController ( System.Web.Http.ApiController) 时,事情就变得更复杂了:
最终,在一些更清晰的技巧的帮助下,我能够将其减少到“几行”。
private string GetActionName(HttpControllerContext context)
{
var httpRouteDataCollection = context.RouteData.Values.Values;
var httpRouteDataCollection2 = httpRouteDataCollection.FirstOrDefault();
if (!(httpRouteDataCollection2 is IHttpRouteData[] httpRouteData))
{
return null;
}
IHttpRouteData routeData = httpRouteData.FirstOrDefault();
var httpActionDescriptorCollection = routeData?.Route.DataTokens["actions"];
if (!(httpActionDescriptorCollection is HttpActionDescriptor[] httpActionDescriptor))
{
return null;
}
HttpActionDescriptor reflectedHttpActionDescriptor = httpActionDescriptor.FirstOrDefault();
return …Run Code Online (Sandbox Code Playgroud) I got this wierd error today and I can't solve it, obviously. I've created an entire ASP.NET API, which works just fine, no trouble. Now I want to add some MVC pages to the application. ASP.NET API automatically gives you one controller, (home controller) with the default asp.net page.
Now when I try to open this page, I browse to http://localhost:26264/home.
First I got the error with System.Web.MVC reference:
Could not load file or assembly 'System.Web.Mvc, Version=5.2.2.0... I solved …
我正在使用Conveyor(一个 Visual Studio 2019 扩展)让我的 ASP.NET Core 可用于 android 模拟器。到目前为止,这一直很有效。我已经开发了 Xamarin 应用程序、UWP 应用程序,并且之前将它用于本机 Android 应用程序,它可以正常工作。但是在当前的 flutter 应用程序中,这不起作用。
Conveyor 确实提供了在 android 设备上安装证书的教程:https : //conveyor.cloud/Help/SSL
按照这些说明操作后,我可以正常加载网页:
这也已在 Windows(运行 Web 应用程序的机器)上完成,但这是由 Conveyor 扩展自动完成的,但是:
我运行此 Dart 代码来调用 API:
未来登录(字符串电子邮件,字符串密码)异步{
var response = await http
.post("$_url/login", body: {email: email, password: password});//_url= https://192.168.0.148:45455/api
if (response.statusCode == 200) {
var token = LoginResult.fromJson(json.decode(response.body));
_authToken = token.token;
return token.token;
}
throw Exception(
"Login failed: ${response.statusCode} body: ${response.body}");
Run Code Online (Sandbox Code Playgroud)
}
发生的异常:
HandshakeException (HandshakeException: Handshake error in client …
当我单击表视图中的一个单元格时,它会打开一个包含以下代码的新视图:
let fullResView : FullResponseViewController = self.storyboard?.instantiateViewControllerWithIdentifier("FullResponseView") as! FullResponseViewController
fullResView.receivedPost = post
self.navigationController?.pushViewController(fullResView, animated: false)
Run Code Online (Sandbox Code Playgroud)
当我按下时,它会增加表格视图和顶部布局指南之间的距离.表示:
层次:
表视图的约束是:
我尝试过以下方法:
在viewWillAppear中设置:
self.responsesTableView.contentOffset = CGPointMake(0, 0)
self.automaticallyAdjustsScrollViewInsets = false
Run Code Online (Sandbox Code Playgroud)
当我按下然后切换到标签栏中的另一个视图,然后再次切换回来时,这确实有效.没有contentOffset它将永远保持这样.
使用 Xcode 7.0 beta, Swift 2.0, IOS 9 支持
我有一个视图控制器,其中包含一个集合视图。里面是一个标题:集合可重用视图,一个集合:集合视图单元格和一个页脚:集合可重用视图。
在标题内,我具有登录、注册或注销的功能。根据单击的按钮,此标题内的视图将被隐藏或不隐藏。现在我要做的最后一件事是重新调整标题视图(集合可重用视图)的框架高度。因为在登录时,RegisterView 和 LoginView 都会被隐藏,这会留下大量的空白空间。
这是我的结构的图像:

我很快注意到我无法向 Collection Reusable View 添加任何约束:(
标题集合可重用视图的所有功能都在一个扩展UICollectionReusableView. 我能读self.frame.height,但我不能写。我似乎能够编辑框架(为什么高度是只读的,而框架不是,苹果?)。然而,这没有效果,甚至self.frame = CGRectZero没有做任何事情。
我注意到在初始化页眉和页脚 ( func collectionView, switch on kind -> UICollectionElementKindSectionHeader) 时,我可以在主 ViewController.swift 中执行此操作,但这不是我想要的,因为它应该在单击按钮时更改。
现在,我将 RegisterView 向上移动(我编辑了代码中的顶部约束)。
c# ×4
swift ×3
asp.net ×2
ios ×2
xcode ×2
android ×1
angular ×1
angular7 ×1
asp.net-core ×1
asp.net-mvc ×1
dart ×1
flutter ×1
ftp ×1
google-oauth ×1
lazy-loading ×1
oauth-2.0 ×1
performance ×1
publish ×1
reference ×1
ssl ×1
swift2 ×1
webdeploy ×1