身份验证 Apollo Graphql for android

Posted

技术标签:

【中文标题】身份验证 Apollo Graphql for android【英文标题】:Authentication Apollo Graphql for android 【发布时间】:2019-02-25 17:50:42 【问题描述】:

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

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

LocalApolloClient.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 文档

如果您投反对票,请说明理由。

【问题讨论】:

您找到解决方案了吗?我面临同样的身份验证问题。 【参考方案1】:

您需要在 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()

【讨论】:

ApolloClient和OkHttp拦截器有什么区别? @DuncanLuk 我看到的一大区别是 OkHttp 拦截器在底层线程池中执行,而 apollo 拦截器在执行请求的同一线程中执行。因此,apollo 拦截器允许从 Threadlocal 中获取值,例如【参考方案2】:

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

private static String authHeader = "Basic QWxhZGRpbjpPcGVuU2VzYW1l";

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

【讨论】:

【参考方案3】:

试试这个

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

如果您有任何疑问,请参考此original post.

注意:我个人从未尝试过。

【讨论】:

以上是关于身份验证 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 中的身份验证错误?