One problem is that you’re hooking in too early. Reference the Hooks API Action Reference. Template conditionals such as is_page() are only available after the query has been set up and parsed. The earliest action that you can usually safely rely on query conditionals is pre_get_posts. You’re hooking into init, which fires much earlier:
muplugins_loadedAfter must-use plugins are loadedregistered_taxonomyFor category, post_tag, etc.registered_post_typeFor post, page, etc.plugins_loadedAfter active plugins and pluggable functions are loadedsanitize_comment_cookiessetup_themeload_textdomainFor the default domainafter_setup_themeGenerally used to initialize theme settings/options.auth_cookie_malformedauth_cookie_validset_current_userinitTypically used by plugins to initialize. The current user is already authenticated by this time.widgets_initUsed to register sidebars. This is fired at ‘init’, with a priority of 1.register_sidebarFor each sidebar and footer areawp_register_sidebar_widgetFor each widgetwp_default_scripts(ref array)wp_default_styles(ref array)admin_bar_initadd_admin_bar_menuswp_loadedAfter WordPress is fully loadedparse_requestAllows manipulation of HTTP request handling (ref array)send_headersAllows customization of HTTP headers (ref array)parse_query(ref array)pre_get_postsExposes the query-variables object before a query is executed. (ref array)posts_selectionwpAfter WP object is set up (ref array)template_redirectget_headerwp_enqueue_scripts
Given the nature of what you’re trying to do, I would recommend hooking into template_redirect.