相当于在没有浏览器的Mobile app上存储cookie

Equivalent to storing cookie on Mobile application without browser

我想知道在移动应用程序上存储密钥以进行会话身份验证的机制。我有一个 Tornado 网络服务器,它将使用第三方外部服务来对用户进行身份验证,例如Facebook 或 Google。我熟悉在使用浏览器时使用 set_secure_cookie 存储 cookie。但是,如果移动应用程序现在正在连接并进行身份验证怎么办。我将使用什么机制来存储 secret 之类的安全 cookie,以便将来进行会话身份验证?下面显示了验证用户的代码:

class GoogleOAuth2LoginHandler(tornado.web.RequestHandler,
                               tornado.auth.GoogleOAuth2Mixin):
    async def get(self):
        if self.get_argument('code', False):
            user = await self.get_authenticated_user(
                redirect_uri='http://your.site.com/auth/google',
                code=self.get_argument('code'))
            # Save the user with e.g. set_secure_cookie
        else:
            await self.authorize_redirect(
                redirect_uri='http://your.site.com/auth/google',
                client_id=self.settings['google_oauth']['key'],
                scope=['profile', 'email'],
                response_type='code',
                extra_params={'approval_prompt': 'auto'})

如何为不依赖浏览器和 cookie 支持的移动应用程序修改此设置?

我不知道这是否是您正在寻找的,但您可以使用 SharedPreferences 系统,它非常简单并且允许在本地保存密钥对值以存储任何有用的信息。

有了 Android,您可以使用 SharedPreferences or the EncryptedSharedPreferences 添加额外的安全层…

而对于 iOS,您拥有大致相同的机制,称为 NSUserDefaults,它也允许存储密钥对值,还允许额外的安全层。

在iOS中,NSHTTPCookieclass中有一个API,可以保存整个http响应字符串。 代码将类似于下面创建 cookie 的内容。

if let requestUrl = url {
            let httpCookies = HTTPCookie.cookies(withResponseHeaderFields: response.allHeaderFields as! [String : String], for: requestUrl)
        }

然后就可以保存cookie了,

HTTPCookieStorage.shared.setCookies(httpCookie, for: url, mainDocumentURL: url)

如果需要,您还可以访问此 cookie 并将其设置到 WebView。