身份验证Apollo Graphql for android

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了身份验证Apollo Graphql for android相关的知识,希望对你有一定的参考价值。

我正在开发一个使用GraphQL作为后端的android应用程序。我有查询和变异部分完美的工作。但是我找不到任何用于身份验证的文档。

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

local Apollo client.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;
    }
}

请注意 :

  • 这不是一个重复的问题
  • graphQl没有适当的文档

如果你投反对票,请善意。

答案

您需要在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()
另一答案

如果要使用用户名和密码进行身份验证,则必须使用base64编码用户名和密码并将其传递给变量authHeader。例如,对于用户名Aladdin和密码OpenSesame,你得到这个:

private static String authHeader = "Basic QWxhZGRpbjpPcGVuU2VzYW1l";

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

另一答案

试试这个

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

如果您有任何疑虑,请参阅此original post.

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

以上是关于身份验证Apollo Graphql for android的主要内容,如果未能解决你的问题,请参考以下文章

graphql_devise 用于 Rails/Graphql/Apollo/React 中的身份验证。 “字段需要身份验证”错误

Firestore 云功能 apollo graphql 身份验证

React、Apollo 2、GraphQL、身份验证系统

反应 apollo graphql 和谷歌身份验证流程

React、Apollo 2、GraphQL、身份验证。登录后如何重新渲染组件

graphql + apollo-server-express,如何处理 express authMiddleware 中的身份验证错误?