我在Azure AD中配置了一个B2C服务,并将Google作为身份验证提供商,但却发现Google不允许通过嵌入式Web视图进行身份验证请求.然后我找到了AppAuth但是我在使用示例iOS应用程序时遇到了很多困难.
我遇到的问题与重定向uri有关.使用AAD为本机应用程序提供重定向uri会导致Safari Mobile出错.我尝试添加一个自定义重定向uri,它将重定向到我的iOS应用程序,但不能,因为它在azure广告配置中验证失败,因为它不在https url方案中.
是否可以将AppAuth与Azure AD B2C一起使用?有没有办法正确配置它或是否需要在MS端进行更改?
编辑
我有Azure AD B2C设置和工作,包括谷歌帐户登录.这在Web浏览器中按预期工作,但是当我尝试使用嵌入式webview从iOS登录Google时,我得到disallowed_useragent.研究这个我遇到了AppAuth库,我认为这是一个安全的选择解决方案,除了由于重定向问题它无法与B2C一起工作,或者至少我没有找到一种方法来使这项工作.
我希望我能够在B2C中提供我在iOS上的应用程序所独有的重定向URL,以便SFSafariViewController可以重定向回我的应用程序.在B2C中使用Web配置似乎是正确的方法,但它需要使用https而不是自定义方案.
有没有办法为自定义重定向URI配置B2C?
我正在尝试使用我的iOS应用和Rails网络应用设置Google OAuth.我在API控制台中设置了2个单独的客户端(当然有不同的客户端ID,但具有相同的前缀).一个用于iOS应用程序,另一个用于Web应用程序(也有一个client_secret.我想在iOS上使用AppAuth SDK获取用户的身份验证代码,然后将其发送到我的Web应用程序,然后执行交换访问令牌.
首先,这听起来像是一件合理的事情,还是不可能在这样的客户之间拆分交易?
我的第一次尝试是只使用auth代码并执行交换,但是由于missing_code_verifier invalid_grant错误而失败,所以我也传递了相同的code_verifierAppAuth用于获取auth代码到我的服务器,并修复了该错误.首先,是否有必要将此代码验证程序传递给服务器?似乎有点奇怪.
现在,它失败并出现unauthorized_client错误.我的网络应用程序正在发出如下请求:
{
"grant_type"=>"authorization_code",
"code"=>"4/XYZ...",
"client_id"=>"WEB_APP_CLIENT_ID_HERE.apps.googleusercontent.com",
"client_secret"=>"WEB_APP_CLIENT_SECRET_HERE",
"redirect_uri"=>"https://www.myapp.com/oauth_callback",
"parse"=>"json",
"code_verifier"=>"CODE_VERIFIER_STRING_HERE"
}
Run Code Online (Sandbox Code Playgroud)
看看这样的帖子:
看起来这redirect_uri可能是一个问题.我在iOS上的AppAuth配置将重定向URI设置为com.googleusercontent.apps.iOS_CLIENT_ID_HERE,并且Info.plistURL方案也是如此.API控制台中的Web应用程序的"授权重定向URI"部分有一堆Web URL,我也添加了com.google...它.这个配置不正确吗?是redirect_uri做跨客户端身份验证时,重要吗?
任何帮助是极大的赞赏!到目前为止,我所有的试错都没有结果:(
尝试访问应用程序身份验证网址时出现以下错误。
E/AppAuth: Network error检索发现文档时。
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found。
我们最近将 AppAuth 集成到我们的应用程序中,以自动化 OAuth2 授权代码流。当用户想要登录时,他首先被重定向到我们的身份验证服务器,在那里他继续登录,然后被重定向回应用程序。
我们使用 chrome-custom-tabs 打开登录页面(AppAuth)。问题是它有时会卡在空白屏幕上(chrome 选项卡只显示空白页面,而没有呈现的站点或重定向)。当用户已经在浏览器中有一个会话时会发生这种情况,因此选项卡应该自动关闭并将用户重定向回应用程序(经过身份验证)。它的行为不一致,我们有时只会遇到这个问题(~50/50)。
我很高兴添加一些代码,但不知道从哪里开始(试图避免文本墙)。是否存在已知问题或警告?
我们尝试按照此处所述切换上下文,但一直遇到相同的问题。
我正在使用 AppAuth 库,我希望它使用自定义选项卡,但它永远不会在支持 Play 商店的模拟器上或在我的运行 Oreo 的 HTC U11 设备上使用。Chrome 已安装。我尝试了很多配置但没有运气。
val authService = AuthorizationService(applicationContext)
val authIntent = authService.getAuthorizationRequestIntent(authRequest,
authService.createCustomTabsIntentBuilder(Uri.parse(authorizationManager.openIdConfig!!.authorization_endpoint)).build())
startActivityForResult(authIntent, REQUEST_AUTH)
Run Code Online (Sandbox Code Playgroud)
我尝试使用和不使用 createCustomTabsIntentBuilder,无论哪种方式,结果都完全相同。图我缺少最后一块秘密武器,只是不知道它是什么。
一切工作正常,我确实获得了授权,其余代码工作正常,它只是始终使用外部浏览器。
** 已解决 ** 当前的 AppAuth 库不支持 AndroidX。我提取了该库的代码,将其作为模块添加到我的应用程序中,将代码更新为 AndroidX 并更改了一行以使用正确的 CustomTab 字符串,现在一切都按预期工作。
BrowserSelector.java 第 187 行现在是
serviceIntent.setAction(CustomTabsService.ACTION_CUSTOM_TABS_CONNECTION);
Run Code Online (Sandbox Code Playgroud) 我想在 iOS 应用程序中通过 OpenID-Connect 实现登录。AppAuth-SDK 似乎是这样做的标准方法。下载一些示例后,我有点困惑。所有 AppAuth 示例和教程都使用 WebView,用户在其中输入用户名和密码。我想制作一个本机登录屏幕,用户必须在其中输入用户名和密码。AppAuth 是否可以做到这一点?我读到了一些关于“资源所有者密码授予”和“客户端秘密”的内容。这就是我需要的吗?
如果有人能把我推向正确的方向,我将非常感激。
我正在将我的 Android 应用程序设置为使用身份验证,并且正在遵循 Android 的 AppAuth 文档。到目前为止,我已经能够连接并向身份服务器发出请求,并收到包含我在请求中发送的大部分数据等的响应。我应该用我的代码交换访问令牌。这是我的问题。我实际上是在 github 页面https://github.com/openid/AppAuth-Android上复制并粘贴代码,但它因上述错误而崩溃。我对 Android 比较陌生,这是我的第一个问题,如果我没有很好地提出我的问题,请对我宽容一些。谢谢。
Android Studio 表示导致此错误的代码是“authService.performTokenRequest()”。我环顾四周,有些人通过在“onDestroy()”中调用“authService.dispose()”解决了这个问题,但也因“执行 doInBackground() 时发生错误”而崩溃。下面是导致错误的代码。
authService.performTokenRequest(
resp.createTokenExchangeRequest(),
new AuthorizationService.TokenResponseCallback() {
@Override public void onTokenRequestCompleted(
TokenResponse resp, AuthorizationException ex) {
if (resp != null) {
// exchange succeeded
} else {
// authorization failed, check ex for more details
}
}
});
Run Code Online (Sandbox Code Playgroud)
在我的“onCreate()”中,我是这么称呼它的。
AuthorizationResponse resp = AuthorizationResponse.fromIntent(getIntent());
AuthorizationException ex = AuthorizationException.fromIntent(getIntent());
authState = new AuthState(resp, ex);
authorizationService = new AuthorizationService(this);
authorizationService.performTokenRequest(
resp.createTokenExchangeRequest(),
new AuthorizationService.TokenResponseCallback() {
@Override public void …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 FormidableLab 的react-native-app-auth库在我的 react native android 应用程序中实现 Google OAuth 2 登录,如下所示:
googleLoginPressed = async () => {
const config = {
serviceConfiguration: {
authorizationEndpoint: 'https://accounts.google.com/o/oauth2/v2/auth', tokenEndpoint: 'https://accounts.google.com/o/oauth2/v2/auth',
},
clientId: app_params.GOOGLE_CLIENT_ID, redirectUrl: 'https://<my_domain>/oauth/google',
scopes: ['openid', 'profile', 'email'], additionalParameters: { 'response-type': 'code' },
};
try {
const result = await authorize(config);
} catch (error) {
console.log(error);
}
}
Run Code Online (Sandbox Code Playgroud)
这会使用 Google 的登录页面调用 Web 视图,我可以成功验证自己的身份。然后 Google 正确地重定向到我的 oauth 回调端点,并code像它应该的那样在重定向 url 中填充 oauth 。在这一点上,我希望react-native-app-auth将控制权从 webview 恢复到应用程序。相反,Web 视图在重定向 url 页面上保持打开状态。 …
I have local instance of keylcoak and I am trying to connect my flutter app to it and for that I am following the this tutorial but I got stuck on this redirect_uri issue.
In android's build.gradle I have added the following piece to default config:
applicationId = 'com.my.example_app'
manifestPlaceholders = [
'appAuthRedirectScheme': 'com.my.example_app'
]
Run Code Online (Sandbox Code Playgroud)
In the code I have:
const REDIRECT_URI = 'com.my.example_app://login-callback';
//some code in between
final AuthorizationTokenRequest req = AuthorizationTokenRequest(
CLIENT_ID,
REDIRECT_URI,
allowInsecureConnections: true,
issuer: ISSUER,
discoveryUrl: …Run Code Online (Sandbox Code Playgroud) 我已经阅读了这篇关于如何开始在 Flutter 中使用 Auth0 的文章。
作者写道:“ ……完整的安全注销超出了本文的范围”。
文章中的注销方法是这样的:
void logoutAction() async {
await secureStorage.delete(key: 'refresh_token');
setState(() {
isLoggedIn = false;
isBusy = false;
});
Run Code Online (Sandbox Code Playgroud)
}
我从设备上的安全存储中删除了刷新令牌。现在,我希望能够进行更完整的注销,该用户必须使用用户名和密码再次进行完整登录。目前,用户无需输入用户名和密码即可登录,我认为这是由于访问令牌保存在某处。如果这是由于访问令牌造成的,我如何从浏览器 cookie 或存储它的任何位置删除此访问令牌?
避免存储访问令牌的一种方法是添加promptValues: ['login]到登录方法中。这样做的问题是用户每次都必须登录,因此完全消除了存储的访问令牌的好处。再次强调,我希望用户能够“完全”注销,从 cookie 中清除访问令牌。
Future<void> loginAction() async {
setState(() {
isBusy = true;
errorMessage = '';
});
try {
final AuthorizationTokenResponse result =
await appAuth.authorizeAndExchangeCode(
AuthorizationTokenRequest(
AUTH0_CLIENT_ID,
AUTH0_REDIRECT_URI,
issuer: 'https://$AUTH0_DOMAIN',
scopes: ['openid', 'profile', 'offline_access'],
// promptValues: ['login']
),
);
final idToken = parseIdToken(result.idToken);
final profile = await getUserDetails(result.accessToken); …Run Code Online (Sandbox Code Playgroud) appauth ×10
android ×4
flutter ×2
google-oauth ×2
ios ×2
oauth-2.0 ×2
access-token ×1
auth0 ×1
keycloak ×1
react-native ×1