Xamarin.Forms OAuth 令牌身份验证
Posted
技术标签:
【中文标题】Xamarin.Forms OAuth 令牌身份验证【英文标题】:Xamarin.Forms OAuth Token authentication 【发布时间】:2019-08-08 08:03:08 【问题描述】:我试着按照你的建议去做(在下面回答)。不幸的是我仍然有这个问题。 这是我的新 TokenService.cs: 类令牌服务
TokenKeeper tokenkeeper;
public TokenService()
tokenkeeper = new TokenKeeper();
public async void AwaitGetToken()
tokenkeeper = new TokenKeeper();
tokenkeeper = await GetToken();
private async Task<TokenKeeper> GetToken()
string stringuri = string.Format("0/token", RestAccess.HostUrl);
var dict = new Dictionary<string, string>();
dict.Add("grant_type", "password");
dict.Add("username", RestAccess.User);
dict.Add("password", RestAccess.Pass);
dict.Add("client_id", RestAccess.Client_ID);
dict.Add("client_secret", RestAccess.Client_secret);
tokenkeeper=new TokenKeeper();
var httpclient = new HttpClient();
try
var req = new HttpRequestMessage(HttpMethod.Post, stringuri) Content = new FormUrlEncodedContent(dict) ;
var res = await httpclient.SendAsync(req);
if (res.IsSuccessStatusCode)
var content = await res.Content.ReadAsStringAsync();
tokenkeeper = JsonConvert.DeserializeObject<TokenKeeper>(content);
return tokenkeeper;
return tokenkeeper;
catch
return tokenkeeper;
finally
httpclient.CancelPendingRequests();
httpclient.Dispose();
我的 tokenkeeper 是简单的类:
public class TokenKeeper
public string access_token get; set;
public string refresh_token get; set;
public TokenKeeper()
access_token = "";
refresh_token = "";
在我的调用代码中,我的代码如下:
...
tokenservice.AwaitGetToken();
GetXFMapUserFromAzureAndSetVariable(RestAccess.User);
_navigationService.NavigateAsync("ZleceniaListContentPage", par);
...
tokenservice.AwaitGetToken() 和 GEtXFMapUserFromAzureAndSetVariable(RestAccess.User) 它们是相似的。两者都在等待,但 tokenservice.AwaitGetToken() 是 POST,而 GEtXFMapUserFromAzureAndSetVariable 是 GET。 GEtXFMapUserFromAzureAndSetVariable 工作正常,但如果我调用 tokenservice.AwaitGetToken() 应用程序会在继续之前获取令牌。最后,指令 GEtXFMapUserFromAzureAndSetVariable 正在完成 tokenservice.AwaitGetToken() 响应。
我如何才能等待调用 GEtXFMapUserFromAzureAndSetVariable 直到收到来自 tokenservice.AwaitGetToken() 的回复???
【问题讨论】:
查看方法定义GetTokenPublic
n TokenService
类,我假设你没有等待令牌获取,等待它直到你得到响应。
【参考方案1】:
删除你的AwaitGetToken
方法,没用。
现在将 GetToken
方法设为 public 并使用 await 调用它:
await tokenService.GetToken();
await GetXFMapUserFromAzureAndSetVariable(RestAccess.User);
await _navigationService.NavigateAsync("ZleceniaListContentPage", par);
基本上,您总是需要等待返回 Task
的方法,否则它将以并行方式运行,您的代码将失去一致性。
您似乎对Task
和async/await
感到很困惑,我强烈建议您阅读有关它的教程和文档:
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/
【讨论】:
我做了这个,但可能是问题,因为我调用 tokenService.GetToken() 的方法是绑定方法,它导航到下一个视图。它被声明为 public void GoToZleceniaListContentPageNavigation()。而且我在使用 await tokenService.GetToken() 时遇到问题 - 这是不正确的。因此我创建了 tokenservice.AwaitGetToken()。我不能那样做吗?此 GetXFMapUserFromAzureAndSetVariable(RestAccess.User) 工作正常。它是相似的。谢谢。 对不起,伙计,我一个字都听不懂。我只能建议您了解有关任务的更多信息。您似乎错过了很多整体逻辑。 非常感谢 :-) 我再次跟踪代码,发现了一个愚蠢的错误。我纠正了它,你所有的提示都有效!!谢谢以上是关于Xamarin.Forms OAuth 令牌身份验证的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Xamarin Forms iOS-App 中接收 ASPN 令牌
Xamarin.Auth:使用身份提供者对用户进行身份验证 [xamarin forms - Android]
无法使用 Xamarin.Forms WebView 进行 Dropbox 身份验证