运行 Sinatra ruby 应用程序 iOS 应用程序使用 ip 的安全性如何

How safe is it to use an ip for running a Sinatra ruby app for an iOS application

我正在构建一个 iOS 应用程序并且我有一个 AWS ec2 实例 运行 一个用于刷新和交换 Spotify SDK 访问令牌的 Sinatra 应用程序,我想知道使用url 例如 http://#someIP:4567 在应用程序本身上。

我知道使用 AWS ec2 实例可以通过将其设置为 https 来保护它,但是如何以同样的方式保护 IP(如果我什至需要这样做)?

这是 ruby 文件中的内容:

require 'sinatra'
require 'net/http'
require 'net/https'
require 'base64'
require 'encrypted_strings'
require 'json'

set :bind, '0.0.0.0'

CLIENT_ID = ENV['TheClientIDGivenBySpotify']
CLIENT_SECRET = ENV['TheClientSecretGivenBySpotify']
ENCRYPTION_SECRET = ENV['cFJLyifeUJUBFWdHzVbykfDmPHtLKLGzViHW9aHGmyTLD8hGXC']
CLIENT_CALLBACK_URL = ENV['appForSpotify://returnAfterLogin']

SPOTIFY_ACCOUNTS_ENDPOINT = URI.parse("https://accounts.spotify.com")

get '/' do
"Working"    
end

post '/swap' do
    AUTH_HEADER = "Basic " + Base64.strict_encode64(CLIENT_ID + ":" + CLIENT_SECRET)

    # This call takes a single POST parameter, "code", which
    # it combines with your client ID, secret and callback
    # URL to get an OAuth token from the Spotify Auth Service,
    # which it will pass back to the caller in a JSON payload.

    auth_code = params[:code]

    http = Net::HTTP.new(SPOTIFY_ACCOUNTS_ENDPOINT.host, SPOTIFY_ACCOUNTS_ENDPOINT.port)
    http.use_ssl = true

    request = Net::HTTP::Post.new("/api/token")

    request.add_field("Authorization", AUTH_HEADER)

    request.form_data = {
        "grant_type" => "authorization_code",
        "redirect_uri" => CLIENT_CALLBACK_URL,
        "code" => auth_code
    }

    response = http.request(request)

    # encrypt the refresh token before forwarding to the client
    if response.code.to_i == 200
        token_data = JSON.parse(response.body)
        refresh_token = token_data["refresh_token"]
        encrypted_token = refresh_token.encrypt(:symmetric, :password => ENCRYPTION_SECRET)
        token_data["refresh_token"] = encrypted_token
        response.body = JSON.dump(token_data)
    end

    status response.code.to_i
    return response.body
end

post '/refresh' do
    AUTH_HEADER = "Basic " + Base64.strict_encode64(CLIENT_ID + ":" + CLIENT_SECRET)

    # Request a new access token using the POST:ed refresh token

    http = Net::HTTP.new(SPOTIFY_ACCOUNTS_ENDPOINT.host, SPOTIFY_ACCOUNTS_ENDPOINT.port)
    http.use_ssl = true

    request = Net::HTTP::Post.new("/api/token")

    request.add_field("Authorization", AUTH_HEADER)

    encrypted_token = params[:refresh_token]
    refresh_token = encrypted_token.decrypt(:symmetric, :password => ENCRYPTION_SECRET)

    request.form_data = {
        "grant_type" => "refresh_token",
        "refresh_token" => refresh_token
    }

    response = http.request(request)

    status response.code.to_i
    return response.body

end

在 xcode 我会 POST 到 http://#someIP:4567/swaphttp://#someIP:4567/refresh

这样做安全吗? 我处理得对吗? 通过将请求发送到任何人都可以访问的 IP,我是否会让我自己和其他使用该应用程序的人处于信息被盗或被查看的危险之中?

HTTPS 仅适用于域名。不适用于 IP。如果你只使用 IP,那么你就会受到 MITM 攻击,你的所有数据都是纯文本。任何人都可以窃听您的请求。您在交换请求中有一个代码参数,我猜代码的凭据是否正确?如果是,最好获取一些域名并使用 aws route53 进行设置。然后购买一些便宜的 SSL 证书将其与域相关联。然后在 iOS 端,启用 HTTPS 而不是 HTTP 来与您的服务器通信。这与您的 Sinatra 应用程序无关。

要了解有关 SSL/HTTPS 的更多信息,您可以查看一些初学者教程,例如:http://www.hongkiat.com/blog/ssl-certs-guide/