我在appspot上有一个应用程序,可以通过常规浏览器正常工作,但是当通过Android WebView使用时,它无法设置和读取cookie.我不是想在这个Web应用程序BTW"外面"获取cookie,一旦WebView访问了URL,所有处理,ID等都可以保留在那里,我所需要的只是该应用程序内的会话管理.第一个屏幕也加载正常,所以我知道WebView +服务器的交互性没有被破坏.
我查看了WebSettings类,没有像setEnableCookies这样的调用.
我加载这样的url:
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WebView webview = new WebView(this);
setContentView(webview);
webview.loadUrl([MY URL]);
}
..
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我的问题有点复杂所以请耐心等待,因为我试图很好地说明我正在努力解决的问题.
目标
有一个ASP.NET网站,允许用户通过用户名/密码或社交(Facebook,Twitter,谷歌等)注册和登录也有API.需要锁定此API [Authorize].API需要能够通过用户名/密码或社交(Facebook,Twitter,Google等)登录的移动客户端(Android,iOS等)访问.
背景
所以我做了一些网站,可以从我的目标做一两件事,但不是全部.在线项目中有一些很好的例子,并在VS项目的示例中构建,这些示例展示了如何让用户通过社交应用程序注册和登录,但它们仅适用于网站而非移动设备.我做了一个网站,Android应用程序使用用户名/密码对该API进行身份验证,但没有任何OAuth或社交凭据.
我开始使用此页面作为参考,但我不知道如何使用它并使其适用于我的网站登录和我的移动应用程序登录.
这家伙听起来很容易,但没有显示任何代码.
题
是否有可以让我实现目标的教程或GitHub示例?我基本上想要一个人们可以注册用户名/密码或使用他们的社交帐户的网站,并让用户通过移动设备进行相同的操作(注册和登录).移动设备基本上只使用API来推送/拉取数据,但我不确定如何将社交登录与我的API结合使用.我假设我需要使用OAuth并走这条路线,但我找不到任何好的例子来说明如何为网络和移动设备做这件事.
或者也许正确的解决方案是让网页都是cookie auth,API是一个单独的"网站",并且都是令牌身份验证,它们都绑定到同一个数据库?
在asp.net身份的facebook身份验证流程中,facebook oauth对话框将代码而不是访问令牌附加到redirect_url,以便服务器可以通过此代码交换此代码http://localhost:49164/signin-facebook?code=...&state=....
我的问题是我的客户端是一个使用facebook sdk的移动应用程序,它直接给了我一个访问令牌.Facebook说使用sdk总是给你一个访问令牌,所以我可以直接给web api访问令牌吗?
我知道这不是很安全,但它是否可能?
facebook facebook-android-sdk facebook-ios-sdk asp.net-web-api
我不明白为什么他们不是一个明确的教程或指南,所以我希望我的问题可以在这里得到解答.
因此,尝试通过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)
哪个回报: …
我在asp.net web API中成功使用了承载令牌身份验证,如默认单页面应用程序模板中所示.但现在我想从不同的站点(不同的URL)使用相同的Web API.
当我从不同的站点向web API AuthorizeEndpoint(默认/ api/Account/ExternalLogin)发出请求时,出现错误:invalid_request.我想问题出在redirect_uri值中,因为将其更改为与web api在同一域上运行的站点的值可以解决问题.
应用程序OAuthAuthorizationServerProvider中的ValidateClientRedirectUri方法不会被触发.因此,基于我在Katana源中的搜索,错误来源位于OAuthAuthorizationServerHandler.InvokeAuthorizeEndpointAsync中.
有没有其他人有同样的问题或我做错了什么?
我正在尝试让我的Android应用程序登录到我的WebAPI服务.我想分享我的想法以验证它们.
如果通过WebSite访问WebAPI,则步骤如下:
1-调用WebAPI方法登录
2- WebAPI将客户端重定向到Facebook
3- Facebook登录并返回令牌
4-如果我在下次调用中使用该令牌,我将被认证为正确的用户.
这很有效.
如果通过Android APP访问WebAPI,我该如何获得访问令牌?其实我做的事情如下:
1-通过登录按钮联系Facebook
2-获取记录ID到Facebook接收令牌
3-尝试执行WebAPI调用,将Authentication:Bearer CODE添加到我的呼叫中
那时我正在徘徊..
我的应用程序现在如何才能成为特定用户?如果我执行类似的事情
GET /API/METHOD1
Authentication: Bearer CODE
Run Code Online (Sandbox Code Playgroud)
如果Android应用程序从未告诉过他,怎么知道代码是我?该应用程序是否会自动联系Facebook,以便收到"是啊!我发布该令牌,它与...相关"的答案.
或者我误解了一切?
我能弄明白的另一种方式是我必须使用"混合方法",如:
1-呼叫WebAPI(通过浏览器)2-获取重定向链接到Facebook 3-获取令牌
但是..那时,我怎么能再次在Facebook App/Facebook Site和我的Android应用程序之间切换?
对不起,我试图找出这个身份验证过程旁边的逻辑.
在过去的两天里,我一直在绞尽脑汁,试图了解如何使用内置于Google.NET的ASP.NET WebAPI 2中的身份验证作为外部身份验证,而对OAuth 2并不熟悉,我很失落。我已经按照本教程设置了Android客户端上的登录按钮,并将“ idToken”发送到Web API。我还按照本教程(现在已过时)中的说明将Google设置为外部登录名。
当我尝试发送它{"error":"unsupported_grant_type"}作为响应时,就会发生问题。其他一些教程使我相信,mysite.com / token的POST不包含正确的数据。这意味着我要么在客户端上错误地构建了请求,要么以某种方式在后端上不正确地处理了请求,将其发送到错误的url,或者我在做其他完全错误的事情。
我找到了这个答案,说是从/ api / Accounts / ExternalLogins获取URL,但是登录按钮已经给了我提供给我的访问令牌(如果我正确理解的话)。
如果有人可以帮助我解决从头到尾的确切流程,那就太好了。
更新:好的,这是自问这个问题以来我学到的一些东西。
website.com/token URI是WebAPI2模板中内置OAuth服务器的重定向。这对于此特定问题没有用。
id_token是已编码的JWT令牌。
website.com/signin-google URI是正常Google登录名的重定向,但不接受这些令牌。
我可能必须编写自己的AuthenticationFilter,它使用Google客户端库通过Google API进行授权。
更新2:我仍在努力获取AuthenticationFilter实现。此时一切似乎进展顺利,但我在某些事情上陷于困境。我一直在使用此示例获取令牌验证代码,并在本教程中获取AuthenticationFilter代码。结果是两者的混合。完成后,我会将其发布在此处作为答案。
这是我目前的问题:
产生一个IPrincipal作为输出。验证示例创建了ClaimPrincipal,但是AuthenticationFilter示例代码使用UserManager将用户名与现有用户进行匹配,并返回该主体。验证示例中创建的ClaimsPrincipal不会直接与现有用户自动关联,因此我需要尝试将声明的某些元素与现有用户进行匹配。那我该怎么做呢?
对于什么合适的流程,我还是个不完整的想法。我目前正在使用Authentication标头通过自定义方案“ goog_id_token”传递我的id_token字符串。客户端必须使用此自定义AuthenticationFilter为API上调用的每个方法发送其id_token。我不知道通常如何在专业环境中完成此操作。似乎很常见的用例是会有大量的信息,但是我还没有看到。我已经看到了正常的OAuth2流程,由于我仅使用一个ID令牌,而不使用访问令牌,所以我对于应该使用的ID令牌,它属于流的位置以及使用它的方式有点困惑应该放在HTTP数据包中的位置。而且因为我不知道这些事情,所以我一直在努力地进行弥补。
authentication asp.net-mvc android asp.net-web-api google-oauth