当前位置: 首页 > 知识库问答 >
问题:

android的Apollo Graphql认证

田谦
2023-03-14

我正在开发一个使用GraphQL作为后端的android应用程序。我的查询和变异部分工作得很好。但我找不到任何证明文件。

那么,如何将用户名和密码传递给服务器并对其进行身份验证呢?

LocalApollo客户端。java:

public class LocalApolloClient {
    private static final String URL = "http://192.168.1.100/graphql/";
    private static ApolloClient apolloClient;
    private static String authHeader = "";


    public static ApolloClient getApolloClient(){
        //HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        //loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(chain -> {
                    Request original = chain.request();
                    Request.Builder builder = original.newBuilder().method(original.method(), original.body());
                    builder.header("Authorization", authHeader);
                    return chain.proceed(builder.build());
                })
                .build();

        apolloClient = ApolloClient.builder()
                .serverUrl(URL)
                .okHttpClient(okHttpClient)
                .build();

        return apolloClient;
    }
}

请注意:

  • 这不是一个重复的问题

所以请证明如果你投反对票。

共有3个答案

南宫森
2023-03-14

试试这个

  1. HTTP服务器可以设置为HTTPS服务器
  2. 服务器还有用户名/密码数据库(密码可能用bcrypt保存)
  3. 客户端打开HTTPS连接,它对服务器进行身份验证(因此需要服务器证书),并且在交换主密钥后,应该对连接进行加密。
  4. 客户端将用户名/密码清空发送给服务器
  5. 服务器对密码运行bcrypt并将其与存储在数据库中的密码进行比较

如果您有任何问题,请参阅此原始帖子。

NB:我个人从未尝试过这个。

丁光华
2023-03-14

如果要使用用户名和密码进行身份验证,必须对用户名和密码进行base64编码,并将其传递给变量authHeader。例如,对于用户名Aladdin和密码OpenSesame,您可以得到以下信息:

private static String authHeader = "Basic QWxhZGRpbjpPcGVuU2VzYW1l";

请参见:https://en.wikipedia.org/wiki/Basic_access_authentication

叶健柏
2023-03-14

您需要在ApolloClient上设置头,而不是在OkHttpClient上。类似这样:

ApolloClient.builder()
            .serverUrl(context.getString(R.string.graphql_base_url))
            .addApplicationInterceptor(object: ApolloInterceptor {
                override fun interceptAsync(
                    request: ApolloInterceptor.InterceptorRequest,
                    chain: ApolloInterceptorChain,
                    dispatcher: Executor,
                    callBack: ApolloInterceptor.CallBack
                ) {
                    val newRequest = request.toBuilder().requestHeaders(RequestHeaders.builder().addHeader("Authorization", "Basic ...").build()).build()
                    chain.proceedAsync(newRequest, dispatcher, callBack)
                }

                override fun dispose() {
                }
            }).build()
 类似资料:
  • 我正在尝试使用Firebase身份验证使用Facebook个人资料唱歌,但我在运行代码时遇到错误: java.lang.IllegalStateException:名称为 [DEFAULT] 的 FirebaseApp 不存在。 这是我的代码。有人能帮我解决那个问题吗?

  • 问题内容: 在我的应用程序中,我有一个“编辑用户详细信息”页面,我想在相应的editText字段中显示当前名称,电子邮件地址等,然后用户可以删除它们并根据需要输入一个新名称。 有没有办法做到这一点?谢谢你的帮助 问题答案: 您可以用来设置EditText字段的当前文本。 例:

  • 我在我的Android应用程序中使用谷歌驱动器我的应用程序自动拍照和上传驱动,但问题是身份验证它要求选择谷歌帐户第一次当我打开应用程序时,我可以编程给出我的凭据并进行身份验证,这样我就可以避免使用UI选择和身份验证的这一步。

  • 我正在为一个新项目使用OkHttp库,它的易用性给我留下了深刻的印象。我现在需要使用基本身份验证。不幸的是,缺少可用的示例代码。我正在寻找一个示例,说明在遇到HTTP 401头时如何将用户名/密码凭据传递给OkAuthenticator。我看到了这个答案: 改装带有基本HTTP身份验证的POST请求:“无法重试流式HTTP正文” 但这并没有让我走得太远。OkHttp github repo上的示例

  • 问题内容: 我已经能够覆盖所有名称以“ android:”为前缀的主题,但是Android themes.xml还定义了似乎无法被覆盖的属性。例如: colorTheground是在Theme.Light xml中定义的,但是在此处添加它可以使我 错误。如何为整个应用程序覆盖该样式? 问题答案: 您可以用修改属性(如)的方式覆盖标准属性,只是不要忘记添加如下前缀:

  • 如何将字符串数据(发送到URL。我想在util类中编写一个静态方法来执行此操作。我希望方法签名如下所示 字符串url的格式应该是什么 返回的 String 是来自 服务器的响应,作为 json 数据的字符串表示形式。